From 6345b3e8c6e3b90870d677b6e9ba3d99b535d711 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Sun, 10 Sep 2017 14:26:26 +0200 Subject: [PATCH] Rewrote the project in Kotlin --- .gitignore | 22 +- .gitmodules | 3 - AndroidSlidingUpPanel | 1 - COPYING.GPL.md | 596 ----------- README.md | 107 -- app/.gitignore | 1 + app/build.gradle | 207 ---- app/build.gradle.kts | 559 ++++++++++ app/proguard-rules.pro | 78 +- .../ExampleInstrumentedTest.kt | 22 + app/src/beta/res/mipmap-hdpi/ic_launcher.png | Bin 3625 -> 0 bytes app/src/beta/res/mipmap-mdpi/ic_launcher.png | Bin 2155 -> 0 bytes app/src/beta/res/mipmap-xhdpi/ic_launcher.png | Bin 5244 -> 0 bytes .../beta/res/mipmap-xxhdpi/ic_launcher.png | Bin 8754 -> 0 bytes .../beta/res/mipmap-xxxhdpi/ic_launcher.png | Bin 12672 -> 0 bytes app/src/beta/res/values/colors.xml | 26 - app/src/beta/res/values/strings.xml | 24 - app/src/debug/res/mipmap-hdpi/ic_launcher.png | Bin 3695 -> 0 bytes app/src/debug/res/mipmap-mdpi/ic_launcher.png | Bin 2215 -> 0 bytes .../debug/res/mipmap-xhdpi/ic_launcher.png | Bin 5299 -> 0 bytes .../debug/res/mipmap-xxhdpi/ic_launcher.png | Bin 8677 -> 0 bytes .../debug/res/mipmap-xxxhdpi/ic_launcher.png | Bin 12655 -> 0 bytes app/src/debug/res/values/colors.xml | 26 +- app/src/debug/res/values/strings.xml | 24 - app/src/main/AndroidManifest.xml | 207 +--- .../de/kuschku/libquassel/BusProvider.java | 93 -- .../de/kuschku/libquassel/CoreConnection.java | 359 ------- .../kuschku/libquassel/IProtocolHandler.java | 78 -- .../kuschku/libquassel/ProtocolHandler.java | 179 ---- .../de/kuschku/libquassel/QuasselClient.java | 83 -- .../de/kuschku/libquassel/client/AClient.java | 110 -- .../libquassel/client/BufferManager.java | 200 ---- .../de/kuschku/libquassel/client/Client.java | 495 --------- .../kuschku/libquassel/client/ClientData.java | 75 -- .../libquassel/client/FeatureFlags.java | 52 - .../libquassel/client/IdentityManager.java | 84 -- .../libquassel/client/NetworkManager.java | 138 --- .../de/kuschku/libquassel/client/QClient.java | 86 -- .../libquassel/events/BacklogInitEvent.java | 39 - .../events/BacklogReceivedEvent.java | 34 - .../libquassel/events/BufferChangeEvent.java | 25 - .../events/CertificateAcceptedEvent.java | 32 - .../events/ConnectionChangeEvent.java | 58 -- .../events/CoreSetupFailedEvent.java | 41 - .../events/CoreSetupRequiredEvent.java | 25 - .../events/CoreSetupSuccessfulEvent.java | 36 - .../libquassel/events/CriticalErrorEvent.java | 50 - .../libquassel/events/GeneralErrorEvent.java | 54 - .../events/HandshakeFailedEvent.java | 41 - .../kuschku/libquassel/events/InitEvent.java | 39 - .../libquassel/events/LagChangedEvent.java | 40 - .../libquassel/events/LoginRequireEvent.java | 30 - .../events/PasswordChangeEvent.java | 40 - .../libquassel/events/StatusMessageEvent.java | 33 - .../events/UnknownCertificateEvent.java | 43 - .../exceptions/SyncInvocationException.java | 41 - .../exceptions/UnknownTypeException.java | 49 - .../libquassel/functions/FunctionType.java | 60 -- .../serializers/FunctionSerializer.java | 34 - .../serializers/HeartbeatReplySerializer.java | 66 -- .../serializers/HeartbeatSerializer.java | 66 -- .../InitDataFunctionSerializer.java | 61 -- .../InitRequestFunctionSerializer.java | 86 -- .../PackedInitDataFunctionSerializer.java | 71 -- .../PackedRpcCallFunctionSerializer.java | 71 -- .../PackedSyncFunctionSerializer.java | 74 -- .../UnpackedInitDataFunctionSerializer.java | 71 -- .../UnpackedRpcCallFunctionSerializer.java | 69 -- .../UnpackedSyncFunctionSerializer.java | 73 -- .../functions/types/HandshakeFunction.java | 40 - .../libquassel/functions/types/Heartbeat.java | 46 - .../functions/types/HeartbeatReply.java | 50 - .../functions/types/InitDataFunction.java | 31 - .../functions/types/InitRequestFunction.java | 46 - .../functions/types/PackedFunction.java | 33 - .../types/PackedInitDataFunction.java | 53 - .../functions/types/RpcCallFunction.java | 53 - .../functions/types/SerializedFunction.java | 29 - .../functions/types/SyncFunction.java | 56 - .../functions/types/UnpackedFunction.java | 33 - .../types/UnpackedInitDataFunction.java | 53 - .../libquassel/localtypes/BacklogFilter.java | 349 ------- .../backlogstorage/BacklogStorage.java | 66 -- .../backlogstorage/HybridBacklogStorage.java | 253 ----- .../libquassel/localtypes/buffers/Buffer.java | 49 - .../localtypes/buffers/Buffers.java | 48 - .../localtypes/buffers/ChannelBuffer.java | 98 -- .../localtypes/buffers/QueryBuffer.java | 100 -- .../localtypes/buffers/StatusBuffer.java | 100 -- .../localtypes/orm/ConnectedDatabase.java | 30 - .../orm/converters/BufferTypeConverter.java | 39 - .../orm/converters/DateTimeConverter.java | 39 - .../orm/converters/MessageFlagsConverter.java | 39 - .../orm/converters/MessageTypeConverter.java | 39 - .../kuschku/libquassel/message/Message.java | 274 ----- .../objects/MessageTypeRegistry.java | 85 -- .../serializers/ClientInitAckSerializer.java | 105 -- .../ClientInitRejectSerializer.java | 79 -- .../serializers/ClientInitSerializer.java | 87 -- .../serializers/ClientLoginAckSerializer.java | 73 -- .../ClientLoginRejectSerializer.java | 83 -- .../serializers/ClientLoginSerializer.java | 82 -- .../serializers/CoreSetupAckSerializer.java | 73 -- .../serializers/CoreSetupDataSerializer.java | 79 -- .../CoreSetupRejectSerializer.java | 79 -- .../serializers/NetworkServerSerializer.java | 100 -- .../objects/serializers/ObjectSerializer.java | 44 - .../serializers/SessionInitSerializer.java | 79 -- .../serializers/SessionStateSerializer.java | 82 -- .../serializers/SetupDataInitializer.java | 86 -- .../serializers/StorageBackendSerializer.java | 87 -- .../StringObjectMapSerializer.java | 82 -- .../libquassel/objects/types/ClientInit.java | 55 - .../objects/types/ClientInitAck.java | 32 - .../objects/types/ClientInitReject.java | 42 - .../libquassel/objects/types/ClientLogin.java | 45 - .../objects/types/ClientLoginAck.java | 35 - .../objects/types/ClientLoginReject.java | 42 - .../libquassel/objects/types/Command.java | 34 - .../objects/types/CoreSetupAck.java | 36 - .../objects/types/CoreSetupData.java | 41 - .../objects/types/CoreSetupReject.java | 42 - .../libquassel/objects/types/CoreStatus.java | 129 --- .../objects/types/NetworkServer.java | 103 -- .../libquassel/objects/types/SessionInit.java | 40 - .../objects/types/SessionState.java | 55 - .../libquassel/objects/types/SetupData.java | 57 -- .../objects/types/StorageBackend.java | 59 -- .../libquassel/primitives/QMetaType.java | 344 ------- .../primitives/QMetaTypeRegistry.java | 299 ------ .../serializers/BoolSerializer.java | 54 - .../serializers/BufferInfoSerializer.java | 64 -- .../serializers/ByteArraySerializer.java | 89 -- .../serializers/ByteSerializer.java | 54 - .../serializers/CharSerializer.java | 59 -- .../serializers/DateTimeSerializer.java | 89 -- .../primitives/serializers/IntSerializer.java | 54 - .../serializers/LongSerializer.java | 54 - .../serializers/MessageSerializer.java | 80 -- .../serializers/PrimitiveSerializer.java | 36 - .../serializers/ProtocolSerializer.java | 61 -- .../serializers/ShortSerializer.java | 54 - .../serializers/StringListSerializer.java | 67 -- .../serializers/StringSerializer.java | 70 -- .../serializers/TimeSerializer.java | 54 - .../serializers/UserTypeSerializer.java | 58 -- .../serializers/VariantListSerializer.java | 69 -- .../serializers/VariantMapSerializer.java | 72 -- .../serializers/VariantSerializer.java | 93 -- .../VariantVariantListSerializer.java | 69 -- .../serializers/VoidSerializer.java | 54 - .../primitives/types/BufferInfo.java | 122 --- .../libquassel/primitives/types/Protocol.java | 49 - .../libquassel/primitives/types/QVariant.java | 93 -- .../libquassel/protocols/DatastreamPeer.java | 336 ------ .../libquassel/protocols/LegacyPeer.java | 252 ----- .../libquassel/protocols/RemotePeer.java | 70 -- .../libquassel/ssl/CertificateManager.java | 49 - .../libquassel/ssl/QuasselTrustManager.java | 96 -- .../ssl/UnknownCertificateException.java | 37 - .../libquassel/syncables/Syncable.java | 36 - .../syncables/SyncableRegistry.java | 87 -- .../kuschku/libquassel/syncables/Synced.java | 29 - .../serializers/AliasManagerSerializer.java | 101 -- .../serializers/BufferSyncerSerializer.java | 81 -- .../BufferViewConfigSerializer.java | 103 -- .../BufferViewManagerSerializer.java | 92 -- .../serializers/CoreInfoSerializer.java | 86 -- .../serializers/IdentitySerializer.java | 116 --- .../IgnoreListManagerSerializer.java | 122 --- .../serializers/IrcChannelSerializer.java | 90 -- .../serializers/IrcUserSerializer.java | 115 --- .../serializers/NetworkConfigSerializer.java | 96 -- .../serializers/NetworkInfoSerializer.java | 135 --- .../serializers/NetworkSerializer.java | 187 ---- .../syncables/types/SyncableObject.java | 146 --- .../types/abstracts/AAliasManager.java | 41 - .../types/abstracts/ABacklogManager.java | 59 -- .../types/abstracts/ABufferSyncer.java | 105 -- .../types/abstracts/ABufferViewConfig.java | 139 --- .../types/abstracts/ABufferViewManager.java | 56 - .../syncables/types/abstracts/ACoreInfo.java | 36 - .../syncables/types/abstracts/AIdentity.java | 172 ---- .../types/abstracts/AIgnoreListManager.java | 70 -- .../types/abstracts/AIrcChannel.java | 123 --- .../syncables/types/abstracts/AIrcUser.java | 188 ---- .../syncables/types/abstracts/ANetwork.java | 257 ----- .../types/abstracts/ANetworkConfig.java | 123 --- .../syncables/types/impl/AliasManager.java | 277 ----- .../syncables/types/impl/BacklogManager.java | 228 ----- .../syncables/types/impl/BufferSyncer.java | 296 ------ .../types/impl/BufferViewConfig.java | 499 --------- .../types/impl/BufferViewManager.java | 147 --- .../syncables/types/impl/CoreInfo.java | 117 --- .../syncables/types/impl/Identity.java | 484 --------- .../types/impl/IgnoreListManager.java | 332 ------ .../syncables/types/impl/IrcChannel.java | 561 ---------- .../syncables/types/impl/IrcUser.java | 507 --------- .../syncables/types/impl/Network.java | 909 ---------------- .../syncables/types/impl/NetworkConfig.java | 193 ---- .../syncables/types/impl/NetworkInfo.java | 376 ------- .../types/interfaces/QAliasManager.java | 78 -- .../types/interfaces/QBacklogManager.java | 82 -- .../types/interfaces/QBufferSyncer.java | 121 --- .../types/interfaces/QBufferViewConfig.java | 212 ---- .../types/interfaces/QBufferViewManager.java | 59 -- .../types/interfaces/QCertManager.java | 43 - .../syncables/types/interfaces/QCoreInfo.java | 36 - .../syncables/types/interfaces/QIdentity.java | 202 ---- .../types/interfaces/QIgnoreListManager.java | 145 --- .../types/interfaces/QIrcChannel.java | 161 --- .../syncables/types/interfaces/QIrcUser.java | 218 ---- .../syncables/types/interfaces/QNetwork.java | 419 -------- .../types/interfaces/QNetworkConfig.java | 122 --- .../types/interfaces/QObservable.java | 30 - .../types/interfaces/QSyncableObject.java | 54 - .../types/invokers/IAliasManager.java | 58 -- .../types/invokers/IBacklogManager.java | 65 -- .../types/invokers/IBufferSyncer.java | 78 -- .../types/invokers/IBufferViewConfig.java | 106 -- .../types/invokers/IBufferViewManager.java | 62 -- .../types/invokers/ICertManager.java | 58 -- .../syncables/types/invokers/IClient.java | 88 -- .../syncables/types/invokers/ICoreInfo.java | 61 -- .../syncables/types/invokers/IIdentity.java | 140 --- .../types/invokers/IIgnoreListManager.java | 65 -- .../syncables/types/invokers/IIrcChannel.java | 100 -- .../syncables/types/invokers/IIrcUser.java | 144 --- .../syncables/types/invokers/INetwork.java | 197 ---- .../types/invokers/INetworkConfig.java | 86 -- .../syncables/types/invokers/Invoker.java | 29 - .../types/invokers/InvokerHelper.java | 45 - .../types/invokers/InvokerRegistry.java | 68 -- .../de/kuschku/quasseldroid_ng/Exceptions.kt | 9 + .../quasseldroid_ng/QuasselDroidNG.java | 75 -- .../kuschku/quasseldroid_ng/QuasseldroidNG.kt | 60 ++ .../persistence/QuasselDatabase.kt | 207 ++++ .../quasseldroid_ng/protocol/ClientData.kt | 11 + .../protocol/HandshakeMessage.kt | 255 +++++ .../quasseldroid_ng/protocol/MetaType.kt | 101 ++ .../protocol/NetworkLayerProtocol.kt | 13 + .../kuschku/quasseldroid_ng/protocol/QType.kt | 19 + .../quasseldroid_ng/protocol/QTypes.kt | 116 +++ .../quasseldroid_ng/protocol/QVariant.kt | 45 + .../protocol/SignalProxyMessage.kt | 172 ++++ .../kuschku/quasseldroid_ng/protocol/Type.kt | 104 ++ .../primitive/serializer/BoolSerializer.kt | 17 + .../serializer/BufferInfoSerializer.kt | 32 + .../serializer/ByteArraySerializer.kt | 29 + .../primitive/serializer/ByteSerializer.kt | 15 + .../primitive/serializer/CharSerializer.kt | 44 + .../serializer/DateTimeSerializer.kt | 73 ++ .../DccConfig_IpDetectionModeSerializer.kt | 18 + .../DccConfig_PortSelectionModeSerializer.kt | 18 + .../HandshakeVariantMapSerializer.kt | 31 + .../serializer/HostAddressSerializer.kt | 48 + .../primitive/serializer/IntSerializer.kt | 15 + .../primitive/serializer/LongSerializer.kt | 15 + .../primitive/serializer/MessageSerializer.kt | 40 + .../serializer/ProtocolSerializer.kt | 23 + .../primitive/serializer/Serializer.kt | 27 + .../primitive/serializer/ShortSerializer.kt | 15 + .../serializer/StringListSerializer.kt | 23 + .../primitive/serializer/StringSerializer.kt | 101 ++ .../primitive/serializer/TimeSerializer.kt | 16 + .../serializer/VariantListSerializer.kt | 27 + .../serializer/VariantMapSerializer.kt | 26 + .../primitive/serializer/VariantSerializer.kt | 39 + .../primitive/serializer/VoidSerializer.kt | 14 + .../quasseldroid_ng/quassel/BufferInfo.kt | 38 + .../quasseldroid_ng/quassel/NetworkInfo.kt | 2 + .../quassel/ProtocolFeature.kt | 16 + .../quasseldroid_ng/quassel/ProtocolMeta.kt | 5 + .../quasseldroid_ng/quassel/QuasselFeature.kt | 44 + .../quassel/syncables/AliasManager.kt | 162 +++ .../quassel/syncables/BacklogManager.kt | 19 + .../quassel/syncables/BufferSyncer.kt | 123 +++ .../quassel/syncables/BufferViewConfig.kt | 209 ++++ .../quassel/syncables/BufferViewManager.kt | 55 + .../quassel/syncables/CertManager.kt | 47 + .../quassel/syncables/CoreInfo.kt | 35 + .../quassel/syncables/DccConfig.kt | 148 +++ .../quassel/syncables/Identity.kt | 198 ++++ .../quassel/syncables/IgnoreListManager.kt | 36 + .../quassel/syncables/IrcChannel.kt | 317 ++++++ .../quassel/syncables/IrcListHelper.kt | 21 + .../quassel/syncables/IrcUser.kt | 287 ++++++ .../quassel/syncables/Network.kt | 871 ++++++++++++++++ .../quassel/syncables/NetworkConfig.kt | 102 ++ .../quassel/syncables/RpcHandler.kt | 68 ++ .../quassel/syncables/SyncableObject.kt | 39 + .../syncables/interfaces/IAliasManager.kt | 34 + .../syncables/interfaces/IBacklogManager.kt | 36 + .../syncables/interfaces/IBufferSyncer.kt | 85 ++ .../syncables/interfaces/IBufferViewConfig.kt | 111 ++ .../interfaces/IBufferViewManager.kt | 50 + .../syncables/interfaces/ICertManager.kt | 31 + .../quassel/syncables/interfaces/ICoreInfo.kt | 25 + .../syncables/interfaces/IDccConfig.kt | 80 ++ .../quassel/syncables/interfaces/IIdentity.kt | 118 +++ .../interfaces/IIgnoreListManager.kt | 46 + .../syncables/interfaces/IIrcChannel.kt | 90 ++ .../syncables/interfaces/IIrcListHelper.kt | 33 + .../quassel/syncables/interfaces/IIrcUser.kt | 138 +++ .../quassel/syncables/interfaces/INetwork.kt | 485 +++++++++ .../syncables/interfaces/INetworkConfig.kt | 100 ++ .../syncables/interfaces/IRpcHandler.kt | 57 ++ .../syncables/interfaces/ISyncableObject.kt | 25 + .../quassel/syncables/interfaces/ITransfer.kt | 54 + .../syncables/interfaces/ITransferManager.kt | 20 + .../syncables/interfaces/invokers/Invoker.kt | 11 + .../syncables/interfaces/invokers/Invokers.kt | 68 ++ .../service/ClientBackgroundThread.java | 117 --- .../service/QuasselService.java | 86 -- .../quasseldroid_ng/service/QuasselService.kt | 80 ++ .../quasseldroid_ng/session/AuthHandler.kt | 29 + .../quasseldroid_ng/session/Backend.kt | 10 + .../session/ConnectionState.kt | 9 + .../quasseldroid_ng/session/CoreConnection.kt | 224 ++++ .../session/MessageRunnable.kt | 32 + .../quasseldroid_ng/session/ObjectStorage.kt | 33 + .../session/ProtocolHandler.kt | 150 +++ .../quasseldroid_ng/session/Session.kt | 109 ++ .../quasseldroid_ng/session/SignalProxy.kt | 39 + .../quasseldroid_ng/session/SocketAddress.kt | 7 + .../quasseldroid_ng/ui/LoginActivity.java | 94 -- .../quasseldroid_ng/ui/MainActivity.kt | 125 +++ .../ui/ServiceBoundActivity.kt | 43 + .../quasseldroid_ng/ui/ViewIntBinder.java | 60 -- .../chat/BufferViewConfigSpinnerAdapter.java | 140 --- .../ui/chat/ChannelDetailActivity.java | 149 --- .../quasseldroid_ng/ui/chat/MainActivity.java | 657 ------------ .../ui/chat/ToolbarWrapper.java | 63 -- .../ui/chat/chatview/ChatMessageRenderer.java | 327 ------ .../ui/chat/chatview/MessageAdapter.java | 108 -- .../ui/chat/chatview/MessageViewHolder.java | 59 -- .../chat/dialogs/CoreInfoDialogBuilder.java | 114 --- .../ui/chat/drawer/ActionModeHandler.java | 116 --- .../chat/drawer/BufferViewConfigAdapter.java | 318 ------ .../ui/chat/drawer/BufferViewHolder.java | 182 ---- .../ui/chat/drawer/NetworkItem.java | 212 ---- .../ui/chat/drawer/NetworkViewHolder.java | 53 - .../ui/chat/drawer/OnBufferClickListener.java | 28 - .../drawer/OnBufferLongClickListener.java | 28 - .../ui/chat/fragment/ChatFragment.java | 187 ---- .../ui/chat/fragment/LoadingFragment.java | 101 -- .../ui/chat/nicklist/NickListAdapter.java | 136 --- .../ui/chat/util/ScrollRefreshLayout.java | 36 - .../ui/chat/util/ServiceHelper.java | 84 -- .../ui/chat/util/SlidingPanelHandler.java | 360 ------- .../quasseldroid_ng/ui/chat/util/Status.java | 32 - .../aliases/AliasEditActivity.java | 165 --- .../aliases/AliasListActivity.java | 168 --- .../aliases/helper/AliasSerializerHelper.java | 45 - .../chatlist/ChatListCreateActivity.java | 155 --- .../chatlist/ChatListEditActivity.java | 253 ----- .../chatlist/ChatListListActivity.java | 148 --- .../chatlist/MinimumActivityAdapter.java | 112 -- .../identity/IdentityCreateActivity.java | 189 ---- .../identity/IdentityEditActivity.java | 299 ------ .../identity/IdentityListActivity.java | 148 --- .../identity/IdentitySpinnerAdapter.java | 182 ---- .../identity/nick/IdentityNickAdapter.java | 123 --- .../nick/IdentityNickListActivity.java | 171 ---- .../ignore/IgnoreListActivity.java | 180 ---- .../ignore/IgnoreRuleEditActivity.java | 199 ---- .../helper/IgnoreRuleSerializerHelper.java | 55 - .../ignore/helper/IgnoreTypeAdapter.java | 112 -- .../ignore/helper/ScopeTypeAdapter.java | 112 -- .../ignore/helper/StrictnessTypeAdapter.java | 115 --- .../coresettings/network/AllNetworksItem.java | 749 -------------- .../network/FakeNetworksWrapper.java | 114 --- .../network/NetworkCreateActivity.java | 281 ----- .../network/NetworkEditActivity.java | 394 ------- .../network/NetworkListActivity.java | 148 --- .../network/NetworkSpinnerAdapter.java | 130 --- .../network/server/NetworkServerAdapter.java | 131 --- .../server/NetworkServerEditActivity.java | 278 ----- .../server/NetworkServerListActivity.java | 160 --- .../server/helper/ItemTouchHelperAdapter.java | 64 -- .../helper/ItemTouchHelperViewHolder.java | 62 -- .../helper/NetworkServerSerializeHelper.java | 87 -- .../server/helper/OnStartDragListener.java | 54 - .../helper/SimpleItemTouchHelperCallback.java | 142 --- .../ui/editor/AdvancedEditor.java | 214 ---- .../quasseldroid_ng/ui/settings/Settings.java | 75 -- .../ui/settings/SettingsActivity.java | 95 -- .../quasseldroid_ng/ui/setup/AccountItem.java | 175 ---- .../ui/setup/AccountSelectActivity.java | 97 -- .../ui/setup/AccountSetupActivity.java | 173 ---- .../ui/setup/CoreSetupActivity.java | 169 --- .../ui/setup/CreateAccountItem.java | 125 --- .../ui/setup/StorageBackendItem.java | 166 --- .../ui/setup/ValidUpdateCallback.java | 26 - .../ui/setup/slides/AccountSelectSlide.java | 156 --- .../setup/slides/AccountSetupCoreSlide.java | 116 --- .../setup/slides/AccountSetupNameSlide.java | 99 -- .../setup/slides/AccountSetupUserSlide.java | 111 -- .../setup/slides/CoreBackendSelectSlide.java | 103 -- .../setup/slides/CoreBackendSetupSlide.java | 404 -------- .../ui/setup/slides/SlideFragment.java | 89 -- .../quasseldroid_ng/ui/theme/AppContext.java | 113 -- .../quasseldroid_ng/ui/theme/AppTheme.java | 70 -- .../ui/theme/PreferenceStrings.java | 59 -- .../quasseldroid_ng/ui/theme/ThemeUtil.java | 969 ------------------ .../util/CompatibilityUtils.kt | 157 +++ .../de/kuschku/quasseldroid_ng/util/Flag.kt | 70 ++ .../kuschku/quasseldroid_ng/util/LongFlag.kt | 74 ++ .../kuschku/quasseldroid_ng/util/ShortFlag.kt | 78 ++ .../util/helpers/ByteBufferHelper.kt | 10 + .../util/helpers/ContextHelper.kt | 10 + .../quasseldroid_ng/util/helpers/LogHelper.kt | 233 +++++ .../quasseldroid_ng/util/helpers/MapHelper.kt | 4 + .../util/helpers/MathHelper.kt | 2 + .../util/helpers/TransformationsHelper.kt | 69 ++ .../util/helpers/WritableByteChannelHelper.kt | 9 + .../util/nio/ChainedByteBuffer.kt | 111 ++ .../util/nio/WrappedChannel.kt | 192 ++++ .../java/de/kuschku/util/AndroidAssert.java | 377 ------- .../de/kuschku/util/CompatibilityUtils.java | 115 --- .../de/kuschku/util/accounts/Account.java | 61 -- .../kuschku/util/accounts/AccountManager.java | 63 -- .../util/accounts/AccountManagerHelper.java | 206 ---- .../kuschku/util/accounts/ServerAddress.java | 36 - .../util/annotationbind/AutoBinder.java | 141 --- .../util/annotationbind/AutoColor.java | 33 - .../util/annotationbind/AutoDimen.java | 33 - .../kuschku/util/annotationbind/AutoInt.java | 33 - .../util/annotationbind/AutoString.java | 33 - .../de/kuschku/util/backports/Absent.java | 86 -- .../util/backports/BinaryFunction.java | 29 - .../de/kuschku/util/backports/Consumer.java | 26 - .../de/kuschku/util/backports/ICollector.java | 29 - .../kuschku/util/backports/NumberHelper.java | 48 - .../de/kuschku/util/backports/Objects.java | 142 --- .../de/kuschku/util/backports/Optional.java | 56 - .../de/kuschku/util/backports/Optionals.java | 50 - .../de/kuschku/util/backports/Present.java | 90 -- .../de/kuschku/util/backports/Stream.java | 137 --- .../util/backports/collectors/Collectors.java | 45 - .../backports/collectors/ListCollector.java | 37 - .../backports/collectors/MapCollector.java | 50 - .../buffermetadata/BufferMetaDataHelper.java | 190 ---- .../buffermetadata/BufferMetaDataManager.java | 36 - .../SQLiteBufferMetaDataManager.java | 62 -- .../CertificateDatabaseHandler.java | 184 ---- .../util/certificates/CertificateUtils.java | 80 -- .../SQLiteCertificateManager.java | 91 -- .../util/instancestateutil/Storable.java | 283 ----- .../kuschku/util/instancestateutil/Store.java | 70 -- .../de/kuschku/util/irc/IrcCaseMappers.java | 94 -- .../de/kuschku/util/irc/IrcUserUtils.java | 111 -- .../java/de/kuschku/util/irc/ModeUtils.java | 60 -- .../chanmodes/AbstractIrcModeProvider.java | 55 - .../kuschku/util/irc/chanmodes/ChanMode.java | 68 -- .../util/irc/chanmodes/IrcModeProvider.java | 34 - .../irc/chanmodes/IrcModeProviderFactory.java | 84 -- .../chanmodes/impl/BewareIrcModeProvider.java | 124 --- .../impl/CharybdisIrcModeProvider.java | 189 ---- .../chanmodes/impl/DalIrcModeProvider.java | 154 --- .../chanmodes/impl/DancerIrcModeProvider.java | 144 --- .../irc/chanmodes/impl/FqIrcModeProvider.java | 151 --- .../chanmodes/impl/HybridIrcModeProvider.java | 144 --- .../impl/HyperionIrcModeProvider.java | 134 --- .../impl/InspireIrcModeProvider.java | 212 ---- .../chanmodes/impl/NeoIrcModeProvider.java | 154 --- .../impl/NightstarIrcModeProvider.java | 124 --- .../chanmodes/impl/RfcIrcModeProvider.java | 114 --- .../chanmodes/impl/ShadowIrcModeProvider.java | 209 ---- .../chanmodes/impl/SolidIrcModeProvider.java | 194 ---- .../impl/UndernetIrcModeProvider.java | 114 --- .../chanmodes/impl/UnrealIrcModeProvider.java | 204 ---- .../irc/format/IrcFormatDeserializer.java | 361 ------- .../util/irc/format/IrcFormatHelper.java | 165 --- .../util/irc/format/IrcFormatSerializer.java | 153 --- .../util/irc/format/spans/Copyable.java | 26 - .../format/spans/IrcBackgroundColorSpan.java | 39 - .../util/irc/format/spans/IrcBoldSpan.java | 36 - .../format/spans/IrcForegroundColorSpan.java | 39 - .../util/irc/format/spans/IrcItalicSpan.java | 36 - .../irc/format/spans/IrcUnderlineSpan.java | 31 - .../de/kuschku/util/niohelpers/Helper.java | 57 -- .../util/niohelpers/WrappedChannel.java | 240 ----- .../util/observables/AutoScroller.java | 43 - .../util/observables/ContentComparable.java | 30 - .../kuschku/util/observables/IObservable.java | 30 - .../callbacks/DrawerItemCallback.java | 28 - .../callbacks/ElementCallback.java | 35 - .../callbacks/GeneralCallback.java | 26 - .../callbacks/GeneralObservable.java | 49 - .../observables/callbacks/UICallback.java | 47 - .../callbacks/UIChildCallback.java | 35 - .../callbacks/UIChildParentCallback.java | 25 - .../callbacks/UIParentCallback.java | 38 - .../wrappers/AdapterUICallbackWrapper.java | 85 -- .../wrappers/ChildUICallbackWrapper.java | 89 -- .../wrappers/GeneralUICallbackWrapper.java | 63 -- .../wrappers/MultiDrawerItemCallback.java | 70 -- .../wrappers/MultiElementCallbackWrapper.java | 82 -- .../wrappers/MultiGeneralCallback.java | 69 -- .../wrappers/MultiUICallbackWrapper.java | 108 -- .../wrappers/MultiUIChildCallback.java | 74 -- .../wrappers/MultiUIChildParentCallback.java | 98 -- .../wrappers/ParentUICallbackWrapper.java | 80 -- ...AndroidObservableComparableSortedList.java | 58 -- .../lists/AndroidObservableSortedList.java | 372 ------- ...hildParentAndroidObservableSortedList.java | 79 -- .../lists/IObservableCollection.java | 71 -- .../observables/lists/IObservableList.java | 29 - .../observables/lists/IObservableSet.java | 27 - .../lists/ObservableComparableSortedList.java | 56 - .../observables/lists/ObservableElement.java | 63 -- .../lists/ObservableElementList.java | 166 --- .../observables/lists/ObservableList.java | 176 ---- .../util/observables/lists/ObservableSet.java | 160 --- .../lists/ObservableSortedList.java | 212 ---- .../AbstractPreferenceElement.java | 75 -- .../util/preferences/BooleanPreference.java | 40 - .../util/preferences/FloatPreference.java | 40 - .../util/preferences/IntPreference.java | 40 - .../util/preferences/LongPreference.java | 40 - .../util/preferences/OnChangeListener.java | 26 - .../util/preferences/PreferenceElement.java | 34 - .../util/preferences/StringPreference.java | 40 - .../kuschku/util/regex/GlobTransformer.java | 130 --- .../de/kuschku/util/regex/SmartRegEx.java | 78 -- .../util/servicebound/BoundActivity.java | 154 --- .../util/servicebound/BoundFragment.java | 111 -- .../de/kuschku/util/ui/AnimationHelper.java | 82 -- .../java/de/kuschku/util/ui/Bindable.java | 26 - .../kuschku/util/ui/DateTimeFormatHelper.java | 79 -- .../util/ui/DividerItemDecoration.java | 72 -- .../ui/MaterialActionBarDrawerToggle.java | 44 - .../java/de/kuschku/util/ui/MenuTint.java | 622 ----------- .../kuschku/util/ui/ObservableTextBinder.java | 47 - .../de/kuschku/util/ui/SpanFormatter.java | 140 --- .../ui/parcelableUtil/QVariantParcelable.java | 107 -- .../StorageBackendParcelable.java | 133 --- .../preferences/MaterialListPreference.java | 232 ----- .../MaterialListSummaryPreference.java | 66 -- .../kuschku/util/ui/preferences/PrefUtil.java | 95 -- .../ui/preferences/SeekBarPreference.java | 208 ---- app/src/main/res/drawable-hdpi/ic_splash.png | Bin 0 -> 11789 bytes app/src/main/res/drawable-mdpi/ic_splash.png | Bin 0 -> 8421 bytes app/src/main/res/drawable-nodpi/bg2.jpg~ | Bin 1183302 -> 0 bytes app/src/main/res/drawable-xhdpi/ic_splash.png | Bin 0 -> 18337 bytes .../main/res/drawable-xxhdpi/ic_splash.png | Bin 0 -> 31338 bytes .../main/res/drawable-xxxhdpi/ic_splash.png | Bin 0 -> 44876 bytes app/src/main/res/drawable/badge.xml | 30 - app/src/main/res/drawable/bg_splash.xml | 9 + app/src/main/res/drawable/ic_add.xml | 8 +- app/src/main/res/drawable/ic_arrow_right.xml | 8 +- app/src/main/res/drawable/ic_check.xml | 8 +- app/src/main/res/drawable/ic_debug.xml | 8 +- app/src/main/res/drawable/ic_delete.xml | 8 +- app/src/main/res/drawable/ic_filter.xml | 8 +- app/src/main/res/drawable/ic_format_bold.xml | 8 +- app/src/main/res/drawable/ic_format_fill.xml | 8 +- .../main/res/drawable/ic_format_italic.xml | 8 +- app/src/main/res/drawable/ic_format_paint.xml | 8 +- .../main/res/drawable/ic_format_underline.xml | 8 +- app/src/main/res/drawable/ic_help.xml | 8 +- app/src/main/res/drawable/ic_history.xml | 8 +- app/src/main/res/drawable/ic_lock.xml | 8 +- app/src/main/res/drawable/ic_lock_open.xml | 8 +- app/src/main/res/drawable/ic_modify.xml | 8 +- app/src/main/res/drawable/ic_reorder.xml | 8 +- app/src/main/res/drawable/ic_scroll_down.xml | 8 +- app/src/main/res/drawable/ic_send.xml | 8 +- app/src/main/res/drawable/ic_server.xml | 8 +- .../main/res/drawable/ic_shortcut_channel.xml | 5 + .../ic_shortcut_channel_foreground.xml | 11 + .../main/res/drawable/ic_shortcut_query.xml | 5 + .../drawable/ic_shortcut_query_foreground.xml | 10 + app/src/main/res/drawable/ic_status.xml | 6 +- .../main/res/drawable/ic_status_channel.xml | 6 +- .../drawable/ic_status_channel_offline.xml | 8 +- .../main/res/drawable/ic_status_offline.xml | 6 +- .../layout-sw600dp-land/activity_setup.xml | 49 - .../main/res/layout-sw600dp-land/slide.xml | 82 -- .../res/layout-sw600dp/activity_setup.xml | 56 - app/src/main/res/layout-sw600dp/slide.xml | 74 -- .../main/res/layout/activity_alias_edit.xml | 87 -- .../res/layout/activity_channel_detail.xml | 109 -- .../res/layout/activity_chatlist_edit.xml | 164 --- .../res/layout/activity_chatlist_list.xml | 66 -- .../res/layout/activity_identity_edit.xml | 208 ---- .../res/layout/activity_ignorerule_edit.xml | 170 --- app/src/main/res/layout/activity_main.xml | 204 ++-- .../main/res/layout/activity_network_edit.xml | 312 ------ .../main/res/layout/activity_network_list.xml | 65 -- .../layout/activity_networkserver_edit.xml | 202 ---- app/src/main/res/layout/activity_settings.xml | 48 - app/src/main/res/layout/activity_setup.xml | 49 - app/src/main/res/layout/dialog_coreinfo.xml | 240 ----- app/src/main/res/layout/dialog_login.xml | 56 - app/src/main/res/layout/fragment_chat.xml | 66 -- app/src/main/res/layout/fragment_loading.xml | 56 - .../main/res/layout/seek_bar_preference.xml | 51 - app/src/main/res/layout/slide.xml | 68 -- .../main/res/layout/slide_account_core.xml | 55 - .../main/res/layout/slide_account_name.xml | 41 - .../main/res/layout/slide_account_user.xml | 54 - .../res/layout/slide_core_setup_backend.xml | 34 - app/src/main/res/layout/slide_select.xml | 26 - app/src/main/res/layout/widget_actionbar.xml | 95 -- app/src/main/res/layout/widget_buffer.xml | 113 -- .../main/res/layout/widget_channel_mode.xml | 65 -- app/src/main/res/layout/widget_chatlist.xml | 39 - .../res/layout/widget_chatmessage_action.xml | 56 - .../res/layout/widget_chatmessage_error.xml | 57 -- .../layout/widget_chatmessage_markerline.xml | 27 - .../res/layout/widget_chatmessage_plain.xml | 55 - .../res/layout/widget_chatmessage_server.xml | 57 -- .../main/res/layout/widget_core_account.xml | 77 -- .../res/layout/widget_core_account_add.xml | 77 -- .../main/res/layout/widget_core_backend.xml | 66 -- .../main/res/layout/widget_drawer_network.xml | 47 - app/src/main/res/layout/widget_editor.xml | 98 -- .../main/res/layout/widget_identitynick.xml | 54 - .../main/res/layout/widget_input_boolean.xml | 27 - .../main/res/layout/widget_input_string.xml | 33 - .../main/res/layout/widget_networkserver.xml | 62 -- app/src/main/res/layout/widget_nick.xml | 81 -- app/src/main/res/layout/widget_nick_away.xml | 85 -- .../main/res/layout/widget_settings_alias.xml | 58 -- .../res/layout/widget_settings_ignorerule.xml | 51 - .../res/layout/widget_settings_network.xml | 40 - app/src/main/res/layout/widget_slider.xml | 85 -- .../res/layout/widget_spinner_item_inline.xml | 28 - .../layout/widget_spinner_item_toolbar.xml | 30 - app/src/main/res/menu/chat.xml | 62 -- app/src/main/res/menu/chatlist.xml | 38 - app/src/main/res/menu/confirm.xml | 30 - app/src/main/res/menu/confirm_delete.xml | 35 - .../main/res/menu/context_buffer_network.xml | 54 - app/src/main/res/menu/formatting.xml | 195 ---- app/src/main/res/menu/main.xml | 6 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3244 -> 3278 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 2884 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1988 -> 2546 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2229 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4594 -> 4634 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 4112 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7521 -> 7512 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 6812 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10855 -> 10878 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 9911 bytes app/src/main/res/values-land/dimens.xml | 25 - app/src/main/res/values-sw600dp/dimens.xml | 26 - app/src/main/res/values-w820dp/dimens.xml | 24 - app/src/main/res/values/attrs.xml | 95 -- app/src/main/res/values/colors.xml | 37 +- app/src/main/res/values/dimens.xml | 32 - app/src/main/res/values/ids.xml | 29 - app/src/main/res/values/preferences.xml | 63 -- app/src/main/res/values/strings.xml | 68 +- app/src/main/res/values/strings_actions.xml | 55 - app/src/main/res/values/strings_chanmodes.xml | 140 --- .../main/res/values/strings_coresettings.xml | 114 --- app/src/main/res/values/strings_format.xml | 71 -- app/src/main/res/values/strings_setup.xml | 41 - app/src/main/res/values/strings_titles.xml | 49 - app/src/main/res/values/styles.xml | 181 +--- app/src/main/res/values/themes_quassel.xml | 109 -- app/src/main/res/values/themes_solarized.xml | 120 --- app/src/main/res/xml/pref_appearance.xml | 55 - app/src/main/res/xml/pref_overview.xml | 32 - .../quasseldroid_ng/SerializerUnitTest.kt | 103 ++ build.gradle | 43 - build.gradle.kts | 17 + gradle.properties | 17 + gradle/project-schema.json | 73 ++ gradle/wrapper/gradle-wrapper.jar | Bin 53637 -> 52978 bytes gradle/wrapper/gradle-wrapper.properties | 24 +- gradlew | 72 +- gradlew.bat | 14 +- install.sh | 20 - invokerannotations/build.gradle.kts | 3 + .../kuschku/libquassel/annotations/Slot.java | 12 + .../libquassel/annotations/Syncable.java | 12 + invokergenerator/build.gradle.kts | 18 + .../annotations/InvokerProcessor.java | 241 +++++ settings.gradle | 23 +- 685 files changed, 9701 insertions(+), 55465 deletions(-) delete mode 100644 .gitmodules delete mode 160000 AndroidSlidingUpPanel delete mode 100644 COPYING.GPL.md delete mode 100644 README.md create mode 100644 app/.gitignore delete mode 100644 app/build.gradle create mode 100644 app/build.gradle.kts create mode 100644 app/src/androidTest/java/de/kuschku/quasseldroid_ng/ExampleInstrumentedTest.kt delete mode 100644 app/src/beta/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/beta/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/beta/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/beta/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/beta/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/beta/res/values/colors.xml delete mode 100644 app/src/beta/res/values/strings.xml delete mode 100644 app/src/debug/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/debug/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/debug/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/debug/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/debug/res/values/strings.xml delete mode 100644 app/src/main/java/de/kuschku/libquassel/BusProvider.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/CoreConnection.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/IProtocolHandler.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/QuasselClient.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/client/AClient.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/client/BufferManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/client/Client.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/client/ClientData.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/client/FeatureFlags.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/client/QClient.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/BacklogInitEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/BacklogReceivedEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/BufferChangeEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/CertificateAcceptedEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/ConnectionChangeEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/CoreSetupFailedEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/CoreSetupRequiredEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/CoreSetupSuccessfulEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/CriticalErrorEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/HandshakeFailedEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/InitEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/LoginRequireEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/PasswordChangeEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/StatusMessageEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/exceptions/UnknownTypeException.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/FunctionType.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/FunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/InitDataFunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/InitRequestFunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedInitDataFunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedRpcCallFunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedSyncFunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedInitDataFunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedRpcCallFunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedSyncFunctionSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/HandshakeFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/InitDataFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/InitRequestFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/PackedFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/PackedInitDataFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/SerializedFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/SyncFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/UnpackedFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/functions/types/UnpackedInitDataFunction.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/orm/ConnectedDatabase.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/BufferTypeConverter.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/DateTimeConverter.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageFlagsConverter.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageTypeConverter.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/message/Message.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/MessageTypeRegistry.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitAckSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitRejectSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginAckSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginRejectSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupAckSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupDataSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupRejectSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/NetworkServerSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/ObjectSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionInitSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionStateSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/SetupDataInitializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/StorageBackendSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/serializers/StringObjectMapSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/ClientInit.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/ClientInitAck.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/ClientInitReject.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/ClientLogin.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/ClientLoginAck.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/ClientLoginReject.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/Command.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupAck.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupData.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupReject.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/CoreStatus.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/NetworkServer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/SessionInit.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/SessionState.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/SetupData.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/objects/types/StorageBackend.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/BoolSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/BufferInfoSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteArraySerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/CharSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/DateTimeSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/IntSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/LongSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/MessageSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/PrimitiveSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/ProtocolSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/ShortSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/StringListSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/StringSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/TimeSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantListSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantMapSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantVariantListSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/serializers/VoidSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/types/BufferInfo.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/types/Protocol.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/primitives/types/QVariant.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/protocols/RemotePeer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/ssl/CertificateManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/ssl/UnknownCertificateException.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/Syncable.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/Synced.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferSyncerSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferViewConfigSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferViewManagerSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/CoreInfoSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/IdentitySerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkInfoSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AAliasManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferSyncer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewConfig.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ACoreInfo.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIdentity.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIgnoreListManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetworkConfig.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/AliasManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/CoreInfo.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkConfig.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QAliasManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QCertManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QCoreInfo.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIdentity.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetworkConfig.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QObservable.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QSyncableObject.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IAliasManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBacklogManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferSyncer.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferViewConfig.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferViewManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/ICertManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IClient.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/ICoreInfo.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIdentity.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIgnoreListManager.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIrcChannel.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIrcUser.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/INetwork.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/INetworkConfig.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/Invoker.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/InvokerHelper.java delete mode 100644 app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/InvokerRegistry.java create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/Exceptions.kt delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/ClientData.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/HandshakeMessage.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/MetaType.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/NetworkLayerProtocol.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QType.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QTypes.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QVariant.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/SignalProxyMessage.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/Type.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BoolSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BufferInfoSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteArraySerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/CharSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DateTimeSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HostAddressSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/IntSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/LongSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/MessageSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ProtocolSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/Serializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ShortSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringListSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/TimeSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantListSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantMapSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VoidSerializer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/BufferInfo.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/NetworkInfo.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolFeature.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolMeta.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/QuasselFeature.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/AliasManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BacklogManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferSyncer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewConfig.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CertManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CoreInfo.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/DccConfig.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Identity.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IgnoreListManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcChannel.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcListHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcUser.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Network.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/NetworkConfig.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/RpcHandler.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/SyncableObject.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IAliasManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBacklogManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferSyncer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewConfig.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICertManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICoreInfo.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IDccConfig.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIdentity.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIgnoreListManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcChannel.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcListHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcUser.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetwork.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetworkConfig.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IRpcHandler.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ISyncableObject.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransfer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransferManager.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invoker.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invokers.kt delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/AuthHandler.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/Backend.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/ConnectionState.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/CoreConnection.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/MessageRunnable.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/ObjectStorage.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/ProtocolHandler.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/Session.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/SignalProxy.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/session/SocketAddress.kt delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/LoginActivity.java create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/MainActivity.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarWrapper.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageViewHolder.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/dialogs/CoreInfoDialogBuilder.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/ActionModeHandler.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkViewHolder.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/OnBufferClickListener.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/OnBufferLongClickListener.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/LoadingFragment.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/nicklist/NickListAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ScrollRefreshLayout.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ServiceHelper.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/Status.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/AliasEditActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/AliasListActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/helper/AliasSerializerHelper.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListEditActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListListActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/MinimumActivityAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityCreateActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityEditActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityListActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentitySpinnerAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickListActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/IgnoreListActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/IgnoreRuleEditActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/IgnoreRuleSerializerHelper.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/IgnoreTypeAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/ScopeTypeAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/StrictnessTypeAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/AllNetworksItem.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/FakeNetworksWrapper.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkSpinnerAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerEditActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerListActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/ItemTouchHelperAdapter.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/ItemTouchHelperViewHolder.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/NetworkServerSerializeHelper.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/OnStartDragListener.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/SimpleItemTouchHelperCallback.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSelectActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CoreSetupActivity.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/StorageBackendItem.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/ValidUpdateCallback.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSelectSlide.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupCoreSlide.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupNameSlide.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupUserSlide.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSelectSlide.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/SlideFragment.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/PreferenceStrings.java delete mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/CompatibilityUtils.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/Flag.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/LongFlag.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/ShortFlag.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ByteBufferHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ContextHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/LogHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MapHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MathHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/TransformationsHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/WritableByteChannelHelper.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/ChainedByteBuffer.kt create mode 100644 app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/WrappedChannel.kt delete mode 100644 app/src/main/java/de/kuschku/util/AndroidAssert.java delete mode 100644 app/src/main/java/de/kuschku/util/CompatibilityUtils.java delete mode 100644 app/src/main/java/de/kuschku/util/accounts/Account.java delete mode 100644 app/src/main/java/de/kuschku/util/accounts/AccountManager.java delete mode 100644 app/src/main/java/de/kuschku/util/accounts/AccountManagerHelper.java delete mode 100644 app/src/main/java/de/kuschku/util/accounts/ServerAddress.java delete mode 100644 app/src/main/java/de/kuschku/util/annotationbind/AutoBinder.java delete mode 100644 app/src/main/java/de/kuschku/util/annotationbind/AutoColor.java delete mode 100644 app/src/main/java/de/kuschku/util/annotationbind/AutoDimen.java delete mode 100644 app/src/main/java/de/kuschku/util/annotationbind/AutoInt.java delete mode 100644 app/src/main/java/de/kuschku/util/annotationbind/AutoString.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/Absent.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/BinaryFunction.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/Consumer.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/ICollector.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/NumberHelper.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/Objects.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/Optional.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/Optionals.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/Present.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/Stream.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java delete mode 100644 app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java delete mode 100644 app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataHelper.java delete mode 100644 app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataManager.java delete mode 100644 app/src/main/java/de/kuschku/util/buffermetadata/SQLiteBufferMetaDataManager.java delete mode 100644 app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java delete mode 100644 app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java delete mode 100644 app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java delete mode 100644 app/src/main/java/de/kuschku/util/instancestateutil/Storable.java delete mode 100644 app/src/main/java/de/kuschku/util/instancestateutil/Store.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/IrcCaseMappers.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/ModeUtils.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/AbstractIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/ChanMode.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/IrcFormatDeserializer.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/IrcFormatSerializer.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/spans/Copyable.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/spans/IrcBackgroundColorSpan.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/spans/IrcBoldSpan.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/spans/IrcForegroundColorSpan.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/spans/IrcItalicSpan.java delete mode 100644 app/src/main/java/de/kuschku/util/irc/format/spans/IrcUnderlineSpan.java delete mode 100644 app/src/main/java/de/kuschku/util/niohelpers/Helper.java delete mode 100644 app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/AutoScroller.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/ContentComparable.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/IObservable.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/DrawerItemCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/ElementCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/GeneralCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/UICallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/UIChildCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/UIChildParentCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/UIParentCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/AdapterUICallbackWrapper.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/ChildUICallbackWrapper.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralUICallbackWrapper.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUICallbackWrapper.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUIChildCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUIChildParentCallback.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/ParentUICallbackWrapper.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/AndroidObservableComparableSortedList.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/AndroidObservableSortedList.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/ChildParentAndroidObservableSortedList.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/IObservableCollection.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/IObservableList.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/IObservableSet.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/ObservableComparableSortedList.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/ObservableElement.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/ObservableList.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java delete mode 100644 app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java delete mode 100644 app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java delete mode 100644 app/src/main/java/de/kuschku/util/preferences/BooleanPreference.java delete mode 100644 app/src/main/java/de/kuschku/util/preferences/FloatPreference.java delete mode 100644 app/src/main/java/de/kuschku/util/preferences/IntPreference.java delete mode 100644 app/src/main/java/de/kuschku/util/preferences/LongPreference.java delete mode 100644 app/src/main/java/de/kuschku/util/preferences/OnChangeListener.java delete mode 100644 app/src/main/java/de/kuschku/util/preferences/PreferenceElement.java delete mode 100644 app/src/main/java/de/kuschku/util/preferences/StringPreference.java delete mode 100644 app/src/main/java/de/kuschku/util/regex/GlobTransformer.java delete mode 100644 app/src/main/java/de/kuschku/util/regex/SmartRegEx.java delete mode 100644 app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java delete mode 100644 app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/AnimationHelper.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/Bindable.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/DateTimeFormatHelper.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/DividerItemDecoration.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/MaterialActionBarDrawerToggle.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/MenuTint.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/ObservableTextBinder.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/SpanFormatter.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/parcelableUtil/QVariantParcelable.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/preferences/MaterialListPreference.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/preferences/MaterialListSummaryPreference.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/preferences/PrefUtil.java delete mode 100644 app/src/main/java/de/kuschku/util/ui/preferences/SeekBarPreference.java create mode 100644 app/src/main/res/drawable-hdpi/ic_splash.png create mode 100644 app/src/main/res/drawable-mdpi/ic_splash.png delete mode 100644 app/src/main/res/drawable-nodpi/bg2.jpg~ create mode 100644 app/src/main/res/drawable-xhdpi/ic_splash.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_splash.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_splash.png delete mode 100644 app/src/main/res/drawable/badge.xml create mode 100644 app/src/main/res/drawable/bg_splash.xml create mode 100644 app/src/main/res/drawable/ic_shortcut_channel.xml create mode 100644 app/src/main/res/drawable/ic_shortcut_channel_foreground.xml create mode 100644 app/src/main/res/drawable/ic_shortcut_query.xml create mode 100644 app/src/main/res/drawable/ic_shortcut_query_foreground.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/activity_setup.xml delete mode 100644 app/src/main/res/layout-sw600dp-land/slide.xml delete mode 100644 app/src/main/res/layout-sw600dp/activity_setup.xml delete mode 100644 app/src/main/res/layout-sw600dp/slide.xml delete mode 100644 app/src/main/res/layout/activity_alias_edit.xml delete mode 100644 app/src/main/res/layout/activity_channel_detail.xml delete mode 100644 app/src/main/res/layout/activity_chatlist_edit.xml delete mode 100644 app/src/main/res/layout/activity_chatlist_list.xml delete mode 100644 app/src/main/res/layout/activity_identity_edit.xml delete mode 100644 app/src/main/res/layout/activity_ignorerule_edit.xml delete mode 100644 app/src/main/res/layout/activity_network_edit.xml delete mode 100644 app/src/main/res/layout/activity_network_list.xml delete mode 100644 app/src/main/res/layout/activity_networkserver_edit.xml delete mode 100644 app/src/main/res/layout/activity_settings.xml delete mode 100644 app/src/main/res/layout/activity_setup.xml delete mode 100644 app/src/main/res/layout/dialog_coreinfo.xml delete mode 100644 app/src/main/res/layout/dialog_login.xml delete mode 100644 app/src/main/res/layout/fragment_chat.xml delete mode 100644 app/src/main/res/layout/fragment_loading.xml delete mode 100644 app/src/main/res/layout/seek_bar_preference.xml delete mode 100644 app/src/main/res/layout/slide.xml delete mode 100644 app/src/main/res/layout/slide_account_core.xml delete mode 100644 app/src/main/res/layout/slide_account_name.xml delete mode 100644 app/src/main/res/layout/slide_account_user.xml delete mode 100644 app/src/main/res/layout/slide_core_setup_backend.xml delete mode 100644 app/src/main/res/layout/slide_select.xml delete mode 100644 app/src/main/res/layout/widget_actionbar.xml delete mode 100644 app/src/main/res/layout/widget_buffer.xml delete mode 100644 app/src/main/res/layout/widget_channel_mode.xml delete mode 100644 app/src/main/res/layout/widget_chatlist.xml delete mode 100644 app/src/main/res/layout/widget_chatmessage_action.xml delete mode 100644 app/src/main/res/layout/widget_chatmessage_error.xml delete mode 100644 app/src/main/res/layout/widget_chatmessage_markerline.xml delete mode 100644 app/src/main/res/layout/widget_chatmessage_plain.xml delete mode 100644 app/src/main/res/layout/widget_chatmessage_server.xml delete mode 100644 app/src/main/res/layout/widget_core_account.xml delete mode 100644 app/src/main/res/layout/widget_core_account_add.xml delete mode 100644 app/src/main/res/layout/widget_core_backend.xml delete mode 100644 app/src/main/res/layout/widget_drawer_network.xml delete mode 100644 app/src/main/res/layout/widget_editor.xml delete mode 100644 app/src/main/res/layout/widget_identitynick.xml delete mode 100644 app/src/main/res/layout/widget_input_boolean.xml delete mode 100644 app/src/main/res/layout/widget_input_string.xml delete mode 100644 app/src/main/res/layout/widget_networkserver.xml delete mode 100644 app/src/main/res/layout/widget_nick.xml delete mode 100644 app/src/main/res/layout/widget_nick_away.xml delete mode 100644 app/src/main/res/layout/widget_settings_alias.xml delete mode 100644 app/src/main/res/layout/widget_settings_ignorerule.xml delete mode 100644 app/src/main/res/layout/widget_settings_network.xml delete mode 100644 app/src/main/res/layout/widget_slider.xml delete mode 100644 app/src/main/res/layout/widget_spinner_item_inline.xml delete mode 100644 app/src/main/res/layout/widget_spinner_item_toolbar.xml delete mode 100644 app/src/main/res/menu/chat.xml delete mode 100644 app/src/main/res/menu/chatlist.xml delete mode 100644 app/src/main/res/menu/confirm.xml delete mode 100644 app/src/main/res/menu/confirm_delete.xml delete mode 100644 app/src/main/res/menu/context_buffer_network.xml delete mode 100644 app/src/main/res/menu/formatting.xml create mode 100644 app/src/main/res/menu/main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/values-land/dimens.xml delete mode 100644 app/src/main/res/values-sw600dp/dimens.xml delete mode 100644 app/src/main/res/values-w820dp/dimens.xml delete mode 100644 app/src/main/res/values/attrs.xml delete mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/main/res/values/ids.xml delete mode 100644 app/src/main/res/values/preferences.xml delete mode 100644 app/src/main/res/values/strings_actions.xml delete mode 100644 app/src/main/res/values/strings_chanmodes.xml delete mode 100644 app/src/main/res/values/strings_coresettings.xml delete mode 100644 app/src/main/res/values/strings_format.xml delete mode 100644 app/src/main/res/values/strings_setup.xml delete mode 100644 app/src/main/res/values/strings_titles.xml delete mode 100644 app/src/main/res/values/themes_quassel.xml delete mode 100644 app/src/main/res/values/themes_solarized.xml delete mode 100644 app/src/main/res/xml/pref_appearance.xml delete mode 100644 app/src/main/res/xml/pref_overview.xml create mode 100644 app/src/test/java/de/kuschku/quasseldroid_ng/SerializerUnitTest.kt delete mode 100644 build.gradle create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/project-schema.json delete mode 100755 install.sh create mode 100644 invokerannotations/build.gradle.kts create mode 100644 invokerannotations/src/main/java/de/kuschku/libquassel/annotations/Slot.java create mode 100644 invokerannotations/src/main/java/de/kuschku/libquassel/annotations/Syncable.java create mode 100644 invokergenerator/build.gradle.kts create mode 100644 invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java diff --git a/.gitignore b/.gitignore index 258bee47c..6619e4329 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,10 @@ -bin/* -gen/* -/.classpath -**/build/* *.iml -local.properties -.gradle/* -.idea/* -gradle.properties -*/version.properties -*.sh -make -signing.gradle -**/libs/* \ No newline at end of file +.gradle +/local.properties +/signing.properties +/.idea/ +.DS_Store +/captures +.externalNativeBuild +build/ +/*/schemas/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 5d4529c10..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "AndroidSlidingUpPanel"] - path = AndroidSlidingUpPanel - url = https://github.com/justjanne/AndroidSlidingUpPanel diff --git a/AndroidSlidingUpPanel b/AndroidSlidingUpPanel deleted file mode 160000 index 70f676b9e..000000000 --- a/AndroidSlidingUpPanel +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 70f676b9ef268f6b3383287a86687dd58514bf54 diff --git a/COPYING.GPL.md b/COPYING.GPL.md deleted file mode 100644 index 16d89e0a3..000000000 --- a/COPYING.GPL.md +++ /dev/null @@ -1,596 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -========================== - -Version 3, 29 June 2007 - -Copyright © 2007 Free Software Foundation, Inc. <<http://fsf.org/>> - -Everyone is permitted to copy and distribute verbatim copies of this license -document, but changing it is not allowed. - -## Preamble - -The GNU General Public License is a free, copyleft license for software and other -kinds of works. - -The licenses for most software and other practical works are designed to take away -your freedom to share and change the works. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change all versions of a -program--to make sure it remains free software for all its users. We, the Free -Software Foundation, use the GNU General Public License for most of our software; it -applies also to any other work released this way by its authors. You can apply it to -your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General -Public Licenses are designed to make sure that you have the freedom to distribute -copies of free software (and charge for them if you wish), that you receive source -code or can get it if you want it, that you can change the software or use pieces of -it in new free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you these rights or -asking you to surrender the rights. Therefore, you have certain responsibilities if -you distribute copies of the software, or if you modify it: responsibilities to -respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a fee, -you must pass on to the recipients the same freedoms that you received. You must make -sure that they, too, receive or can get the source code. And you must show them these -terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert -copyright on the software, and (2) offer you this License giving you legal permission -to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there is -no warranty for this free software. For both users' and authors' sake, the GPL -requires that modified versions be marked as changed, so that their problems will not -be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified versions of -the software inside them, although the manufacturer can do so. This is fundamentally -incompatible with the aim of protecting users' freedom to change the software. The -systematic pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we have designed -this version of the GPL to prohibit the practice for those products. If such problems -arise substantially in other domains, we stand ready to extend this provision to -those domains in future versions of the GPL, as needed to protect the freedom of -users. - -Finally, every program is threatened constantly by software patents. States should -not allow patents to restrict development and use of software on general-purpose -computers, but in those that do, we wish to avoid the special danger that patents -applied to a free program could make it effectively proprietary. To prevent this, the -GPL assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and modification follow. - -## TERMS AND CONDITIONS - -### 0. Definitions. - -“This License” refers to version 3 of the GNU General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this -License. Each licensee is addressed as “you”. “Licensees” and -“recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work in -a fashion requiring copyright permission, other than the making of an exact copy. The -resulting work is called a “modified version” of the earlier work or a -work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based on -the Program. - -To “propagate” a work means to do anything with it that, without -permission, would make you directly or secondarily liable for infringement under -applicable copyright law, except executing it on a computer or modifying a private -copy. Propagation includes copying, distribution (with or without modification), -making available to the public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through a computer -network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” to the -extent that it includes a convenient and prominently visible feature that (1) -displays an appropriate copyright notice, and (2) tells the user that there is no -warranty for the work (except to the extent that warranties are provided), that -licensees may convey the work under this License, and how to view a copy of this -License. If the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -### 1. Source Code. - -The “source code” for a work means the preferred form of the work for -making modifications to it. “Object code” means any non-source form of a -work. - -A “Standard Interface” means an interface that either is an official -standard defined by a recognized standards body, or, in the case of interfaces -specified for a particular programming language, one that is widely used among -developers working in that language. - -The “System Libraries” of an executable work include anything, other than -the work as a whole, that (a) is included in the normal form of packaging a Major -Component, but which is not part of that Major Component, and (b) serves only to -enable use of the work with that Major Component, or to implement a Standard -Interface for which an implementation is available to the public in source code form. -A “Major Component”, in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system (if any) on which -the executable work runs, or a compiler used to produce the work, or an object code -interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all the -source code needed to generate, install, and (for an executable work) run the object -code and to modify the work, including scripts to control those activities. However, -it does not include the work's System Libraries, or general-purpose tools or -generally available free programs which are used unmodified in performing those -activities but which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for the work, and -the source code for shared libraries and dynamically linked subprograms that the work -is specifically designed to require, such as by intimate data communication or -control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate -automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -### 2. Basic Permissions. - -All rights granted under this License are granted for the term of copyright on the -Program, and are irrevocable provided the stated conditions are met. This License -explicitly affirms your unlimited permission to run the unmodified Program. The -output from running a covered work is covered by this License only if the output, -given its content, constitutes a covered work. This License acknowledges your rights -of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without -conditions so long as your license otherwise remains in force. You may convey covered -works to others for the sole purpose of having them make modifications exclusively -for you, or provide you with facilities for running those works, provided that you -comply with the terms of this License in conveying all material for which you do not -control copyright. Those thus making or running the covered works for you must do so -exclusively on your behalf, under your direction and control, on terms that prohibit -them from making any copies of your copyrighted material outside their relationship -with you. - -Conveying under any other circumstances is permitted solely under the conditions -stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - -No covered work shall be deemed part of an effective technological measure under any -applicable law fulfilling obligations under article 11 of the WIPO copyright treaty -adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention -of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of -technological measures to the extent such circumvention is effected by exercising -rights under this License with respect to the covered work, and you disclaim any -intention to limit operation or modification of the work as a means of enforcing, -against the work's users, your or third parties' legal rights to forbid circumvention -of technological measures. - -### 4. Conveying Verbatim Copies. - -You may convey verbatim copies of the Program's source code as you receive it, in any -medium, provided that you conspicuously and appropriately publish on each copy an -appropriate copyright notice; keep intact all notices stating that this License and -any non-permissive terms added in accord with section 7 apply to the code; keep -intact all notices of the absence of any warranty; and give all recipients a copy of -this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer -support or warranty protection for a fee. - -### 5. Conveying Modified Source Versions. - -You may convey a work based on the Program, or the modifications to produce it from -the Program, in the form of source code under the terms of section 4, provided that -you also meet all of these conditions: - -* **a)** The work must carry prominent notices stating that you modified it, and giving a -relevant date. -* **b)** The work must carry prominent notices stating that it is released under this -License and any conditions added under section 7. This requirement modifies the -requirement in section 4 to “keep intact all notices”. -* **c)** You must license the entire work, as a whole, under this License to anyone who -comes into possession of a copy. This License will therefore apply, along with any -applicable section 7 additional terms, to the whole of the work, and all its parts, -regardless of how they are packaged. This License gives no permission to license the -work in any other way, but it does not invalidate such permission if you have -separately received it. -* **d)** If the work has interactive user interfaces, each must display Appropriate Legal -Notices; however, if the Program has interactive interfaces that do not display -Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are -not by their nature extensions of the covered work, and which are not combined with -it such as to form a larger program, in or on a volume of a storage or distribution -medium, is called an “aggregate” if the compilation and its resulting -copyright are not used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work in an aggregate -does not cause this License to apply to the other parts of the aggregate. - -### 6. Conveying Non-Source Forms. - -You may convey a covered work in object code form under the terms of sections 4 and -5, provided that you also convey the machine-readable Corresponding Source under the -terms of this License, in one of these ways: - -* **a)** Convey the object code in, or embodied in, a physical product (including a -physical distribution medium), accompanied by the Corresponding Source fixed on a -durable physical medium customarily used for software interchange. -* **b)** Convey the object code in, or embodied in, a physical product (including a -physical distribution medium), accompanied by a written offer, valid for at least -three years and valid for as long as you offer spare parts or customer support for -that product model, to give anyone who possesses the object code either (1) a copy of -the Corresponding Source for all the software in the product that is covered by this -License, on a durable physical medium customarily used for software interchange, for -a price no more than your reasonable cost of physically performing this conveying of -source, or (2) access to copy the Corresponding Source from a network server at no -charge. -* **c)** Convey individual copies of the object code with a copy of the written offer to -provide the Corresponding Source. This alternative is allowed only occasionally and -noncommercially, and only if you received the object code with such an offer, in -accord with subsection 6b. -* **d)** Convey the object code by offering access from a designated place (gratis or for -a charge), and offer equivalent access to the Corresponding Source in the same way -through the same place at no further charge. You need not require recipients to copy -the Corresponding Source along with the object code. If the place to copy the object -code is a network server, the Corresponding Source may be on a different server -(operated by you or a third party) that supports equivalent copying facilities, -provided you maintain clear directions next to the object code saying where to find -the Corresponding Source. Regardless of what server hosts the Corresponding Source, -you remain obligated to ensure that it is available for as long as needed to satisfy -these requirements. -* **e)** Convey the object code using peer-to-peer transmission, provided you inform -other peers where the object code and Corresponding Source of the work are being -offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the -Corresponding Source as a System Library, need not be included in conveying the -object code work. - -A “User Product” is either (1) a “consumer product”, which -means any tangible personal property which is normally used for personal, family, or -household purposes, or (2) anything designed or sold for incorporation into a -dwelling. In determining whether a product is a consumer product, doubtful cases -shall be resolved in favor of coverage. For a particular product received by a -particular user, “normally used” refers to a typical or common use of -that class of product, regardless of the status of the particular user or of the way -in which the particular user actually uses, or expects or is expected to use, the -product. A product is a consumer product regardless of whether the product has -substantial commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, -procedures, authorization keys, or other information required to install and execute -modified versions of a covered work in that User Product from a modified version of -its Corresponding Source. The information must suffice to ensure that the continued -functioning of the modified object code is in no case prevented or interfered with -solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for -use in, a User Product, and the conveying occurs as part of a transaction in which -the right of possession and use of the User Product is transferred to the recipient -in perpetuity or for a fixed term (regardless of how the transaction is -characterized), the Corresponding Source conveyed under this section must be -accompanied by the Installation Information. But this requirement does not apply if -neither you nor any third party retains the ability to install modified object code -on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to -continue to provide support service, warranty, or updates for a work that has been -modified or installed by the recipient, or for the User Product in which it has been -modified or installed. Access to a network may be denied when the modification itself -materially and adversely affects the operation of the network or violates the rules -and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with -this section must be in a format that is publicly documented (and with an -implementation available to the public in source code form), and must require no -special password or key for unpacking, reading or copying. - -### 7. Additional Terms. - -“Additional permissions” are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. Additional -permissions that are applicable to the entire Program shall be treated as though they -were included in this License, to the extent that they are valid under applicable -law. If additional permissions apply only to part of the Program, that part may be -used separately under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any -additional permissions from that copy, or from any part of it. (Additional -permissions may be written to require their own removal in certain cases when you -modify the work.) You may place additional permissions on material, added by you to a -covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a -covered work, you may (if authorized by the copyright holders of that material) -supplement the terms of this License with terms: - -* **a)** Disclaiming warranty or limiting liability differently from the terms of -sections 15 and 16 of this License; or -* **b)** Requiring preservation of specified reasonable legal notices or author -attributions in that material or in the Appropriate Legal Notices displayed by works -containing it; or -* **c)** Prohibiting misrepresentation of the origin of that material, or requiring that -modified versions of such material be marked in reasonable ways as different from the -original version; or -* **d)** Limiting the use for publicity purposes of names of licensors or authors of the -material; or -* **e)** Declining to grant rights under trademark law for use of some trade names, -trademarks, or service marks; or -* **f)** Requiring indemnification of licensors and authors of that material by anyone -who conveys the material (or modified versions of it) with contractual assumptions of -liability to the recipient, for any liability that these contractual assumptions -directly impose on those licensors and authors. - -All other non-permissive additional terms are considered “further -restrictions” within the meaning of section 10. If the Program as you received -it, or any part of it, contains a notice stating that it is governed by this License -along with a term that is a further restriction, you may remove that term. If a -license document contains a further restriction but permits relicensing or conveying -under this License, you may add to a covered work material governed by the terms of -that license document, provided that the further restriction does not survive such -relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in -the relevant source files, a statement of the additional terms that apply to those -files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a -separately written license, or stated as exceptions; the above requirements apply -either way. - -### 8. Termination. - -You may not propagate or modify a covered work except as expressly provided under -this License. Any attempt otherwise to propagate or modify it is void, and will -automatically terminate your rights under this License (including any patent licenses -granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a -particular copyright holder is reinstated (a) provisionally, unless and until the -copyright holder explicitly and finally terminates your license, and (b) permanently, -if the copyright holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently -if the copyright holder notifies you of the violation by some reasonable means, this -is the first time you have received notice of violation of this License (for any -work) from that copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of -parties who have received copies or rights from you under this License. If your -rights have been terminated and not permanently reinstated, you do not qualify to -receive new licenses for the same material under section 10. - -### 9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or run a copy of the -Program. Ancillary propagation of a covered work occurring solely as a consequence of -using peer-to-peer transmission to receive a copy likewise does not require -acceptance. However, nothing other than this License grants you permission to -propagate or modify any covered work. These actions infringe copyright if you do not -accept this License. Therefore, by modifying or propagating a covered work, you -indicate your acceptance of this License to do so. - -### 10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically receives a license -from the original licensors, to run, modify and propagate that work, subject to this -License. You are not responsible for enforcing compliance by third parties with this -License. - -An “entity transaction” is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an organization, or -merging organizations. If propagation of a covered work results from an entity -transaction, each party to that transaction who receives a copy of the work also -receives whatever licenses to the work the party's predecessor in interest had or -could give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if the predecessor -has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or -affirmed under this License. For example, you may not impose a license fee, royalty, -or other charge for exercise of rights granted under this License, and you may not -initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging -that any patent claim is infringed by making, using, selling, offering for sale, or -importing the Program or any portion of it. - -### 11. Patents. - -A “contributor” is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The work thus -licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims owned or -controlled by the contributor, whether already acquired or hereafter acquired, that -would be infringed by some manner, permitted by this License, of making, using, or -selling its contributor version, but do not include claims that would be infringed -only as a consequence of further modification of the contributor version. For -purposes of this definition, “control” includes the right to grant patent -sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license -under the contributor's essential patent claims, to make, use, sell, offer for sale, -import and otherwise run, modify and propagate the contents of its contributor -version. - -In the following three paragraphs, a “patent license” is any express -agreement or commitment, however denominated, not to enforce a patent (such as an -express permission to practice a patent or covenant not to sue for patent -infringement). To “grant” such a patent license to a party means to make -such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the -Corresponding Source of the work is not available for anyone to copy, free of charge -and under the terms of this License, through a publicly available network server or -other readily accessible means, then you must either (1) cause the Corresponding -Source to be so available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner consistent with -the requirements of this License, to extend the patent license to downstream -recipients. “Knowingly relying” means you have actual knowledge that, but -for the patent license, your conveying the covered work in a country, or your -recipient's use of the covered work in a country, would infringe one or more -identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you -convey, or propagate by procuring conveyance of, a covered work, and grant a patent -license to some of the parties receiving the covered work authorizing them to use, -propagate, modify or convey a specific copy of the covered work, then the patent -license you grant is automatically extended to all recipients of the covered work and -works based on it. - -A patent license is “discriminatory” if it does not include within the -scope of its coverage, prohibits the exercise of, or is conditioned on the -non-exercise of one or more of the rights that are specifically granted under this -License. You may not convey a covered work if you are a party to an arrangement with -a third party that is in the business of distributing software, under which you make -payment to the third party based on the extent of your activity of conveying the -work, and under which the third party grants, to any of the parties who would receive -the covered work from you, a discriminatory patent license (a) in connection with -copies of the covered work conveyed by you (or copies made from those copies), or (b) -primarily for and in connection with specific products or compilations that contain -the covered work, unless you entered into that arrangement, or that patent license -was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied -license or other defenses to infringement that may otherwise be available to you -under applicable patent law. - -### 12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or otherwise) -that contradict the conditions of this License, they do not excuse you from the -conditions of this License. If you cannot convey a covered work so as to satisfy -simultaneously your obligations under this License and any other pertinent -obligations, then as a consequence you may not convey it at all. For example, if you -agree to terms that obligate you to collect a royalty for further conveying from -those to whom you convey the Program, the only way you could satisfy both those terms -and this License would be to refrain entirely from conveying the Program. - -### 13. Use with the GNU Affero General Public License. - -Notwithstanding any other provision of this License, you have permission to link or -combine any covered work with a work licensed under version 3 of the GNU Affero -General Public License into a single combined work, and to convey the resulting work. -The terms of this License will continue to apply to the part which is the covered -work, but the special requirements of the GNU Affero General Public License, section -13, concerning interaction through a network will apply to the combination as such. - -### 14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of the GNU -General Public License from time to time. Such new versions will be similar in spirit -to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that -a certain numbered version of the GNU General Public License “or any later -version” applies to it, you have the option of following the terms and -conditions either of that numbered version or of any later version published by the -Free Software Foundation. If the Program does not specify a version number of the GNU -General Public License, you may choose any version ever published by the Free -Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU -General Public License can be used, that proxy's public statement of acceptance of a -version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no -additional obligations are imposed on any author or copyright holder as a result of -your choosing to follow a later version. - -### 15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER -EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE -QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE -DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -### 16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY -COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS -PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, -INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE -OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE -WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - -### 17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided above cannot be -given local legal effect according to their terms, reviewing courts shall apply local -law that most closely approximates an absolute waiver of all civil liability in -connection with the Program, unless a warranty or assumption of liability accompanies -a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -## How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to -the public, the best way to achieve this is to make it free software which everyone -can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them -to the start of each source file to most effectively state the exclusion of warranty; -and each file should have at least the “copyright” line and a pointer to -where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like this -when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type 'show c' for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate parts of -the General Public License. Of course, your program's commands might be different; -for a GUI interface, you would use an “about box”. - -You should also get your employer (if you work as a programmer) or school, if any, to -sign a “copyright disclaimer” for the program, if necessary. For more -information on this, and how to apply and follow the GNU GPL, see -<<http://www.gnu.org/licenses/>>. - -The GNU General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may consider it -more useful to permit linking proprietary applications with the library. If this is -what you want to do, use the GNU Lesser General Public License instead of this -License. But first, please read -<<http://www.gnu.org/philosophy/why-not-lgpl.html>>. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index ccc46a010..000000000 --- a/README.md +++ /dev/null @@ -1,107 +0,0 @@ -# QuasselDroid-ng - -[](https://ci.kuschku.de/job/QuasselDroid-ng/) -[](https://github.com/justjanne/QuasselDroid-ng/releases) - -Quassel is a distributed, decentralized IRC client, written using C++ and Qt. -QuasselDroid is a pure-java client for the Quassel core, allowing you to connect -to your Quassel core using your Android ™ phone. - -*Inspired by and based on [QuasselDroid](https://github.com/sandsmark/QuasselDroid)* - - - -##Build Requirements - -QuasselDroid requires you to have the latest version of gradle installed, and -a recent version of the Android SDK installed (and configured via the -environment variable ANDROID_HOME) - -QuasselDroid uses the following libraries (although these are automatically -downloaded from maven central): - -* [**AndroidSlidingUpPanel**](https://github.com/justjanne/AndroidSlidingUpPanel) - Apache 2.0 -* [**libquassel-java**](https://github.com/justjanne/libquassel-java) - LGPL 3.0 -* [**Guava**](https://github.com/google/guava) - Apache 2.0 -* [**Joda-Time**](https://github.com/JodaOrg/joda-time/) - Apache 2.0 -* [**Joda-Convert**](https://github.com/JodaOrg/joda-convert) - Apache 2.0 -* [**Material Drawer**](https://github.com/mikepenz/MaterialDrawer) - Apache 2.0 -* [**Material Dialogs**](https://github.com/google/guava) - MIT -* [**ButterKnife**](https://github.com/JakeWharton/butterknife/) - Apache 2.0 -* [**Android Support Libraries**](http://developer.android.com/tools/support-library/index.html) - Apache 2.0 - *Android Support Library requires the corresponding package to be installed in - the SDK manager* - -##Building - -The build process uses gradle, and requires it to be available as command -"gradle". Use the `install.sh` script to pull and build the dependencies. - -Run `gradle tasks` to see possible tasks, `gradle assembleRelease` to assemble a -release build and `gradle installDebug` to install a debug build on a device -connected via `adb`. - -To sign your releases, [generate a keypair](http://developer.android.com/tools/publishing/app-signing.html) -and create a file named `signing.gradle` in the `app/` folder with the following -content to let gradle automatically sign your builds. - -``` - storeFile=/path/to/your/keystore/here.keystore - storePassword=passwordofyourkeystorehere - keyAlias=nameofyourkeyhere - keyPassword=passwordofyourkeyhere -``` - -##Note - -This is a very early alpha version, and should not be used as daily driver -just yet. - -##Authors - -*(in chronological order of appearance)* - -* **Frederik M. J. Vestre** (freqmod) - Initial qdatastream deserialization attempts -* **Martin "Java Sucks" Sandsmark** (sandsmark) - Previous protocol implementation, previous (de)serializers, project (de)moralizer -* **Magnus Fjell** (magnuf) - Legacy UI, Previous Android stuff -* **Ken Børge Viktil** (Kenji) - Legacy UI, Previous Android stuff -* **Janne Koschinski** (justJanne) - New deserialization, Current UI version, Annotation Processors, Push Notification frontend -* **Pierre-Hugues Husson** (phhusson) - Push Notification backend - -##History - -The project was originally started by freqmod in December 2010 as a simple PoC, and then expanded by magnuf, sandsmark and Kenji until late 2014 into a usable Android app. At that time justJanne started a first fork to introduce Holo design, then rebased that fork and turned it into a pull request. Later finding more and more missing features, and more and more bugs, justJanne ended up rewrite large parts of the code, and became the sole maintainer in late 2015. - -As it became obvious that it would be increasingly harder to properly maintain the software, justJanne decided to rewrite it around that time, and implement the full protocol (not just a subset) this time around, also focusing on better design this time. - -The older implementation is still available at <https://github.com/sandsmark/QuasselDroid>. - -##License - -> This program is free software: you can redistribute it and/or modify it -> under the terms of the GNU General Public License as published by the Free -> Software Foundation, either version 3 of the License, or (at your option) -> any later version. - -> This program is distributed in the hope that it will be useful, -> but WITHOUT ANY WARRANTY; without even the implied warranty of -> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -> GNU General Public License for more details. - -> You should have received a copy of the GNU General Public License along -> with this program. If not, see <<http://www.gnu.org/licenses/>>. diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index bfeb86063..000000000 --- a/app/build.gradle +++ /dev/null @@ -1,207 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -apply plugin: 'com.android.application' -apply plugin: 'me.tatarka.retrolambda' -apply plugin: 'com.neenbedankt.android-apt' - -dependencies { - repositories { - flatDir { - dirs 'libs' - } - } -} - -if (project.hasProperty("storeFile")) { - android { - signingConfigs { - release { - storeFile file(project.property("storeFile")) - storePassword project.property("storePassword") - keyAlias project.property("keyAlias") - keyPassword project.property("keyPassword") - } - } - - buildTypes { - release { - signingConfig signingConfigs.release - } - beta { - signingConfig signingConfigs.release - } - } - } -} - -def getGitHash = { -> - def stdout = new ByteArrayOutputStream() - exec { - commandLine 'git', 'rev-parse', '--short', 'HEAD' - standardOutput = stdout - } - return stdout.toString().trim() -} - -def versionPropsFile = file('version.properties') -def versionBuild = 0 -if (versionPropsFile.exists() && versionPropsFile.canRead()) { - def Properties versionProps = new Properties() - - versionProps.load(new FileInputStream(versionPropsFile)) - def runTasks = gradle.startParameter.taskNames - versionBuild = Integer.valueOf(versionProps['VERSION_BUILD'].toString()) - if (':app:assembleBeta' in runTasks || 'assembleBeta' in runTasks || ':app:assembleRelease' in runTasks || 'assembleRelease' in runTasks || ':app:assemblebeta' in runTasks || 'assemblebeta' in runTasks || ':app:assemblerelease' in runTasks || 'assemblerelease' in runTasks) { - println "Increasing version number" - versionBuild = versionBuild + 1 - } - versionProps['VERSION_BUILD'] = versionBuild.toString() - versionProps.store(versionPropsFile.newWriter(), null) -} else { - // Get jenkins build number from environment - versionBuild = Integer.valueOf(System.getenv("BUILD_NUMBER")) -} - - -def rawVersionName = "0.2.0" - -android { - compileSdkVersion 24 - buildToolsVersion "24.0.2" - - defaultConfig { - applicationId "com.iskrembilen.quasseldroid" - minSdkVersion 16 - targetSdkVersion 24 - versionCode versionBuild - versionName rawVersionName + " Build #" + versionBuild - buildConfigField "String", "VERSION_HASH", "\"${getGitHash()}\"" - } - defaultConfig { - vectorDrawables.useSupportLibrary = true - } - buildTypes { - release { - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - - applicationVariants.all { variant -> - variant.outputs.each { output -> - if (output.zipAlign) { - def fileName = output.outputFile.name - .replace(".apk", String.format("-%s-build%d.apk", rawVersionName, versionBuild)) - .replace("app-", "QuasselDroidNG-") - output.outputFile = new File(output.outputFile.parent, fileName) - } - } - } - } - - beta { - initWith release - applicationIdSuffix ".beta" - } - - debug { - applicationIdSuffix ".debug" - - minifyEnabled true - shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - applicationVariants.all { variant -> - variant.resValue "string", "versionName", variant.versionName - variant.resValue "string", "versionCode", String.valueOf(versionBuild) - variant.resValue "string", "versionHash", getGitHash() - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_7 - } - packagingOptions { - exclude 'META-INF/DEPENDENCIES.txt' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/NOTICE.txt' - exclude 'META-INF/NOTICE' - exclude 'META-INF/LICENSE' - exclude 'META-INF/DEPENDENCIES' - exclude 'META-INF/notice.txt' - exclude 'META-INF/license.txt' - exclude 'META-INF/dependencies.txt' - exclude 'META-INF/LGPL2.1' - } - lintOptions { - abortOnError false - } -} - - -dependencies { - testCompile 'junit:junit:4.12' - - // General Java libs - compile 'com.google.guava:guava:19.0' - compile 'org.greenrobot:eventbus:3.0.0' - - compile 'net.danlew:android.joda:2.9.4.1' - compile 'org.joda:joda-convert:1.8' - - // UI Libs - compile 'com.bignerdranch.android:expandablerecyclerview:2.0.4' - compile(name: 'library-release', ext: 'aar') - // This dependency can be removed as soon as the requires ressources are copied over. - compile('com.mikepenz:materialdrawer:5.0.3@aar') { transitive = true } - compile('com.github.afollestad.material-dialogs:core:0.8.5.3@aar') { transitive = true } - compile('com.github.afollestad.material-dialogs:commons:0.8.5.3@aar') { transitive = true } - compile 'com.afollestad:material-cab:0.1.12' - compile 'com.jenzz:materialpreference:1.3' - - // ORM - apt "com.github.Raizlabs.DBFlow:dbflow-processor:3.1.1" - compile "com.github.Raizlabs.DBFlow:dbflow-core:3.1.1" - compile "com.github.Raizlabs.DBFlow:dbflow:3.1.1" - - // Appcompat - compile 'com.android.support:appcompat-v7:24.2.0' - compile 'com.android.support:design:24.2.0' - compile 'com.android.support:support-v4:24.2.0' - compile 'com.android.support:recyclerview-v7:24.2.0' - compile 'com.android.support:preference-v14:24.2.0' - compile 'com.android.support:cardview-v7:24.2.0' - - // SSL - compile 'org.cryptacular:cryptacular:1.1.0' - - // Reactive Libs - compile 'io.reactivex:rxandroid:1.2.1' - compile 'io.reactivex:rxjava:1.1.6' - compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' - compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.4.0' - - // Crashreports - compile 'ch.acra:acra:4.9.0' - - // UI autobinding - compile 'com.jakewharton:butterknife:7.0.1' -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 000000000..49634d1c5 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,559 @@ +import com.android.build.gradle.AppExtension +import org.gradle.api.Project +import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.gradle.plugin.KaptAnnotationProcessorOptions +import org.jetbrains.kotlin.gradle.plugin.KaptExtension +import java.io.ByteArrayOutputStream +import java.util.* + +apply { + plugin("com.android.application") + plugin("kotlin-android") + plugin("kotlin-kapt") +} + +android { + compileSdkVersion(26) + buildToolsVersion("26.0.0") + + signingConfigs { + val signing = project.rootProject.properties("signing.properties") + if (signing != null) { + create("release") { + storeFile = file(signing.getProperty("storeFile")) + storePassword = signing.getProperty("storePassword") + keyAlias = signing.getProperty("keyAlias") + keyPassword = signing.getProperty("keyPassword") + } + } + } + + defaultConfig { + minSdkVersion(15) + targetSdkVersion(26) + + applicationId = "de.kuschku.quasseldroid_ng.test" + versionCode = 1 + versionName = cmd("git", "describe", "--tags", "HEAD") ?: "1.0.0" + + buildConfigField("String", "GIT_HEAD", "\"${cmd("git", "rev-parse", "HEAD") ?: ""}\"") + buildConfigField("long", "GIT_COMMIT_DATE", "${cmd("git", "show", "-s", "--format=%ct") ?: 0}L") + + signingConfig = signingConfigs.getByName("release") + + setProperty("archivesBaseName", "QuasselDroidNG-$versionName") + + javaCompileOptions { + annotationProcessorOptions { + arguments = mapOf( + "room.schemaLocation" to "$projectDir/schemas" + ) + } + } + } + + buildTypes { + getByName("release") { + //proguardFiles("proguard-rules.pro") + } + + getByName("debug") { + applicationIdSuffix = "debug" + } + } +} + +val appCompatVersion = "26.1.0" +val appArchVersion = "1.0.0-alpha9-1" +dependencies { + implementation(kotlin("stdlib")) + + implementation(appCompat("support-v4")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + implementation(appCompat("appcompat-v7")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + implementation(appCompat("design")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + implementation(appCompat("customtabs")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + implementation(appCompat("cardview-v7")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + implementation(appCompat("recyclerview-v7")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + + implementation(appArch("lifecycle", "runtime", version = "1.0.0")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + implementation(appArch("lifecycle", "extensions")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + kapt(appArch("lifecycle", "compiler")) + + implementation(appArch("persistence.room", "runtime")) { + exclude(group = "com.android.support", module = "support-media-compat") + } + kapt(appArch("persistence.room", "compiler")) + + implementation(appArch("paging", "runtime", version = "1.0.0-alpha1")) { + exclude(group = "junit", module = "junit") + } + + implementation("org.threeten:threetenbp:1.3.6") { + exclude(group = "com.android.support", module = "support-media-compat") + } + + implementation("com.jakewharton:butterknife:8.7.0") { + exclude(group = "com.android.support", module = "support-media-compat") + } + kapt("com.jakewharton:butterknife-compiler:8.7.0") + + implementation("ch.acra:acra:4.9.2") { + exclude(group = "com.android.support", module = "support-media-compat") + } + + implementation(project(":invokerannotations")) + kapt(project(":invokergenerator")) + + testImplementation("android.arch.persistence.room:testing:1.0.0-alpha9") { + exclude(group = "com.android.support", module = "support-media-compat") + } + testImplementation("junit:junit:4.12") { + exclude(group = "com.android.support", module = "support-media-compat") + } + + androidTestImplementation("com.android.support.test:runner:0.5") { + exclude(group = "com.android.support", module = "support-media-compat") + } + androidTestImplementation("com.android.support.test:rules:0.5") { + exclude(group = "com.android.support", module = "support-media-compat") + } +} + +kapt { + arguments(delegateClosureOf<KaptAnnotationProcessorOptions> { + arg("eventBusIndex", "de.kuschku.quasseldroid_ng.EventBusIndex") + }) +} + +fun cmd(vararg command: String) = try { + val stdOut = ByteArrayOutputStream() + exec { + commandLine(*command) + standardOutput = stdOut + } + stdOut.toString(Charsets.UTF_8.name()).trim() +} catch (e: Throwable) { + e.printStackTrace() + null +} + +fun Project.properties(fileName: String): Properties? { + val file = file(fileName) + if (!file.exists()) + return null + val props = Properties() + props.load(file.inputStream()) + return props +} + +/** + * Builds the dependency notation for the named AppCompat [module] at the given [version]. + * + * @param module simple name of the AppCompat module, for example "cardview-v7". + * @param version optional desired version, null implies [appCompatVersion]. + */ +fun appCompat(module: String, version: String? = null) + = "com.android.support:$module:${version ?: appCompatVersion}" + +/** + * Builds the dependency notation for the named AppArch [module] at the given [version]. + * + * @param module simple name of the AppArch module, for example "persistence.room". + * @param submodule simple name of the AppArch submodule, for example "runtime". + * @param version optional desired version, null implies [appCompatVersion]. + */ +fun appArch(module: String, submodule: String, version: String? = null) + = "android.arch.$module:$submodule:${version ?: appArchVersion}" + +fun Project.android(f: AppExtension.() -> Unit) + = configure(f) + +fun Project.kapt(f: KaptExtension.() -> Unit) + = configure(f) + +fun DependencyHandlerScope.androidJacocoAgent(dependencyNotation: Any) + = "androidJacocoAgent"(dependencyNotation) + +fun DependencyHandlerScope.androidJacocoAgent(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "androidJacocoAgent"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.androidJacocoAnt(dependencyNotation: Any) + = "androidJacocoAnt"(dependencyNotation) + +fun DependencyHandlerScope.androidJacocoAnt(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "androidJacocoAnt"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.androidTestAnnotationProcessor(dependencyNotation: Any) + = "androidTestAnnotationProcessor"(dependencyNotation) + +fun DependencyHandlerScope.androidTestAnnotationProcessor(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "androidTestAnnotationProcessor"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.androidTestApk(dependencyNotation: Any) + = "androidTestApk"(dependencyNotation) + +fun DependencyHandlerScope.androidTestApk(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "androidTestApk"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.androidTestImplementation(dependencyNotation: Any) + = "androidTestImplementation"(dependencyNotation) + +fun DependencyHandlerScope.androidTestImplementation(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "androidTestImplementation"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.androidTestJackPlugin(dependencyNotation: Any) + = "androidTestJackPlugin"(dependencyNotation) + +fun DependencyHandlerScope.androidTestJackPlugin(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "androidTestJackPlugin"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.androidTestProvided(dependencyNotation: Any) + = "androidTestProvided"(dependencyNotation) + +fun DependencyHandlerScope.androidTestProvided(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "androidTestProvided"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.androidTestWearApp(dependencyNotation: Any) + = "androidTestWearApp"(dependencyNotation) + +fun DependencyHandlerScope.androidTestWearApp(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "androidTestWearApp"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.annotationProcessor(dependencyNotation: Any) + = "annotationProcessor"(dependencyNotation) + +fun DependencyHandlerScope.annotationProcessor(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "annotationProcessor"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.apk(dependencyNotation: Any) + = "apk"(dependencyNotation) + +fun DependencyHandlerScope.apk(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "apk"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.archives(dependencyNotation: Any) + = "archives"(dependencyNotation) + +fun DependencyHandlerScope.archives(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "archives"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.implementation(dependencyNotation: Any) + = "implementation"(dependencyNotation) + +fun DependencyHandlerScope.implementation(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "implementation"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.debugAnnotationProcessor(dependencyNotation: Any) + = "debugAnnotationProcessor"(dependencyNotation) + +fun DependencyHandlerScope.debugAnnotationProcessor(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "debugAnnotationProcessor"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.debugApk(dependencyNotation: Any) + = "debugApk"(dependencyNotation) + +fun DependencyHandlerScope.debugApk(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "debugApk"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.debugImplementation(dependencyNotation: Any) + = "debugImplementation"(dependencyNotation) + +fun DependencyHandlerScope.debugImplementation(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "debugImplementation"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.debugJackPlugin(dependencyNotation: Any) + = "debugJackPlugin"(dependencyNotation) + +fun DependencyHandlerScope.debugJackPlugin(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "debugJackPlugin"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.debugProvided(dependencyNotation: Any) + = "debugProvided"(dependencyNotation) + +fun DependencyHandlerScope.debugProvided(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "debugProvided"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.debugWearApp(dependencyNotation: Any) + = "debugWearApp"(dependencyNotation) + +fun DependencyHandlerScope.debugWearApp(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "debugWearApp"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.default(dependencyNotation: Any) + = "default"(dependencyNotation) + +fun DependencyHandlerScope.default(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "default"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.jackPlugin(dependencyNotation: Any) + = "jackPlugin"(dependencyNotation) + +fun DependencyHandlerScope.jackPlugin(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "jackPlugin"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.kapt(dependencyNotation: Any) + = "kapt"(dependencyNotation) + +fun DependencyHandlerScope.kapt(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "kapt"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.kaptAndroidTest(dependencyNotation: Any) + = "kaptAndroidTest"(dependencyNotation) + +fun DependencyHandlerScope.kaptAndroidTest(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "kaptAndroidTest"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.kaptDebug(dependencyNotation: Any) + = "kaptDebug"(dependencyNotation) + +fun DependencyHandlerScope.kaptDebug(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "kaptDebug"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.kaptRelease(dependencyNotation: Any) + = "kaptRelease"(dependencyNotation) + +fun DependencyHandlerScope.kaptRelease(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "kaptRelease"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.kaptTest(dependencyNotation: Any) + = "kaptTest"(dependencyNotation) + +fun DependencyHandlerScope.kaptTest(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "kaptTest"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.kaptTestDebug(dependencyNotation: Any) + = "kaptTestDebug"(dependencyNotation) + +fun DependencyHandlerScope.kaptTestDebug(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "kaptTestDebug"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.kaptTestRelease(dependencyNotation: Any) + = "kaptTestRelease"(dependencyNotation) + +fun DependencyHandlerScope.kaptTestRelease(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "kaptTestRelease"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.provided(dependencyNotation: Any) + = "provided"(dependencyNotation) + +fun DependencyHandlerScope.provided(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "provided"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.releaseAnnotationProcessor(dependencyNotation: Any) + = "releaseAnnotationProcessor"(dependencyNotation) + +fun DependencyHandlerScope.releaseAnnotationProcessor(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "releaseAnnotationProcessor"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.releaseApk(dependencyNotation: Any) + = "releaseApk"(dependencyNotation) + +fun DependencyHandlerScope.releaseApk(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "releaseApk"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.releaseImplementation(dependencyNotation: Any) + = "releaseImplementation"(dependencyNotation) + +fun DependencyHandlerScope.releaseImplementation(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "releaseImplementation"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.releaseJackPlugin(dependencyNotation: Any) + = "releaseJackPlugin"(dependencyNotation) + +fun DependencyHandlerScope.releaseJackPlugin(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "releaseJackPlugin"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.releaseProvided(dependencyNotation: Any) + = "releaseProvided"(dependencyNotation) + +fun DependencyHandlerScope.releaseProvided(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "releaseProvided"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.releaseWearApp(dependencyNotation: Any) + = "releaseWearApp"(dependencyNotation) + +fun DependencyHandlerScope.releaseWearApp(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "releaseWearApp"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testAnnotationProcessor(dependencyNotation: Any) + = "testAnnotationProcessor"(dependencyNotation) + +fun DependencyHandlerScope.testAnnotationProcessor(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testAnnotationProcessor"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testApk(dependencyNotation: Any) + = "testApk"(dependencyNotation) + +fun DependencyHandlerScope.testApk(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testApk"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testImplementation(dependencyNotation: Any) + = "testImplementation"(dependencyNotation) + +fun DependencyHandlerScope.testImplementation(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testImplementation"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testDebugAnnotationProcessor(dependencyNotation: Any) + = "testDebugAnnotationProcessor"(dependencyNotation) + +fun DependencyHandlerScope.testDebugAnnotationProcessor(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testDebugAnnotationProcessor"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testDebugApk(dependencyNotation: Any) + = "testDebugApk"(dependencyNotation) + +fun DependencyHandlerScope.testDebugApk(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testDebugApk"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testDebugImplementation(dependencyNotation: Any) + = "testDebugImplementation"(dependencyNotation) + +fun DependencyHandlerScope.testDebugImplementation(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testDebugImplementation"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testDebugJackPlugin(dependencyNotation: Any) + = "testDebugJackPlugin"(dependencyNotation) + +fun DependencyHandlerScope.testDebugJackPlugin(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testDebugJackPlugin"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testDebugProvided(dependencyNotation: Any) + = "testDebugProvided"(dependencyNotation) + +fun DependencyHandlerScope.testDebugProvided(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testDebugProvided"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testDebugWearApp(dependencyNotation: Any) + = "testDebugWearApp"(dependencyNotation) + +fun DependencyHandlerScope.testDebugWearApp(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testDebugWearApp"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testJackPlugin(dependencyNotation: Any) + = "testJackPlugin"(dependencyNotation) + +fun DependencyHandlerScope.testJackPlugin(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testJackPlugin"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testProvided(dependencyNotation: Any) + = "testProvided"(dependencyNotation) + +fun DependencyHandlerScope.testProvided(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testProvided"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testReleaseAnnotationProcessor(dependencyNotation: Any) + = "testReleaseAnnotationProcessor"(dependencyNotation) + +fun DependencyHandlerScope.testReleaseAnnotationProcessor(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testReleaseAnnotationProcessor"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testReleaseApk(dependencyNotation: Any) + = "testReleaseApk"(dependencyNotation) + +fun DependencyHandlerScope.testReleaseApk(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testReleaseApk"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testReleaseImplementation(dependencyNotation: Any) + = "testReleaseImplementation"(dependencyNotation) + +fun DependencyHandlerScope.testReleaseImplementation(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testReleaseImplementation"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testReleaseJackPlugin(dependencyNotation: Any) + = "testReleaseJackPlugin"(dependencyNotation) + +fun DependencyHandlerScope.testReleaseJackPlugin(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testReleaseJackPlugin"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testReleaseProvided(dependencyNotation: Any) + = "testReleaseProvided"(dependencyNotation) + +fun DependencyHandlerScope.testReleaseProvided(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testReleaseProvided"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testReleaseWearApp(dependencyNotation: Any) + = "testReleaseWearApp"(dependencyNotation) + +fun DependencyHandlerScope.testReleaseWearApp(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testReleaseWearApp"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.testWearApp(dependencyNotation: Any) + = "testWearApp"(dependencyNotation) + +fun DependencyHandlerScope.testWearApp(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "testWearApp"(dependencyNotation, dependencyConfiguration) + +fun DependencyHandlerScope.wearApp(dependencyNotation: Any) + = "wearApp"(dependencyNotation) + +fun DependencyHandlerScope.wearApp(dependencyNotation: String, + dependencyConfiguration: ExternalModuleDependency.() -> Unit) + = "wearApp"(dependencyNotation, dependencyConfiguration) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 08f3c6edc..d77f40f4e 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,8 +1,8 @@ # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified -# in /opt/android-sdk/tools/proguard/proguard-android.txt +# in /usr/lib/android-sdk/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. +# directive in build.gradle.kts. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html @@ -16,71 +16,13 @@ # public *; #} --dontobfuscate - --dontwarn javax.** --dontwarn com.google.** --dontwarn sndroid.** --dontwarn java.** --dontwarn sun.** --dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement --dontwarn com.nineoldandroids.view.animation.AnimatorProxy - --keepclasseswithmembernames class de.kuschku.** { - <methods>; - <fields>; -} - --keepclassmembers class de.kuschku.** { - <methods>; - <fields>; -} - --keepclasses class de.kuschku.** { - <methods>; - <fields>; -} - - -######################################### -## Bufferknife ## -######################################### --keep class butterknife.** { *; } --dontwarn butterknife.internal.** --keep class **$$ViewBinder { *; } - --keepclasseswithmembernames class * { - @butterknife.* <fields>; -} +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable --keepclasseswithmembernames class * { - @butterknife.* <methods>; -} +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile - -######################################### -## EventBus ## -######################################### --keepclassmembers class ** { - public void onEvent*(***); -} - --keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent { - <init>(java.lang.Throwable); -} - -######################################### -## RetroLambda ## -######################################### --dontwarn java.lang.invoke.* - - -######################################### -## DBFlow ## -######################################### --keep class * extends com.raizlabs.android.dbflow.config.DatabaseHolder { *; } - -######################################### -## AppCompat SearchView ## -######################################### --keep class android.support.v7.widget.SearchView { *; } \ No newline at end of file +# The project is GPL anyway, obfuscation is useless. +-dontobfuscate diff --git a/app/src/androidTest/java/de/kuschku/quasseldroid_ng/ExampleInstrumentedTest.kt b/app/src/androidTest/java/de/kuschku/quasseldroid_ng/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..d3c465393 --- /dev/null +++ b/app/src/androidTest/java/de/kuschku/quasseldroid_ng/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package de.kuschku.quasseldroid_ng + +import android.support.test.InstrumentationRegistry +import android.support.test.runner.AndroidJUnit4 +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getTargetContext() + assertEquals("de.kuschku.quasseldroid_ng", appContext.packageName) + } +} diff --git a/app/src/beta/res/mipmap-hdpi/ic_launcher.png b/app/src/beta/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 56f5cc5f5efc490b410618b8b1aa28b16a373d1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3625 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 vu@Xd2lIS%0D2v-i`_6G@Wmab8|3Ur_0_$XUQTg}*00000NkvXXu0mjfb8G18 diff --git a/app/src/beta/res/mipmap-mdpi/ic_launcher.png b/app/src/beta/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 288e2a703b4f05b21b55ad49693dd1ae34fa6767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2155 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 diff --git a/app/src/beta/res/mipmap-xhdpi/ic_launcher.png b/app/src/beta/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 0a69007e9d6db2002eeaf2e44d07feae3c98ce44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5244 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 Cj2*K8 diff --git a/app/src/beta/res/mipmap-xxhdpi/ic_launcher.png b/app/src/beta/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index bcba70459015762ec70574a5b5e6238ba08fac40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8754 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 NC3$sFt*ph@{{wZ`9;yHU diff --git a/app/src/beta/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/beta/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 5e8cbc29bba2ee8df2f3e245bcca6cc79b95a226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12672 zcmb_@cUTio(0@V+2?Pj82|aW~fzXkfgf6|SbZH7ouL7YLDbkdtG*Lu~ROub*ReEnm zL8^2@efhrc-@pHU_dI*MH_zUEZuWL&=VoSK>uRf#lQNP50044zH6{Jqy6wLL2Hl?Z z7haIuRzw~cbwlv&5dgN0zP*OHsy+6&?LYlr0b=;x``!{6Je41L8o1bd`dGW$0epOX z1fM%QdDvLH+6lV2JG|eOWdr~a0Cgp_q3?$sbH5MF%FQ>%J|o*%T9x&^fr;TT7!0_- z)<TuYl-<i772NWLlJ>``p&{&dUN8HXn2*tvG{6u*GGZgv3=%F1fnkz|?8{yx%Q+NW zoL(1x+uh9G&DhP(&RG21nlrL}a%5;^;uRER)Vf@TH6rIyOGKbUi6GSf-y4SHFT&rw zU+E-|X>5~vy(xH)DwN2rL+kocI6FnMNP<n72ZUM)=*R4z6&tSKclXXx;5IkZ%}lg? zBhpewXN-ikCn;BXC^{hd9$;pZY-GkKAmxNxOHZMl#ty_uiY4!NA@Tb@lr>z1-xX7C zAt}^2lkM6}Gzq@v7cEV%#k4yYvBkL8JmmDnOrG5dRysnJ{kPwC_esEV<vV+VP6Y#3 zrJeYUt$efnuZv8A^LzQVpP*M_b1g=~po<Vq9;qaPJA!RP6bGmn7}w2uIi;NKdHUhH zWPSL-nzL!hfh?OJKk?^0s*?JM%D+d8k|kz=v){`CM@a;UaOdHnj1q*hy*H(SKF`n3 zdF4+&&5e82{ruVe%oQ+teE9(@r)YRUB2fG+b0&+dlPM4Kq}z$U@l+}JTNsE0CAX;A z_xofnXsKl6C>eXBu`}=f*;o~lvGj6*A5dKuxMtI;J14oPHD43SS-*_W#U&`6fFBpB zrz61g7beug%S@YpLGyLko4xIp6_6{f1sbBAR!)Er%uQ!I?()!HGFhAo<R?GEuNTtb zqqO!ct&hKC7Iti)uL4IKByx_o-Ex-5%wnkmprvC`RDjwvRbcM0+V7SS7P)I$!Hi2F z)g&FCvF2;anbO?ID??`Mh^h~Ku4T_nCEus@2NKo*Xbxo0IZEhzcaHTYTXslZO(Q`@ z(Kj%Tm%U<L&}BrTNRn!XaT)Ca$C`@&XTc*+4GHYM80uXG;O5jf#WvzLqyh#^kVex* zzNs6+Cu6u*@+ib9E%q|0Ngk*>IKK9d+l<POH(etxy;w;_um}0`U)H0$Rpoj?mYj8f zjg<h;MwM8OLV&N9`#u#)_6;BQI27Oi^>jUr?ayqTzei=uD>60qiv17k$o4_p!4NM2 z+@pZ~LEvNIIF&mbe6|2Qe_|bXh)O7uGdPVrw=G)jGPLy_>Ka^>;6q&-j9X8F>~hJV zGmyl86Sm1-uI`Th8H|#6&i}~fPI^JeUH<f<(7OvnoSlHb(!HbTdgekO8F$ksNv5@+ z`dSnA!~R30wB&q;)ir%S@NhEip;&kES61S}*ay=6pz{1OuzN-!f1=C+JDVHTvQS_g zf!@Tw<Fkyx7E@TZcx~><ijCf3pJHNW6~NIvuwBF!sVp49PCNm4_Dsp~z;K0=jqr`a z9e|asXz$A>3GMXRoo$_`9na?54hgJq0kBG0sOd2u#YHS9oGnl{hH5*oy|75PtC#J% z`%cokHwYT7P!TtN#^DB{?-wlK(&w7{p$~(TA9Bk1%a2v9+YEkPXRozk0^PXWJ>PAi zQt`j1V>6Z1&PvN)z-r_owjU#Rub67PMM~9njc}49sKO~3|L*kckE)Sw&?df6;gaYR z&koM8_a3<PD?_|$07ZOMPViu=@sWbJ!ugG>OuF-<%_K$Gp!ehN@&3*qlU*$uKlT2~ zWw33wBupeo1nJIut@TLK4Vh~nkZ5n^b^7;%XMaS^UWB2FV$R2flzzRo1b<#Kq&^>o zo#&j1dM~(>Kk|k_H8&ZvmN<-e`|1;aKfqGxO?{%DD<FguB?1$P6T?JR3K0)kfTWzH z`&S2DvUz{9;!BpHhcchXo}C}m>IIGd)U7uB>0S)^UI5bS$qI?&)WIwpP+Iqllo1S& zhlHSoi5Um~^4ukR$Q~3y#ZB{3Dtu`r2VvHd+{dPbsLOVN`S3F-sj>Kq@myImFjC53 zXHqO9leP2zrW+vftMqyvgU^vrLg~RqRB~=C)a~?|6TA-z{(PUF6AKoJl4DD}bQjU% z4Ey290ZjQ~y%2x;@%Q^_RH@6qmTPeE6Vs^uv@4iE>jl%yU_BDm6km{Q>aF!|>oLrZ zu4arlm+x=L#~)=pcnA`ThGMQBTXy3bSygt18(&%a6MeKlf1!DO{Hsvrw0N}7dzn;* zgfAZ!ZWP2XoB39ixKj615JbiV_E4Er4a)&XY<v~#w(ybc{(x-}M~i2+(Gc6T{<EuI zIH8As_d1b{L~FB0&!4gU;Tun(KwV;*{l9vn00&G&8%oIN+}#Fxp5;awuh`S0vO_-f zj$otpK~AdT<0eTc$N19MHZ@(kw-)noVnndYV@>lIMOuCgHt&X!2R}~25(b%GB7RA< zb#9#}F7|Xx>y$lk;w~b2o1oK<IqhM&{$vhmoS<+Wn$WQ5t$HPOpU@45r$yf0bantm zch&`)mEDIy#+eEhxxKQ^ljFUoJ&~sszphS4Yn{c9+JR878p5xP6JnD2HFnhcLpDEU zgQzn92q=xm&B8@rf*8Bs+|y`I|CsyxfGy8oQxvq<cn4%7`yqL|ud1n0q<?}fx9AX{ zJQhwzx_89!RSO&H3}Y0!<jG7>;5^A#cp(w{rgpil`wMGVfn9=4Vbvm|eQEuxwG@4R z0F<1g)(+5YItKu~xSFm?6?BH>c^?>R%B@Lh;&CDA)xJ8P#{bT2_QMqix=eB%I%r<B z;z>qPx@`ahFqjscS19r@2Xej8f){Q73~L>AY4IaXS$0ioUF~qO+J@X1H@yL(l{S2R z$d|6h_bOJ)f<S*C-<3_;ma`drSl^jpO&b0gl}RgEa{fNjkw2b+H~aO2o~)QuKeF5( z&q~T}c3$Sn1jUIF(jbvA8b2<+^+6ZNZ>?9>8tS6$`w-OVs!)+MP10q@3N5Zo2LB>X z;k3Bo=<=0dRJ_m)nakx`P`S;{ysqZhOgL|f<^g&2*1)feyF#wyk=sRF8h{_r@96Nz z`ooH|%0273r3<uP{)^pJ0;(na>}j5yZ|z;8@;L$}aMsx<xD9ealR!++Z$m=Fqmau4 z8jA{`yK{Yb!M$~<6h38QvhsN^=uX(n_h<bGl{ZX3;FJb*N(9?KQ9m~7=G#yKDo-4v zG_fqUS)yPhTvx`6&b#q|QFGbhW^CRL?t3_IiSG1B;3!3Yfh9Wqe#`*?66fCkK@!>^ zO%8~(MlE{jXkP9MY3vHr*4D0e6_+Wk$KHe!fM|mY{;}#?|2g1Fx#YL%TH;$-2bdyO zgc*BFIogiK2Sn>^i#%;fCFtY!FWABpu<N|fGLaRZP8b^Am<-=AKbiW5c?b@nQKMI9 z;lG0qxs}zX3RG7wOZ~KvHa5A}WnwDtchP$d4h1UfW1FD%<P-|bY3z*>DfBt$6D@)m z^DqRTg(g&(qCs>G+5i}TEgJ#us;CLC@2yF7`Ob+&r;WfJ;fmzJjGzg=KVIpfZ}As3 zzelY83SU?shn=<~F+%a*a|`+DmVGIws>CY)K<ix*aVmyVbYN~$73+7ZpI|uN&S0R` z<#!*n)3f_#Wd!i;txi!Bvlt_VCgx0M#1NdfxZ`z+@NHu(4ow@Ls#Z#%n{oA%#`)O+ zRrrkwJXZu1AzT=T79G%6X29gqL{@jy=?0f<6~J?oLu$+F2?omQh!n#JljcpwC*ry! zuPOE@|MqT1DuOXPCej4Dd5>~~|6+<{v5(Kf)+oPSmuTp=TDk3?<E{MtWwI|Xe{P)j z=vUD@eE7$o8<HpjDa_!~qRPPiX4Cc*gkoUf&ZQ#P%lcV^VvK-yVE%NYR2a_?&089q zQ5ySr#^(|2FAM%!)DR75%Y)_Kn{w7R+LZ-Xj6bk!KWAroOgTA7Piq*ohQfzgJY=Q4 zG^%g%CpOiYf>@0^*epD^gqqrrvFv?oUmlhsm^~3t3ps81xIRq;QQmuTa>j3yny`F8 zltK6Qqi-4acVic{ENquSKb?z)XJ5R)6&<Xb2QN#5sThcl*H*9A8&IgM`#W*g2CWO3 zgEZg2J`R(v#6dIQ0)^S+h%bjaFsb);$V_L&uwb{FV*@02=F;*>ck$W9Y!6`=p;|ka z)Gth~Fo@hX%Yebe?mqQ<k_B@9EYVfh*oU|@axEv;5MW#e0nqxbhyj2-aQkO)f<BRe zXmC)LAI;p7ulSgpt|6_znGZcEx*Us)DnZxq6a8?xGzPw_1>&l&AuyHSR0{vhE`x@W zct1M-Sy=PhM@^r5o%MWnKy$mp%RXENlUBa+CpMF_wmqGLezRC~=ROy*`X13n$EX3Y zYS3o5`Ie|=GY7GqXHR{?wdrWPKjznyZ*%-UX;=9$)La<9ks_=XPOcch1&hvVv7XF< z6BQmvpddd^2OLZP5aiy;{o;tc?kJ-#OChQG{(UXuP&+(xNb1O0i>DR&sD1JdHGk~m z$VL+S;}Oo*S%hVt6-RuaF_`gwBN{$jKu$28Lga5a3MCXWccu2Oc6sfoLuc+Lo?C#l zf}dHbsSd;Cy8rzv2gcOBARCC&!ipH>2&V;*JqeH4$_N3<`tN7xf=EiTmyP|Ebex!K zVrEMR_~SONfVe2x-kxk+EmMCwg24lKXPGAYXFGGercQEqZ?$^3-eA0^T`uLoh#YI! z6|wjJ3A!PV>QL~46^x361|+Ux+D!MNM3`EIA!c4Lg8@H;J{`<BQkL-Pm>d1{9o3^M z()8WWbYY)gvS-M0A1Q-9Zf-&36n<zDs-?&O<~c7$X&*Ei^kO(Ib%cWq+tka{SUKN8 zex=t&%$e@@`?O>(`;)ZA-O(ob>}U-`K7-FB{!C)Z$Z8?n2M24Op(JaG)?$g=pF}U^ zjCx)NVKk<RO6wygDHVbRG}5FdSbrXhzP`jzlGv8T<K_79uStvLhI!5l-jP4swdN4L zANKf=<f%M*koM@lY3OO1EDbJIDtB_?>2OzChCxX<JI4#=vAmQhX)%I0%Mjle!B!Bx zxHIKg5A{fM4m1hc#7K<I?`hll%*M{{kN49-Chn34*_LO2S#XkvNH%I!&Q=3g*}lDD zUhd?434!UmHmS|Y$-I*^Rzs&Pkt{neBV1xg?6Y4{K)Xw{9TLGzqGsTSn0L1;F|`D$ zJTVTn`R4R_W!y@)!El(dDg8HZC13pJy}Vn+vZI&bYQO=<_i+x+1~La<`Z*@J$V(m6 zH*0s8^Ybi+&l}o6i;_CuD>TVg^S}M((iRug*vm)^hK5O78yFi$#T;FCLhWDx_dwE5 zP#pYVpR}DzL35D}^=p+k{M*Z|nDw8{mwQvTsr;|7YAKJYdWDL1$_`_VrTTJeBl4yz z5|RXh5EJYM;Ik&;s&MOzgU>USjuAKU`|Z^!@*`Okwx$AMMAi0$Z-_oKwhD9d0KqE0 z_q-4nGYV7>pjNy1_VBxf86pBoS-{TG{kepj`LT@B8$Lq(=NjMRl@^@O`XNW_+XTxT zX0NngiArWknDEJEywAp~I(h+#p$~*!YuW|VL*@K3YHbBl6M0Xg{nTEg0Ub##G;4=B zecGUlMJb!%1};z8%RjV2R?o&k_eM1nmBMf4nx8-D)rpv7T@JX$(I>8RZod{=ouwA- zhSqCsRoHbMf(g6f_Cfp0z`xhAzt{;R?4TOphdzO+Y<9K4P?^XWt|Mfy_3$~P(zAuV z;KXB&Ccn<fg}_1psZD?~Jr(>#K7An+|1~&itDIPN8yYn;kPoaPMv2<Ir2#O`dbc;^ zShCE~rMqub1dzxTi<eJH+k&6H3(pmMYiaeAKKLK&&y^p%__z2)B)G(mdThu>ak9#P zQD(#P^bJGi{f|Ns2*Zp^iyjM{&+nAI{Kdoh0kH^&XyN&J@uL&|7vu~`lVuU$+*x0$ z@C%6nOl0sB`y&1z*Lrl`KhG8j*7Ef!c>4Sj8`*4Ja~=Kf+Xy9V{W67WBunc3SL%9E zXHW}^Efnswk~k)5S+umYA9&Ij?yE*pg{d~(yD8OCzn=M9#e2A+o73}_-O6K%n<xS{ zb<B_gFmk4B%hjiD1C<Y1vR)X}j(ouwai<ME?F>708@r=k#^f+H$gioW-<ELM(nGAy zoP2q3zoO?DvF<TB!l4jmgGnHhrQF)^{dd}HSG7w`_O#;*#eVJeU;~uF4D4A;15H_C z<EsUPGcbmdl4u@BS(V0@W{C?Kes5TMMSedmgg_ho;AE-TM?eYtF&D@CK>2zPi*M@P z8)uT<S|41u@W@484+G+XG1*;H;;SE(d+wXPn6nK21pW=N?*`0OD!&LVZw`u!wghx+ zDpIKuTN9S2s;fmTOqJW<mmlD*8)dpqxN-VS{mR&=mR-S4X$ll}i}4y?lAybv-l15; zK$)itS6nwp@J-!{$}A98i+{i2D;BqcEbO}Kg@+4Zz-tJPI07n5DNmZQC`1dQDL_+6 zZLdOSgWm;vV14f`{NuW08Li>Y>#WONy`F*jUtX;Qg?8?Hlrv;LB@hLWr^0^PWo4|@ zpvC3V{4hjD>gQrAR2{QY)Vig#@#<~pssmx~^JXjoKm>uw87K3mG>Q+|nNND|^nHR= zm;jKxPSP2C`RzcK++yUMw%<Xph&{AO%}rYgDJ@}BUOT<T-|}oJ(50t%_VCG8k!3fs zDIyovzb(gzl|Z#uU;5<T5QZO>xE8mZOSqKNl|7PEfEBLOPZpEn<#sg?2Pws@_KiRO zn4L6$B3sC}4!-Gu;}7Ycn24X5&IhUr@0+HQepP%Y`Q{gGu>M3|$7_W18&mR!IvK1* zF@a1|rotkj0V39<No;Tx+-W)G<)QFa8K*l<6Cun^=W1(tpi!HBVkrGL6QI+~!R}Z< zHT(p@iO%p3LO3%aPGm1n=A;V(=~hJB9Bu084NqHYyFYyAirQl<aBSmOzHSP@|Bm2n zUEY1E`A}o(JFe^esram}8c;2PVdNM)%_IT$AdN72UlkehriA^g?z_FKkX1)Q8gNMp zxfMq^*577tuGWlcCbK#J%e{&?T-t~~LzDb5r4lxQX2}C$JLHc9DDIV>)E7xkc=Ed_ zr4r9Jq)s;zm_*H8b@1?yUJ!QnfmRrFqt8BS;>B|`$xdU!wx_fK!;$ywI9gp?_LQ*) zh>EQiKY#zr1NGy7{i?%R#k2s$ttkZbtzo~q_hEsbCt=IZ2z4H(NeG`lo8dAD%=mDJ z-v9@0Ty`jE99XJAi~Lx)IQfCT{<u11-M2TM@@L(K_^@7;z9J;8CGcJcN>BXas~^1S zqdYbg(c(akQPtLu;-9!6oU8<Pl&~fCdtcHLk>iu27fx7HdTV~(Yg9nX<I*;T1A23U z1Y!8k9+m7bwr4_+<<e|CMOt_dz^+Z&E3WQX=A;3hLMXojp%Qy@f^JeqWa!)9k>3at zo7gd=C80xy`gAvS0WMjsj<~d~y|04mcIv#PFj&{!hv=2beA6EJ8kB|fp++h=i(&CD zk=^!HNF^zNo#t<d73b@F@zxu8j_(|wRjczVM5OmxR>wU|UjB?dtA9#7_KOz*g_<{< zIve$@Tl6k>MLzXrkd3LX3gtw{5x_$Jp<HSCg~%1WWy1k#87}5DvC61&IuAg8+GVzP z*jp8A)T@BHG$;6jmJegD(~Da(27yPzc98#_QZ?L3?DrVEo%xdAxUWuCOAId6*M+DU zS_x}J^zIpD_tfX&e2VQXlnkFdfq_&6x6D;3E7t?l{8`GI{L@QE)sV95K!VS|C5ONa zJxfRjd2m7Y?&RUc$%iE;-vJfu$nE;oUI(?v3CPCzJU%DNb;j1!6)lXydW*GO$?nqf zv`$NM;J_RFRj{`@fRA-bgrC0qgd>|tn&%abim~0y0DN;w-E}laYZRI(@^Tlpc}^S) z17*CdnV)c>HMcNrn#d;DUAzxmtUrLDWrg|$l}*UFnJ;y*>58RHqf#&JR|dofGs*0g zuP!KO?RZ<s(7hwoVw;pw1o1iYP;oNvFbOwO0Al)Q<lyG?&x`FlaNk{ZU5Q_1(tZmr zP8#^XRe_G{@z>;A%=6v2B(~mL$r{VR)R;`IV2~CDPxmS`=!5xilqtLk&!BX7A-zql zbTjKIA+b)b#I6i0WHy6qQa{fk@RMe^Q}edn>G7_KLrG>=8XhxuZvAn4-1ob39)e?{ z>mT>ae<dzfvo6+Ng0F&t77XOr4__GvVNRSLIVtWISKI73ss{en@(1P&x9Kqvov_-G zTR9E4)ul(|ib$XsCfGsPDv)t2RT2N+bI^ol_8;ARB7E1rD~CdQOsY^2lZ<&_F)w~m zP3wI`-}FMHTbe~*nt%OP--nm9Ss@Z$bdH%F#B{s9HW8E7e7oL#J*in}J~eEPjh;$s z9qh+fig!W&N9E1UI;`tM>|1}xzg?PaY<_1Rtkt16VW`28AXmrkA$O0+VygMrY(|>E zHmyfm7ew^|yMXAy#XvCJfBSA;S%p{Ep|L8LqHq}r4MIT{ytgiwtbP0KU+aO_EU6ic zxk=w8Shc>)T81|_5-K*Y7X0I7buT%R`k_@zo4<;=J|}z=ql69F&uJy9PhjiV+C%!{ zy<Y#|L&2+V*z@{XXQskl_<Xs#|0y9YDN7Zrz|`->B1EXbln*mR(qJ$|V>0o27xwo6 z=NRYhiKasgQeepB9fbH1e1;m|H9Vdz_l_QKzOKQp@b$T7(^-t}&Ot|Y*|nr}?%ZlW zAYqx_2oP*2!00n8Zdfnp(mI@$LS3S+Y%keCWweUzM@!#ndw;nmrP@|w_Ll=0@Dh*% zk;pK63e?ym8;K}-Q}jIDci}5tduj2bbGH!l%;w>$%frv`CZgQcV9vyB`Fn<qO}Yvm zf{rILfSt#k)?00|5`Z|FUjc>e(?*`M7m^yK?x)u!aQxyak_%5<iT-K`_`OKSUHwq$ zA7=}+B{A&Oft1kuz8`>QQ@U*;WthOK#WarI(I{^Y$4kH{@8Mf`LeuesFacGD-WX&w z&H~#u1F;KkU!wREqRa7RH(PV+34SvStkOZ~v?{#Zt=zS!qP=RA-ROc5pXjI88aQ1V zd;uyBGN4-Ts0PRJ!3Txrd`k$IHw0tRn|1s8^Zn{r?2lzHT_*S1SPZ=CVhI5|hZ34< zeMdh-f6b!LYyZFujafR8z%@wUKQP@ajJ<TP{>GNH2=e6aqcrRSA;P(v5iN>WRBQ&| zhMWCb-S1X$)+Z({Lz4jaX228eb*GZwWXk9R|5<X`im*#1XaibJE1jlDE<#tvj&WHD z{vT&Qcg(-@T4Dt{obN54<1BZ~#StpN3k#&e0sTKb;X7Uh-Jd30#9U49hWwS1=*#$! zmexwBQx_K?!)n||H~#?W+yn!1kVGYzwxA<{EOFV(LgLNg=9bL1f0X2ps}tohFW1IM z7toXoe4~%5I^%HkGASXFe*g(BX*>iuNy@cU1ph-k3c7!mylmu5a}f2`RLAg`RvrI1 z?5lo&SfbfSC~|JTJn+}KZkhoN@nKm5m6GfBQ_a*OI}4o_Z}x-6EryUwqF^|3f??<L zl*NY2GBnF~WN?cV${1dec0&{wk>57uwTGCVblxdse<92>2hhknGVurWTouvbLmqYJ zal%-^4hm8eVC;BlZ38lLSCtJMh_8tCRz2jUtUPI$e*Gao*mK7{Wm%r<MUa!xMvZSs z^yt;*03h1(!`YixS~=20DJQcEo_=hyt_e08%BCy=D6Efzh-NRPVJ8UeB-S|A|HFWp z4KotxV_hh;aDoLO_hOu^`C`7u*TU>b@N%p)htF@LWCPP10ru(}-e=b1q8iLcwwW=+ z%Z==w4+!ULZGP=J*IINswgz<W-gK$vuJo7lr?3@<1C)-b{r--xwQl&O8^8=jMo&fq z^NJsdwh+r$9(x=n*9cf?h2xW!2`#!SyyO9RhO=i=6))5`N=X+H94~@y%&Tua7<j)v z=NPIxkQS>BH@yY}_O4gcbfF^4MT)5x28Gu|L2}DGi0H6Ow_c22tukbbjyx$L!<mU4 zkjm)Uqm#q{2b&+iCSiSD5yeKrQjlQwcH~9Ztx;h9{P!XH71nv?&V(7A%c85+hBr96 zJ}xcj(o)ys!S$K~DDJ`0qd}?b>e1ii$EUxpEX^F6^&h_A=h-IJIq=u?1$IVVq9$vU z_j{RiS(0moXmAdRCwR%qXa3tGt6LrLKiI7&pLq6&IuX~@Qm-!$j^(O)P*^l$JW!le zalNvq{6w-g!Z`+UQ)F7!lNxki)F%X_pHg7GY9xt))W3rQnl4&ff#X#Yc!nwqeoP#5 z-e@+CzLlKwfbd-n@M9bW@fex7TGN(>O%wfQ6W$TJ3$E3N0;)3^@1IX{q7<8Hd92K* z%39>Rg%v2!SoL!8?&WpUd}PTro^t=B%$Z^VguXU$xwvb*c&;!CPXw_WnI<T=V&Q)q z8rtk2N2f2k8Wk=={<^Nn^zVz)oD93`Z#DJp<v;xM+2h7I__9-n*qxKYtCu9TUD?bI zCd2Fm)pciR3cB*)G^)4Xmb%|?p$9Lr*G|;K{!2Gh-HUp-gyTI+wnS~4ndc)XL~}vm z;*u6&UxXfz$tj0kM}z05o5OeorCG`rj_y1I<z)l^8ZyQP-4Jzei;2%@xmr(7nxKAG z>7sS>q$Fum4cRQ+DGUyx?yCON0$M7k{%=sqZ$^+QKLS+;tArXTN1>a(3{$a_wA7E~ zw%5+TzZ!`8S&1}zn~&O)DX#d_^ecCRp~YY1j8M;N_)eRP)am1EKJk%+%e89Y_4)J- zq(=t;fbIX63xEw9{c`7(7hxEY=bg@Q9p-SqDAw0~Y_m*S26%#umLaAJ{A5}M_Am7d z?8$SaxhgrQSRwQ{Ge&OD4|<1gkKwO;b#o21&<8Ahj5Mg;n{@EiYEAh)B4J;d=2YeL z_{3e$F*nq~-oe9ZPe2$z1W*ZZFIQ}eNiOmPN_nn!2ixH|3H~m^2&`cHQ+KR;SN1-C z{3=>;(X4|es}K2x3fcmdTz63Eo|EJv<+sT~2b`>baVfMB4<eQdfCT5Bm{x16XfVs; zj$nrVT;wB3<-w?DR%*aPli=<G(6-kIbzDv@LjS^J_I|d!y#nru0xDDZ6GPR6=saC{ zpWgEWQ2?0+O|Z2KA&rJ}qtXy7WQ}_iI&lu1TBcoE7SL7j0?}RV@9BQg3`46}3?>=~ z$3$I*DizH}N`vC`LWKDh^E;4oLr7zrLZdT(tU+8}r0|4D<g0GovVTW5KADk$Y)@D- zE&=76>(hwwbD&svNuSVzYZ4=#Am+k_8b0<{7p{-D%fZ%!g;r`A-L|K4wI2h!$n;D@ z=2BljI_mlSO!`P_0|DcF{4OfpjJljPE|JD9dv?9KS4TgrbTt)tm$=Xfo@p3a!LL|V zWMv;83Sk`mBoe2WaomcwgXaTeSlnskuU9;tWlBA8Z<M?rM8|{;yd!4tTdzF=m7-=T z@SRuicA^bf5=+~nJ!#c2zM`R@T4h@)P`sGbvm5rTM0QL~4MpSC-v<*3ES8unu(^(0 z+!UJ`s9^m*J;I79d<u*r!cWmrMAW<_ZM(|dsTDjp*+)GH1557{uZ2a<tmou9^8YdS zx?|6LRX<9VE%K^SdjBZTA3Z>U;5KASFQWW44C=w8H$evalY(r&qNqQTQ{elff|0uQ ztb@&%jz<P0B;|i94;5R<7az-ahIc0PeC#pK-5-xq<P8-JA9W;AD5rNzRlx%HIb`C6 zCjf;&6Q6<t!|G2o6Czf(-imJdgyy)6o)3?x@g5n_R7+3Bx7)#=&!dyxL4p)K$QlE3 z4(2!Hhc5)&M=Z}D=?Vj*cd3qf<yIQdKL}^TH4NXy)hw8nSskCYfaGxY4bGo3yRC*3 z_SzO?STT<0W*c0F9Q!8^dGTE??i!c9F12I$7W1{&?V3I%JCR(~gPE~it${TDO94WR zyjpj^zHInrgP#^c-I$hP2qn+O4USif|D~_L_aY+gLHPyU22n#qASlRYD<3dIZLcMr z_HB3g?u)JBr!=Fe4byYJsil8};pXyxBf1w)euQ46K0RTfL}xXUd2)D|hb&rjy0#2M zR*prZOR^FKXtk@AITYHO&1`$SC4~%3o9GJ`j*<4uH}|{uSOp7~$&|v=f?OXoWMkhh z3mvw6w(7n@{_)M3d4^Dcbq>3_X#&%^-vwB&X6O!nOR=H`6NR}szVu&_^ewX!`IF`0 z)+cTs=Y~Gp`30Xj0={C!b2i+#^3uo=s$dknYX%YXKD)cCi$m@oNJ8|#!#(<E;T~hN zg;^5CxbuNWUh~J#ns1y3{Bni0DZ2SA_t<!F37jI;ww!gpRti;IiTdtxyqv1Dp3%5I z!@+addf@>d?<=<bh;0d}cd#@|ZrLVQoE9!W5jYaCjCmQ<%vL{jToBk1umkWbn4lw- zCoJ6&V~JPIj_dA}kDYsP*#6daPw5_rqocUiBEhTHESBb%^CS(SzLhS+V^+k^i+j5g zx9&SKV{c<0j{9{0C1(B(s4(s*Ga6FKJc~&b2S0XYhx;GQKKeJg7modD0mq$RBtCai zb{>BPZ8_u-DYgu2@w#{P#&|<+F}EH2Eagkc<W!#hs&ipR73^z<M^dIZ{ok*mc~g-I zix5)t>HV?EwEW`)A5+}4?LpYQ9)DXOrNf@(VB6_AtIvo6lo$cZ;w!P>{+#CJxPNUQ z27VCMs9II<Ud(|M-5H{4lUD4E;?ELnUg8ALYJzSWwlSW9SH)jXX5<w1jv@RWk-@!6 zY!o;Lz@Icez@#NLM5!u0aBRSWHllq_3j^=EyAM>%1O|@CMw+yqJvj3AQYpRwE4i5P zre=A?DPte+{A`O~N<v*r>0XsmDHchg50Ih)oRvH!G<}?0k*~;Q4If!vNLxI(zT+D- zdxu-h(blSy>?Vqra-Qj`tZdN0U+f<XtI|y8GhPK`Nv+CJFB3<pEVb)m{9{bw({LKX zF&^L;RBb)-U;A(Rm989f^Re(*S7pKXT^iGY^dmVQ%y08rLUAVT_XB;zZtblf$-R8o zvBJ$nvNd~%ks7;)FUkF8$<i5&ZclKY!onNXgjqHw3p3W1rB0fcE-jHg35#r7L4mPK z0bho5RI%fYq96L$qL79@>Yq#)xaR=Q(dr^H&RLK1hEieCRA}HPjg`KROlnS$NcMTc z;pqG#ZL_(Nisgv0>}h=Lzl0P@jPtJxW6hu^m0{uS#lrSUIe}`ulyUk@ZAo;=jJA-F z2c}R=f56#ud%-g+s5mLISVeh6RO4To;z>t;qf3vKrDb@eF$rOF^P}Tp(|>0U-pUvG zL6sBD)v{}Te*P<-%z*s&m)8B2M$c=Rj&ifeMhM?Z8!;QBNUvU8@j9`SQ=v(GGX6xX zn%R4?Zb&=>ycdxMK?%O{d&?gZY-6uYMv;QA44*&vS^JV{ss4twq-9@K*In^X1Nhri zv`vMT%8TcGYyK)R?OTF27L)5hin#~b+(`s_FC(oWEQdr-E93USJrOA07MTy}vIFp2 zhJc~NG=mRz%mx*H-`D(5ix{IIbL&7tJxk2vy(kyLj!%~$lZe6?QFx-NhsZrlYLs}Q zM<hMm4M!3g24I#dJ30o~@iZ?pu-`shGY%x3!6tew?*w3qbcZL7!GK>O2IVUYvBDSs zMn3u-XjeoToz>hLN^^7n+LK#XvMiTF%~aoaP8L739-IOL{AalUTSMub8JBHpG{O4u zzgJ$z-aI^sM%c%f{sa`j;FsoxilB1ge4Ej7BOcaC2#iqQru*sKYED;mSi+C+F8{pe z0Zoo$R+elHQ%$d@*0a026>eBFP9*M$-6}9~?wqq2FQ{nt^3<uSG@c>2zViuSO*j52 zSF=e*c0Ldw@_Iy-z~iT!8#^4iZS;6e>z?dxub{l#H(~*{MfzWKJ0XAYWIv^BBpiFb zqclF}6&PH$)<3cw`JFgmpX*TBYbOeyn~Pv!n#y<BF`YT-zPIssUslAl@dY7kO$9&n zQH9NW%>ZR;keXlnHi`7YQ~!=cHaLi26x-Gmf1htZ6p=g{&f8+*>|}`eOYu;pk^=GN zj)Yx=men0g_yk8;-3Ox@zn7S6t+Z)gsZ<l{2Th_U!XC$$CrUXO?<anz_Vv?j0yvU~ z^ufu~gtqP6>>?Zq)cbx>=`!)^Tm-1Wg^OgUvu05nwBVz7v5jsaI!*`+B!u$BbH$mY zM56}3bSuG3k4%3=F?bKY=onb-B?ZS!{vumTIqD#_i0pS79<cMC&5yWrLlgnPe?PK| zoR7tc6Ac(`s!_51Z63=A_zqSK{$7Iuhhjbih>r6=5tTk4+K%kdT=S@mH7Te5<=17` z+mQM^2)TX|y2cpV#i47OXjUQsy9gB7lC7%Yr<apQ)np6xyVd#;r6^G3DAE8EGn7p$ zkIW1*Su%3?DZUrREwSf#O0f0b1&6lrSR299lk~Tf+KL3Kj1cxG*Y@pn_`t1=?NWTy zY##F<g#irfPi#w?)NEn$;?Wk}{ZqA5YhDGI1%O$C6Yyki*8dQ9cSu!Cn6rT2DEr9b z`F-cM2OLPi;EIgGCmO3)PZXVudtgZ#x<9m@4p%B$yU)T19KL*)%&m;*s03;TMvu(! zOVkU9_wclG1HRSp;?|=@Vigb8=bdCMgLoAwDfHhyN$TN!W?ZR&9#>KO#gjDC{urKl z7o@3ETqtVu{MJxZ{_Xwa?sAc`0WRX4gYI<{=c6qexGv|L&xZlA)F3TuU9fIncJEVr z?hH>#+Bob%4?Br9QQP7L8E-VUkBRBVzghd9k8Z^pNAhAnYseAR>pgAGH5*(4Qc7GU z-6B6%yJFcOH*|Ja&6TYgQNbThR9+)V)B0J7G5UA(n$2#2)*q+WnsR-{Y1`+0I_&I0 z)<m?yvXdk{c;Lp~k^T9Izt^vN7xK*@XL0xrf>j0OMlBzgX;7ipZtQLd7<Z)kWQ2a$ z()F4di;!njqI70$9C_dRHSs9WxjECWk=!9?=sWcRy>fabj-p$RP1ojHC&**?Y*BuE z%=3xI!`WIDy)PoVRx+FiSUI;jK**Tijo_<@H|#77qUuXwN1`nmRaeBXx1~;yjv-AF zk4}_BDi`c%IEqoCoN*=#dk){Aw^IE09=|9R&lg$(gtP!V(Lqo#VVD8S74qXmP0y-! zEZJ^|O1;<h+2Ki%fe@nu1pT|0@~t4ix(U_seAPGv_Y?jHk0JPHO&9qSP|s;gU$)co zs|GJn?T~fw*)8VunW5l8Pe|b*;2^!nY~5>y0AX051W=*0RR|_U;m78_&F?-MeY&kz zY$js7AH<S;;s3plQt3U3>mB*1OFi__b)^9Z`*m+*$#ri{E-9+fRcrdCkKnUBxy`p4 zJtFI7F^$2P9+c}r54up_AryG`gscWoXUUVC7=-J*&1+ICBSZ?WV1obaZs(;oY_<U} zynmbE^E3o!<45Frr`60$N0-GH5^U#bQC_fREJ(EZxdX}i?N$rKf{vLWP^s5B;I@s> zc@T_X<t|ZWteEqGi3V}<>Iqa>YKI8He)%lyK7eBFed`?nn0;oP84}5f4}nh+qDbAt z4|$N&dk_^8TvGFjVJj@OIbec4w*g18?Rr?3bab9izgwOj>ifyb>bLyRcQIpw(^3cd zJcelP>ztRnH+SoJ^`ktLNW%|a#^qR5ca(V?axZe46W%)&jmXumQ?o%R*tF@~{+4Yz zJEmB1b(HQ6B(*;{Oc7UL*vGGBelxXX7<HL-<f}+hpx`1%MDRbPCdfU<kx&EGbQw7y z?fuxRRMyS{3(tczLC9+W7a#4<a4X$bzv4W@cb6y*0AvmQj9qGP=i7WZ3~ZSBe<VdN z_D8G2)I{7t%uf@+s8A^?b+84)gv;&;GA`sGnN5udfxZL_5Ur<U5XFipd>`d4bgpbP z7ty`nNx207hc2%~7h3ve$Lq2$X9fU?l=%p0560eMgY;`)5mdoMzg2H>FK%&7C^jTt ziu=spUk^=I0#F+gB!ydb1!D~o=8-24Zav4hBvPsfgpW<)OkUxC$lO#<z%5p!=)9Rc z{r}$XA!iB9w)LO)^p4Pb&JY_Kt2YN6?6(M$sJBTgHAZ3QBeH)W0co}%^ewwZ5u+H_ zZquyVR{2ksdmngvEfd*5x8qXC6G|Gw4gS(R>$mk@@!V^%Mk_H608tSO1*282gASOo zB+G{23L@k-EZXc~Zm`>n*klCyYvSo!f^DrST%ZHwLzy(d`*Mp#QvNzg{jSm@un^~L z3s<{qXw!P)3|4O`RBy?Px%~7aZ6l^vMiBrE=a{AAZg*9zcxhrQt_}{Krtk{+kDXO; zEv#;bs21j%q>zZX9ayWn4ks>Gvfybq5dto_mut!siPUCUR7eCuIP^{&k?+gzLjLi= zV4M$qI-=cG1@<k{JA&u-womON692EQ2Kcj}r(vPCA}4g+x4R_(>dM+m-!N98{{z)R B%PIf> diff --git a/app/src/beta/res/values/colors.xml b/app/src/beta/res/values/colors.xml deleted file mode 100644 index 7d2a19715..000000000 --- a/app/src/beta/res/values/colors.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <color name="colorPrimary">#ea3415</color> - <color name="colorPrimaryDark">#c73218</color> -</resources> diff --git a/app/src/beta/res/values/strings.xml b/app/src/beta/res/values/strings.xml deleted file mode 100644 index 361e8cfbd..000000000 --- a/app/src/beta/res/values/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <string name="appName">QuasselBeta</string> -</resources> diff --git a/app/src/debug/res/mipmap-hdpi/ic_launcher.png b/app/src/debug/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index f02f233b234fe04d3e7a1d5dce8795bf34a1332d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3695 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 N002ovPDHLkV1jO56}tcc diff --git a/app/src/debug/res/mipmap-mdpi/ic_launcher.png b/app/src/debug/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 340ff3d1c529e6369b13682158699d4b32f55526..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2215 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 diff --git a/app/src/debug/res/mipmap-xhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 0030cbf7d5586f47799781df57c0c4149d15e274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5299 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 FV1npjVx#~7 diff --git a/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 033fbd78ef7a3b28198bbb70d7c7adfd618c7d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8677 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 diff --git a/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/debug/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 601e278f167ad46b52ec1f35f03e2f9cab08494e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12655 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 diff --git a/app/src/debug/res/values/colors.xml b/app/src/debug/res/values/colors.xml index 4da0869ba..c30aee972 100644 --- a/app/src/debug/res/values/colors.xml +++ b/app/src/debug/res/values/colors.xml @@ -1,26 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - <resources> - <color name="colorPrimary">#009688</color> - <color name="colorPrimaryDark">#088278</color> + <color name="colorPrimary">#F57C00</color> + <color name="colorPrimaryDark">#E65100</color> + <color name="colorAccent">#afb42b</color> </resources> diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml deleted file mode 100644 index e3c49d182..000000000 --- a/app/src/debug/res/values/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <string name="appName">QuasselDebug</string> -</resources> diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ca96139bc..37bc00cb4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,183 +1,32 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="de.kuschku.quasseldroid_ng"> - - <uses-permission android:name="android.permission.INTERNET"/> - - <application - android:name=".QuasselDroidNG" - android:allowBackup="true" - android:icon="@mipmap/ic_launcher" - android:label="@string/appName" - android:supportsRtl="true"> - - <service android:name=".service.QuasselService"/> - - <activity - android:name=".ui.LoginActivity" - android:label="@string/appName" - android:launchMode="singleTask" - android:theme="@style/AppTheme.Light"> - <intent-filter> - <action android:name="android.intent.action.MAIN"/> - - <category android:name="android.intent.category.LAUNCHER"/> - </intent-filter> - </activity> - - <activity - android:name=".ui.chat.MainActivity" - android:label="@string/appName" - android:parentActivityName=".ui.LoginActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.chat.ChannelDetailActivity" - android:label="@string/titleChannelDetails" - android:parentActivityName=".ui.chat.MainActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.chatlist.ChatListListActivity" - android:label="@string/titleEditChatLists" - android:parentActivityName=".ui.chat.MainActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.chatlist.ChatListEditActivity" - android:label="@string/titleEditChatList" - android:parentActivityName=".ui.coresettings.chatlist.ChatListListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.chatlist.ChatListCreateActivity" - android:label="@string/titleCreateChatList" - android:parentActivityName=".ui.coresettings.chatlist.ChatListListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.network.NetworkListActivity" - android:label="@string/titleEditNetworks" - android:parentActivityName=".ui.chat.MainActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.network.NetworkEditActivity" - android:label="@string/titleEditNetwork" - android:parentActivityName=".ui.coresettings.network.NetworkListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.network.NetworkCreateActivity" - android:label="@string/titleCreateNetwork" - android:parentActivityName=".ui.coresettings.network.NetworkListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.network.server.NetworkServerListActivity" - android:label="@string/titleEditNetworkServers" - android:parentActivityName=".ui.coresettings.network.NetworkEditActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.identity.IdentityListActivity" - android:label="@string/titleEditIdentities" - android:parentActivityName=".ui.chat.MainActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.identity.IdentityEditActivity" - android:label="@string/titleEditIdentity" - android:parentActivityName=".ui.coresettings.identity.IdentityListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.identity.IdentityCreateActivity" - android:label="@string/titleCreateIdentity" - android:parentActivityName=".ui.coresettings.identity.IdentityListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.identity.nick.IdentityNickListActivity" - android:label="@string/titleEditNicks" - android:parentActivityName=".ui.coresettings.identity.IdentityEditActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.network.server.NetworkServerEditActivity" - android:label="@string/titleEditNetworkServer" - android:parentActivityName=".ui.coresettings.network.server.NetworkServerListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.ignore.IgnoreListActivity" - android:label="@string/titleEditIgnoreList" - android:parentActivityName=".ui.chat.MainActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.ignore.IgnoreRuleEditActivity" - android:label="@string/titleEditIgnoreRule" - android:parentActivityName=".ui.coresettings.ignore.IgnoreListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.aliases.AliasListActivity" - android:label="@string/titleEditAliases" - android:parentActivityName=".ui.chat.MainActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.coresettings.aliases.AliasEditActivity" - android:label="@string/titleEditAlias" - android:parentActivityName=".ui.coresettings.aliases.AliasListActivity" - android:theme="@style/AppTheme.Light"/> - - <activity - android:name=".ui.setup.AccountSetupActivity" - android:label="@string/titleAccountSetup" - android:parentActivityName=".ui.setup.AccountSelectActivity" - android:theme="@style/SetupTheme"/> - - <activity - android:name=".ui.setup.AccountSelectActivity" - android:label="@string/titleAccountSelection" - android:parentActivityName=".ui.LoginActivity" - android:theme="@style/SetupTheme"/> - - <activity - android:name=".ui.setup.CoreSetupActivity" - android:label="@string/titleCoreSetup" - android:parentActivityName=".ui.chat.MainActivity" - android:theme="@style/SetupTheme"/> - - <activity - android:name=".ui.settings.SettingsActivity" - android:label="@string/titleSettings" - android:parentActivityName=".ui.chat.MainActivity" - android:theme="@style/AppTheme.Light"/> - - </application> + package="de.kuschku.quasseldroid_ng"> + + <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.READ_LOGS" /> + + <application + android:name=".QuasseldroidNG" + android:label="@string/app_name" + android:icon="@mipmap/ic_launcher" + android:theme="@style/AppTheme" + android:allowBackup="true" + android:supportsRtl="true"> + <activity + android:name=".ui.MainActivity" + android:exported="true" + android:label="@string/app_name" + android:theme="@style/SplashTheme"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + <service + android:name=".service.QuasselService" + android:label="@string/connection_service" + android:description="@string/connection_service_description" + android:exported="false" /> + </application> </manifest> diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java deleted file mode 100644 index 944cd7ccc..000000000 --- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel; - -import android.support.annotation.NonNull; -import android.util.Log; - -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.NoSubscriberEvent; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.UUID; - -import de.kuschku.libquassel.events.BacklogReceivedEvent; -import de.kuschku.libquassel.events.LagChangedEvent; - -public class BusProvider { - @NonNull - private final String id; - @NonNull - public EventBus handle; - @NonNull - public EventBus dispatch; - @NonNull - public EventBus event; - - public BusProvider() { - this.id = UUID.randomUUID().toString(); - this.handle = new EventBus(); - BusHandler handleHandler = new BusHandler("QHANDLE"); - this.handle.register(handleHandler); - this.dispatch = new EventBus(); - BusHandler dispatchHandler = new BusHandler("QDISPATCH"); - this.dispatch.register(dispatchHandler); - this.event = new EventBus(); - BusHandler eventHandler = new BusHandler("QEVENT"); - this.event.register(eventHandler); - } - - public void handle(Object o) { - this.handle.post(o); - } - - public void dispatch(Object o) { - this.dispatch.post(o); - } - - public void sendEvent(Object o) { - this.event.post(o); - } - - @NonNull - @Override - public String toString() { - return "BusProvider{" + - "id='" + id + '\'' + - '}'; - } - - public static class BusHandler { - private final String identifier; - - public BusHandler(String identifier) { - this.identifier = identifier; - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEvent(NoSubscriberEvent event) { - if (!(event.originalEvent instanceof LagChangedEvent) && !(event.originalEvent instanceof BacklogReceivedEvent)) - Log.e(identifier, String.valueOf(event)); - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java deleted file mode 100644 index 251b900be..000000000 --- a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java +++ /dev/null @@ -1,359 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel; - - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.Log; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.SocketException; -import java.nio.ByteBuffer; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import javax.security.cert.X509Certificate; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.client.ClientData; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.events.GeneralErrorEvent; -import de.kuschku.libquassel.events.HandshakeFailedEvent; -import de.kuschku.libquassel.events.UnknownCertificateEvent; -import de.kuschku.libquassel.functions.types.HandshakeFunction; -import de.kuschku.libquassel.functions.types.Heartbeat; -import de.kuschku.libquassel.objects.types.ClientInit; -import de.kuschku.libquassel.primitives.QMetaTypeRegistry; -import de.kuschku.libquassel.primitives.serializers.ProtocolSerializer; -import de.kuschku.libquassel.primitives.types.Protocol; -import de.kuschku.libquassel.protocols.DatastreamPeer; -import de.kuschku.libquassel.protocols.LegacyPeer; -import de.kuschku.libquassel.protocols.RemotePeer; -import de.kuschku.libquassel.ssl.CertificateManager; -import de.kuschku.libquassel.ssl.UnknownCertificateException; -import de.kuschku.util.accounts.ServerAddress; -import de.kuschku.util.niohelpers.WrappedChannel; - -import static de.kuschku.libquassel.primitives.QMetaType.Type.UInt; -import static de.kuschku.util.AndroidAssert.assertNotNull; - -/** - * Starts a connection to a core and handles the data in the backend. - * Provides a Client object for interacting with a friendly tree structure of the data. - * - * @author Janne Koschinski - */ -public class CoreConnection { - - @NonNull - private final ServerAddress address; - @NonNull - private final ClientData clientData; - @NonNull - private final BusProvider busProvider; - @NonNull - private final Client client; - @NonNull - private final CertificateManager certificateManager; - @Nullable - private ExecutorService outputExecutor; - @Nullable - private EndableThread inputThread; - @Nullable - private EndableThread heartbeatThread; - @Nullable - private RemotePeer remotePeer; - @Nullable - private WrappedChannel channel; - @Nullable - private Socket socket; - @NonNull - private ConnectionChangeEvent.Status status = ConnectionChangeEvent.Status.DISCONNECTED; - private X509Certificate[] peerCertificateChain; - - public CoreConnection(@NonNull final ServerAddress address, - @NonNull final ClientData clientData, - @NonNull final BusProvider busProvider, - @NonNull final Client client, - @NonNull CertificateManager certificateManager) { - this.address = address; - this.clientData = clientData; - this.busProvider = busProvider; - this.client = client; - this.certificateManager = certificateManager; - } - - @NonNull - public ConnectionChangeEvent.Status getStatus() { - return status; - } - - /** - * This method opens a socket to the specified address and starts the connection process. - * - * @param supportsKeepAlive If the connection may use keepAlive - * @throws IOException - */ - public void open(boolean supportsKeepAlive) throws IOException { - assertNotNull(client); - - status = ConnectionChangeEvent.Status.HANDSHAKE; - client.setConnectionStatus(status); - - // Intialize socket - socket = new Socket(); - if (supportsKeepAlive) socket.setKeepAlive(true); - socket.connect(new InetSocketAddress(address.host, address.port), 10000); - - // Wrap socket in channel for nio functions - channel = WrappedChannel.ofSocket(socket); - - busProvider.event.register(this); - - // Create executor for write events - outputExecutor = Executors.newSingleThreadExecutor(); - - // Execute handshake - handshake(); - } - - /** - * Closes the connection and interrupts all threads this connection has spawned. - */ - public void close() { - assertNotNull(client); - - client.setConnectionStatus(ConnectionChangeEvent.Status.DISCONNECTED); - - // We can do this because we clean up the file handles ourselves - if (inputThread != null) inputThread.end(); - if (heartbeatThread != null) heartbeatThread.end(); - if (outputExecutor != null) outputExecutor.shutdownNow(); - - // Which we do exactly here - try { - if (channel != null) channel.close(); - if (socket != null) socket.close(); - } catch (Exception e) { - // We won’t report these issues, as these don’t matter to us anyway anymore - } - } - - @Nullable - public ExecutorService getOutputExecutor() { - return outputExecutor; - } - - @NonNull - public ClientData getClientData() { - return clientData; - } - - @NonNull - public WrappedChannel getChannel() { - assertNotNull(channel); - - return channel; - } - - @Nullable - public RemotePeer getRemotePeer() { - return remotePeer; - } - - @Nullable - public Socket getSocket() { - return socket; - } - - /** - * Starts the first handshake phase with negotiating the protocol and if SSL or compression are to be used. - * - * @throws IOException - */ - private void handshake() throws IOException { - assertNotNull(channel); - - // Start protocol handshake with magic version and feature flags - QMetaTypeRegistry.serialize(UInt, channel, 0x42b33f00 | clientData.flags.flags); - - // Send list of supported protocols - for (int supportedProtocol : clientData.supportedProtocols) { - QMetaTypeRegistry.serialize(UInt, channel, supportedProtocol); - } - QMetaTypeRegistry.serialize(UInt, channel, 0x01 << 31); - - // Spawn and start a new read thread - inputThread = new ReadThread(); - heartbeatThread = new HeartbeatThread(); - inputThread.start(); - } - - @Subscribe(threadMode = ThreadMode.ASYNC) - public void onEventAsync(HandshakeFailedEvent event) { - this.close(); - } - - @Subscribe - public void onEvent(@NonNull ConnectionChangeEvent event) { - this.status = event.status; - if (event.status == ConnectionChangeEvent.Status.INITIALIZING_DATA && heartbeatThread != null) - heartbeatThread.start(); - } - - public void setCompression(boolean supportsCompression) { - if (supportsCompression) - channel = WrappedChannel.withCompression(getChannel()); - } - - private void setSSL(boolean supportsSSL) { - if (supportsSSL) { - try { - channel = WrappedChannel.withSSL(getChannel(), certificateManager, address, client::setCertificateChain); - } catch (Exception e) { - if (e.getCause() instanceof UnknownCertificateException) { - busProvider.sendEvent(new UnknownCertificateEvent((UnknownCertificateException) e.getCause())); - } else { - busProvider.sendEvent(new GeneralErrorEvent(e)); - } - close(); - } - } - } - - /** - * A runnable that reads from the channel and calls the functions responsible for processing the read data. - */ - private class ReadThread extends EndableThread { - private boolean running = true; - - public ReadThread() { - setName(getClass().getSimpleName()); - } - - @Override - public void run() { - assertNotNull(client); - - try { - boolean hasReadPreHandshake = false; - while (running) { - if (!hasReadPreHandshake) { - final ByteBuffer buffer = ByteBuffer.allocate(4); - assertNotNull(buffer); - getChannel().read(buffer); - - final Protocol protocol = ProtocolSerializer.get().deserialize(buffer); - - // Wrap socket in SSL context if ssl is enabled - setSSL(protocol.protocolFlags.supportsSSL); - // Wrap socket in deflater if compression is enabled - setCompression(protocol.protocolFlags.supportsCompression); - - // Initialize remote peer - switch (protocol.protocolVersion) { - case 0x01: - remotePeer = new LegacyPeer(CoreConnection.this, busProvider); - break; - case 0x02: - remotePeer = new DatastreamPeer(CoreConnection.this, busProvider); - break; - default: - busProvider.sendEvent(new HandshakeFailedEvent("Core too new: Protocol Unsupported")); - close(); - return; - } - - // Mark prehandshake as read - hasReadPreHandshake = true; - assertNotNull(heartbeatThread); - - // Send client data to core - String clientDate = new SimpleDateFormat("MMM dd yyyy HH:mm:ss", Locale.US).format(new Date()); - assertNotNull(clientDate); - busProvider.dispatch(new HandshakeFunction(new ClientInit( - clientDate, - protocol.protocolFlags.supportsSSL, - getClientData().identifier, - false, - getClientData().protocolVersion - ))); - } else { - remotePeer.processMessage(); - } - } - } catch (SocketException e) { - Log.e("libquassel", "Socket closed while reading"); - client.setConnectionStatus(ConnectionChangeEvent.Status.DISCONNECTED); - } catch (Exception e) { - busProvider.sendEvent(new GeneralErrorEvent(e)); - } - } - - @Override - public void end() { - running = false; - } - } - - private class HeartbeatThread extends EndableThread { - private boolean running = true; - - public HeartbeatThread() { - setName(getClass().getSimpleName()); - } - - @Override - public void run() { - try { - assertNotNull(client); - - while (running) { - Heartbeat heartbeat = new Heartbeat(); - busProvider.dispatch(heartbeat); - - Thread.sleep(30 * 1000); - } - } catch (InterruptedException ignored) { - } - } - - @Override - public void end() { - running = false; - this.interrupt(); - } - } - - private abstract class EndableThread extends Thread { - public abstract void end(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/IProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/IProtocolHandler.java deleted file mode 100644 index c2ba4b244..000000000 --- a/app/src/main/java/de/kuschku/libquassel/IProtocolHandler.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel; - -import android.support.annotation.NonNull; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.functions.types.Heartbeat; -import de.kuschku.libquassel.functions.types.HeartbeatReply; -import de.kuschku.libquassel.functions.types.InitDataFunction; -import de.kuschku.libquassel.functions.types.InitRequestFunction; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.objects.types.ClientInitAck; -import de.kuschku.libquassel.objects.types.ClientInitReject; -import de.kuschku.libquassel.objects.types.ClientLoginAck; -import de.kuschku.libquassel.objects.types.ClientLoginReject; -import de.kuschku.libquassel.objects.types.SessionInit; - -public interface IProtocolHandler { - @Subscribe(threadMode = ThreadMode.MAIN) - void onEventMainThread(InitDataFunction packedFunc); - - @Subscribe(threadMode = ThreadMode.MAIN) - void onEventMainThread(InitRequestFunction packedFunc); - - @Subscribe(threadMode = ThreadMode.MAIN) - void onEventMainThread(RpcCallFunction packedFunc); - - @Subscribe(threadMode = ThreadMode.MAIN) - void onEventMainThread(SyncFunction packedFunc); - - @Subscribe - void onEvent(ClientInitReject message); - - @Subscribe - void onEvent(ClientInitAck message); - - @Subscribe - void onEvent(ClientLoginAck message); - - @Subscribe - void onEvent(ClientLoginReject message); - - @Subscribe - void onEvent(SessionInit message); - - @Subscribe - void onEvent(Heartbeat message); - - @Subscribe(threadMode = ThreadMode.MAIN) - void onEventMainThread(HeartbeatReply message); - - @NonNull - Client getClient(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java deleted file mode 100644 index eca9bc5c2..000000000 --- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java +++ /dev/null @@ -1,179 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel; - -import android.support.annotation.NonNull; -import android.util.Log; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; -import org.joda.time.DateTime; -import org.joda.time.Interval; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.events.CoreSetupRequiredEvent; -import de.kuschku.libquassel.events.GeneralErrorEvent; -import de.kuschku.libquassel.events.HandshakeFailedEvent; -import de.kuschku.libquassel.events.LoginRequireEvent; -import de.kuschku.libquassel.functions.types.Heartbeat; -import de.kuschku.libquassel.functions.types.HeartbeatReply; -import de.kuschku.libquassel.functions.types.InitDataFunction; -import de.kuschku.libquassel.functions.types.InitRequestFunction; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.objects.types.ClientInitAck; -import de.kuschku.libquassel.objects.types.ClientInitReject; -import de.kuschku.libquassel.objects.types.ClientLoginAck; -import de.kuschku.libquassel.objects.types.ClientLoginReject; -import de.kuschku.libquassel.objects.types.CoreSetupAck; -import de.kuschku.libquassel.objects.types.SessionInit; -import de.kuschku.libquassel.syncables.SyncableRegistry; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.invokers.IClient; -import de.kuschku.libquassel.syncables.types.invokers.InvokerRegistry; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class ProtocolHandler implements IProtocolHandler { - @NonNull - public final Client client; - @NonNull - private final BusProvider busProvider; - - public ProtocolHandler(@NonNull BusProvider busProvider, @NonNull Client client) { - this.busProvider = busProvider; - this.busProvider.handle.register(this); - this.busProvider.event.register(this); - this.client = client; - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(@NonNull InitDataFunction packedFunc) { - try { - SyncableObject object = SyncableRegistry.from(packedFunc); - assertNotNull(object); - - client.initObject(packedFunc.className, packedFunc.objectName, object); - } catch (Exception e) { - busProvider.sendEvent(new GeneralErrorEvent(e)); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(@NonNull InitRequestFunction packedFunc) { - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(@NonNull RpcCallFunction packedFunc) { - try { - IClient.get().invoke(packedFunc, client); - } catch (Exception e) { - busProvider.sendEvent(new GeneralErrorEvent(e)); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(@NonNull SyncFunction packedFunc) { - try { - final Object syncable = client.unsafe_getObjectByIdentifier(packedFunc.className, packedFunc.objectName); - - if (syncable == null) { - Log.w("ProtocolHandler", String.format("Sync Failed: %s::%s(%s, %s)", packedFunc.className, packedFunc.methodName, packedFunc.objectName, packedFunc.params)); - if (client.connectionStatus() == ConnectionChangeEvent.Status.INITIALIZING_DATA) - client.bufferSync(packedFunc); - } else { - if (syncable instanceof SyncableObject && !((SyncableObject) syncable).initialized()) { - client.initObject(packedFunc.className, packedFunc.objectName, (SyncableObject) syncable); - } else { - InvokerRegistry.invoke(packedFunc, syncable); - } - } - } catch (Exception e) { - busProvider.sendEvent(new GeneralErrorEvent(e, packedFunc.toString())); - } - } - - @Subscribe - public void onEvent(@NonNull ClientInitReject message) { - busProvider.sendEvent(new HandshakeFailedEvent(message.Error)); - } - - @Subscribe - public void onEvent(ClientInitAck message) { - client.setCore(message); - - if (client.core().Configured) { - // Send an event to notify that login is necessary - busProvider.event.postSticky(new LoginRequireEvent(false)); - } else { - // Send an event to notify that the core is not yet set up - busProvider.event.postSticky(new CoreSetupRequiredEvent()); - } - } - - @Subscribe - public void onEvent(CoreSetupAck message) { - busProvider.event.postSticky(new LoginRequireEvent(false)); - } - - @Subscribe - public void onEvent(ClientLoginAck message) { - } - - @Subscribe - public void onEvent(@NonNull ClientLoginReject message) { - busProvider.sendEvent(new LoginRequireEvent(true)); - } - - @Subscribe - public void onEvent(@NonNull SessionInit message) { - client.setConnectionStatus(ConnectionChangeEvent.Status.INITIALIZING_DATA); - - client.init(message.SessionState); - } - - @Subscribe - public void onEvent(@NonNull Heartbeat heartbeat) { - busProvider.dispatch(new HeartbeatReply(heartbeat)); - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(@NonNull HeartbeatReply heartbeat) { - DateTime dateTime = DateTime.now().toDateTimeISO(); - Interval interval = new Interval(heartbeat.dateTime, dateTime); - long roundtrip = interval.toDurationMillis(); - long lag = (long) (roundtrip * 0.5); - - client.setLatency(lag); - } - - @Subscribe - public void onEvent(@NonNull ConnectionChangeEvent event) { - } - - @NonNull - @Override - public Client getClient() { - return client; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/QuasselClient.java b/app/src/main/java/de/kuschku/libquassel/QuasselClient.java deleted file mode 100644 index bcfc9b11f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/QuasselClient.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.client.ClientData; -import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage; -import de.kuschku.libquassel.ssl.CertificateManager; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.util.accounts.ServerAddress; -import de.kuschku.util.buffermetadata.BufferMetaDataManager; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class QuasselClient { - @NonNull - public final BusProvider provider; - @NonNull - public final ProtocolHandler handler; - @NonNull - public final Client client; - @NonNull - public final CertificateManager certificateManager; - @NonNull - private final ClientData data; - public CoreConnection connection; - - public QuasselClient(@NonNull BusProvider provider, @NonNull ClientData data, @NonNull CertificateManager certificateManager, @NonNull BacklogStorage backlogStorage, @NonNull BufferMetaDataManager metaDataManager, String coreId) { - assertNotNull(provider); - assertNotNull(data); - assertNotNull(certificateManager); - assertNotNull(backlogStorage); - - this.provider = provider; - this.data = data; - this.certificateManager = certificateManager; - this.client = new Client(provider, backlogStorage, metaDataManager, coreId); - this.handler = new ProtocolHandler(provider, this.client); - } - - public void connect(@NonNull ServerAddress address) { - assertNotNull(client); - this.connection = new CoreConnection(address, data, provider, client, certificateManager); - } - - public void disconnect() { - this.connection.close(); - this.client.networkManager().networks().clear(); - for (int bufferId : this.client.bufferManager().bufferIds()) { - this.client.backlogStorage().markBufferUnused(bufferId); - } - this.client.bufferManager().bufferIds().clear(); - this.client.bufferManager().buffers().clear(); - if (client.bufferViewManager() != null) { - for (QBufferViewConfig config : client.bufferViewManager().bufferViewConfigs()) { - config.networkList().clear(); - } - client.bufferViewManager().bufferViewConfigs().clear(); - client.bufferViewManager().bufferViewConfigMap().clear(); - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/client/AClient.java b/app/src/main/java/de/kuschku/libquassel/client/AClient.java deleted file mode 100644 index d63f2584b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/client/AClient.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.client; - -import android.support.annotation.NonNull; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.HandshakeFunction; -import de.kuschku.libquassel.objects.types.ClientLogin; -import de.kuschku.libquassel.objects.types.Command; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; - -import static de.kuschku.util.AndroidAssert.fail; -import static junit.framework.Assert.assertNotNull; - -public abstract class AClient<T extends AClient<T>> extends SyncableObject<T> implements QClient { - @Override - public void sendInput(BufferInfo info, String message) { - smartRpc("sendInput(BufferInfo,QString)", info, message); - } - - @Override - public void sendInput(@NonNull Command command) { - sendInput(command.buffer, command.command); - } - - @Override - public void createIdentity(QIdentity identity, Map<String, QVariant> certs) { - smartRpcTyped("createIdentity(Identity,QVariantMap)", new QVariant<>(identity), new QVariant<>(certs)); - } - - @Override - public void updateIdentity(int id, Map<String, QVariant> serialized) { - smartRpcTyped("updateIdentity(IdentityId,QVariantMap)", new QVariant<>("IdentityId", id), new QVariant<>(serialized)); - } - - @Override - public void removeIdentity(int id) { - smartRpcTyped("removeIdentity(IdentityId)", new QVariant<>("IdentityId", id)); - } - - @Override - public void createNetwork(NetworkInfo info) { - createNetwork(info, Collections.emptyList()); - } - - @Override - public void createNetwork(NetworkInfo info, List<String> persistentChannels) { - smartRpcTyped("createNetwork(NetworkInfo,QStringList)", new QVariant<>(info), new QVariant<>(QMetaType.Type.QStringList, persistentChannels)); - } - - @Override - public void updateNetwork(NetworkInfo info) { - smartRpc("updateNetwork(NetworkInfo)", new QVariant<>(info)); - } - - @Override - public void removeNetwork(int id) { - smartRpcTyped("removeNetwork(NetworkId)", new QVariant<>("NetworkId", id)); - } - - @Override - public void changePassword(String username, String oldPassword, String newPassword) { - smartRpc("changePassword(PeerPtr,QString,QString,QString)", new QVariant<>("PeerPtr", 0x0000000000000000L), new QVariant<>(username), new QVariant<>(oldPassword), new QVariant<>(newPassword)); - } - - @Override - public void _update(T from) { - fail("This is not a real syncable"); - } - - @Override - public void _update(Map<String, QVariant> from) { - fail("This is not a real syncable"); - } - - @Override - public void login(@NonNull String username, @NonNull String password) { - assertNotNull(provider); - - provider.dispatch(new HandshakeFunction(new ClientLogin(username, password))); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java deleted file mode 100644 index cb76664d8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.client; - -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.events.BacklogInitEvent; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.localtypes.buffers.Buffers; -import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; -import de.kuschku.libquassel.localtypes.buffers.QueryBuffer; -import de.kuschku.libquassel.localtypes.buffers.StatusBuffer; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.util.observables.lists.ObservableSet; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class BufferManager { - @NonNull - private final Map<Integer, Buffer> buffers = new HashMap<>(); - private final Client client; - - private final Map<String, Integer> buffersByNick = new HashMap<>(); - private final Map<String, Integer> buffersByChannel = new HashMap<>(); - private final Map<Integer, Integer> statusBuffers = new HashMap<>(); - private final Map<Integer, ObservableSet<Integer>> buffersByNetwork = new HashMap<>(); - private final ObservableSet<Integer> bufferIds = new ObservableSet<>(); - private final Set<Integer> laterRequests = new HashSet<>(); - - public BufferManager(Client client) { - this.client = client; - } - - public void createBuffer(@NonNull Buffer buffer) { - buffers.put(buffer.getInfo().id, buffer); - bufferIds.add(buffer.getInfo().id); - byNetwork(buffer.getInfo().networkId).add(buffer.getInfo().id); - updateBufferMapEntries(buffer, buffer.getInfo().name); - } - - public void removeBuffer(@IntRange(from = 0) int id) { - Buffer buffer = buffers.get(id); - if (buffer != null) - byNetwork(buffer.getInfo().networkId).remove(id); - buffers.remove(id); - bufferIds.remove(id); - } - - public Buffer buffer(@IntRange(from = 0) int id) { - return buffers.get(id); - } - - public void updateBufferInfo(@NonNull BufferInfo bufferInfo) { - Buffer buffer = buffer(bufferInfo.id); - if (buffer == null) return; - if (buffer.getInfo().networkId != bufferInfo.networkId) { - buffersByNetwork.get(buffer.getInfo().networkId).remove(bufferInfo.id); - buffersByNetwork.get(buffer.getInfo().networkId).add(bufferInfo.id); - } - buffer.setInfo(bufferInfo); - } - - public void init(@NonNull List<BufferInfo> bufferInfos) { - for (BufferInfo info : bufferInfos) { - createBuffer(info); - laterRequests.add(info.id); - } - } - - @NonNull - public Map<Integer, Buffer> buffers() { - return buffers; - } - - public void createBuffer(@NonNull BufferInfo info) { - Buffer buffer = Buffers.fromType(info, client); - assertNotNull(buffer); - createBuffer(buffer); - if (client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA) { - client.bufferViewManager().checkForNewBuffers(info.id); - } - } - - public boolean exists(@NonNull BufferInfo info) { - return buffers.containsKey(info.id); - } - - public void renameBuffer(int bufferId, @NonNull String newName) { - Buffer buffer = buffer(bufferId); - if (buffer != null) { - buffer.renameBuffer(newName); - bufferIds().notifyItemChanged(bufferId); - } - } - - private void updateBufferMapEntries(@NonNull Buffer buffer, String name) { - if (buffer instanceof ChannelBuffer) { - buffersByChannel.remove(buffer.objectName()); - buffersByChannel.put(buffer.objectName(name), buffer.getInfo().id); - } else if (buffer instanceof QueryBuffer) { - buffersByNick.remove(buffer.objectName()); - buffersByNick.put(buffer.objectName(name), buffer.getInfo().id); - } else if (buffer instanceof StatusBuffer) { - statusBuffers.remove(buffer.getInfo().networkId); - statusBuffers.put(buffer.getInfo().networkId, buffer.getInfo().id); - } - } - - @Nullable - public ChannelBuffer channel(@Nullable QIrcChannel channel) { - if (channel == null) - return null; - if (!buffersByChannel.containsKey(channel.getObjectName())) - return null; - Buffer buffer = buffer(buffersByChannel.get(channel.getObjectName())); - if (!(buffer instanceof ChannelBuffer)) - return null; - return (ChannelBuffer) buffer; - } - - @Nullable - public QueryBuffer user(@Nullable QIrcUser user) { - if (user == null) - return null; - if (!buffersByNick.containsKey(user.getObjectName())) - return null; - Buffer buffer = buffer(buffersByNick.get(user.getObjectName())); - if (!(buffer instanceof QueryBuffer)) - return null; - return (QueryBuffer) buffer; - } - - public ObservableSet<Integer> byNetwork(@IntRange(from = 0) int networkId) { - if (!buffersByNetwork.containsKey(networkId)) - buffersByNetwork.put(networkId, new ObservableSet<>()); - return buffersByNetwork.get(networkId); - } - - @NonNull - public ObservableSet<Integer> bufferIds() { - return bufferIds; - } - - public void doBacklogInit(int amount) { - BusProvider provider = client.provider(); - assertNotNull(provider); - - Set<Integer> visibleBuffers = new HashSet<>(); - for (QBufferViewConfig bufferConfig : client.bufferViewManager().bufferViewConfigs()) { - visibleBuffers.addAll(bufferConfig.bufferIds()); - } - laterRequests.retainAll(visibleBuffers); - for (int id : laterRequests) { - client.backlogManager().requestBacklogInitial(id, amount); - } - laterRequests.clear(); - int waitingMax = client.backlogManager().waitingMax(); - int waitingCurrently = client.backlogManager().waiting().size(); - - provider.sendEvent(new BacklogInitEvent(waitingMax - waitingCurrently, waitingMax)); - - client.backlogManager().checkWaiting(); - } - - public StatusBuffer network(int networkId) { - return (StatusBuffer) buffers.get(statusBuffers.get(networkId)); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/client/Client.java b/app/src/main/java/de/kuschku/libquassel/client/Client.java deleted file mode 100644 index f616da732..000000000 --- a/app/src/main/java/de/kuschku/libquassel/client/Client.java +++ /dev/null @@ -1,495 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.client; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.Log; -import android.util.Pair; - -import java.security.cert.X509Certificate; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.events.CriticalErrorEvent; -import de.kuschku.libquassel.events.InitEvent; -import de.kuschku.libquassel.events.LagChangedEvent; -import de.kuschku.libquassel.events.PasswordChangeEvent; -import de.kuschku.libquassel.events.StatusMessageEvent; -import de.kuschku.libquassel.functions.types.InitRequestFunction; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.objects.types.CoreStatus; -import de.kuschku.libquassel.objects.types.SessionState; -import de.kuschku.libquassel.primitives.QMetaTypeRegistry; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.impl.BacklogManager; -import de.kuschku.libquassel.syncables.types.impl.CoreInfo; -import de.kuschku.libquassel.syncables.types.impl.Identity; -import de.kuschku.libquassel.syncables.types.interfaces.QAliasManager; -import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferSyncer; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.libquassel.syncables.types.interfaces.QNetworkConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QSyncableObject; -import de.kuschku.util.buffermetadata.BufferMetaDataManager; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class Client extends AClient { - @NonNull - private final NetworkManager networkManager; - @NonNull - private final BufferManager bufferManager; - @NonNull - private final IdentityManager identityManager; - @NonNull - private final BacklogStorage backlogStorage; - private final List<String> initRequests = new LinkedList<>(); - @NonNull - private final QBacklogManager backlogManager; - private final Map<String, List<SyncFunction>> bufferedSyncs = new HashMap<>(); - private final Map<Integer, Pair<QBufferViewConfig, Integer>> bufferedBuffers = new HashMap<>(); - private final BufferMetaDataManager metaDataManager; - private final String coreId; - private int initRequestMax = 0; - private QBufferViewManager bufferViewManager; - // local - private QBufferSyncer bufferSyncer; - private QAliasManager aliasManager; - private QIgnoreListManager ignoreListManager; - private QNetworkConfig globalNetworkConfig; - private CoreStatus core; - private CoreInfo coreInfo; - private long latency; - private ConnectionChangeEvent.Status connectionStatus; - private int r = 1; - private X509Certificate[] certificateChain; - - public Client(@NonNull BusProvider provider, @NonNull BacklogStorage backlogStorage, @NonNull BufferMetaDataManager metaDataManager, String coreId) { - this.coreId = coreId; - this.provider = provider; - this.networkManager = new NetworkManager(this); - this.bufferManager = new BufferManager(this); - this.identityManager = new IdentityManager(); - this.backlogStorage = backlogStorage; - backlogStorage.setClient(this); - this.backlogManager = new BacklogManager(this, backlogStorage); - this.backlogManager.init("", provider, this); - this.initialized = true; - this.metaDataManager = metaDataManager; - } - - public QBufferViewManager bufferViewManager() { - return bufferViewManager; - } - - public QBufferSyncer bufferSyncer() { - return bufferSyncer; - } - - public QAliasManager aliasManager() { - return aliasManager; - } - - @NonNull - public QBacklogManager backlogManager() { - return backlogManager; - } - - public QIgnoreListManager ignoreListManager() { - return ignoreListManager; - } - - public QNetworkConfig globalNetworkConfig() { - return globalNetworkConfig; - } - - @Override - public void _displayMsg(Message msg) { - backlogManager.receiveBacklog(msg); - } - - @Override - public void _displayStatusMsg(String network, String message) { - assertNotNull(provider); - - provider.sendEvent(new StatusMessageEvent(network, message)); - } - - @Override - public void _bufferInfoUpdated(@NonNull BufferInfo bufferInfo) { - bufferManager.updateBufferInfo(bufferInfo); - } - - @Override - public void _identityCreated(@NonNull Identity identity) { - identityManager.createIdentity(identity); - identity.init(String.valueOf(identity.id()), provider, this); - } - - @Override - public void _identityRemoved(int id) { - identityManager.removeIdentity(id); - } - - @Override - public void _networkCreated(int network) { - networkManager.createNetwork(network); - } - - @Override - public void _networkRemoved(int network) { - networkManager.removeNetwork(network); - } - - @Override - public void _passwordChanged(long peerPtr, boolean success) { - assertNotNull(provider); - - if (peerPtr != 0x0000000000000000L) - provider.sendEvent(new CriticalErrorEvent("Your core has a critical vulnerability. Please update it.")); - provider.sendEvent(new PasswordChangeEvent(success)); - } - - @Override - public void ___objectRenamed__(String type, String newName, String oldName) { - ((QSyncableObject) unsafe_getObjectByIdentifier(type, oldName)).setObjectName(newName); - } - - public synchronized ConnectionChangeEvent.Status connectionStatus() { - return connectionStatus; - } - - public synchronized void setConnectionStatus(@NonNull ConnectionChangeEvent.Status connectionStatus) { - assertNotNull(provider); - - this.connectionStatus = connectionStatus; - provider.event.postSticky(new ConnectionChangeEvent(connectionStatus)); - - if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) { - bufferManager().doBacklogInit(20); - } else if (connectionStatus == ConnectionChangeEvent.Status.CONNECTED) { - for (int bufferId : bufferManager().bufferIds()) { - metaDataManager().hiddendata(coreId(), bufferId); - } - // FIXME: Init buffer activity state and highlights - } - } - - @Nullable - public Object unsafe_getObjectByIdentifier(@NonNull String className, @NonNull String objectName) { - switch (className) { - case "AliasManager": { - return aliasManager; - } - case "BacklogManager": { - return backlogManager; - } - case "BufferSyncer": { - return bufferSyncer; - } - case "BufferViewConfig": { - if (bufferViewManager == null) - return null; - - return bufferViewManager.bufferViewConfig(Integer.parseInt(objectName)); - } - case "BufferViewManager": { - return bufferViewManager; - } - case "CoreInfo": { - return coreInfo; - } - case "Identity": { - if (identityManager == null) - return null; - return identityManager.identity(Integer.parseInt(objectName)); - } - case "IgnoreListManager": { - return ignoreListManager; - } - case "IrcChannel": { - String[] split = objectName.split("/"); - if (split.length != 2) { - Log.w("libquassel", "malformatted object name: " + objectName); - return null; - } - QNetwork network = networkManager.network(Integer.parseInt(split[0])); - if (network == null) { - Log.w("libquassel", "Network doesn’t exist yet: " + objectName); - return null; - } - return network.ircChannel(split[1]); - } - case "IrcUser": { - String[] split = objectName.split("/"); - if (split.length != 2) { - Log.w("libquassel", "malformatted object name: " + objectName); - return null; - } - QNetwork network = networkManager.network(Integer.parseInt(split[0])); - if (network == null) { - Log.w("libquassel", "Network doesn’t exist yet: " + objectName); - return null; - } - return network.ircUser(split[1]); - } - case "Network": { - return networkManager.network(Integer.parseInt(objectName)); - } - case "NetworkConfig": { - return globalNetworkConfig; - } - case "NetworkInfo": { - QNetwork network = networkManager().network(Integer.parseInt(objectName)); - if (network == null) - return null; - else - return network.networkInfo(); - } - default: { - Log.w("libquassel", "Unknown type: " + className + " : " + objectName); - return null; - } - } - } - - @Nullable - public <T> T getObjectByIdentifier(@NonNull String className, @NonNull String objectName) { - Class<T> cl = QMetaTypeRegistry.<T>getType(className).cl; - return getObjectByIdentifier(cl, className, objectName); - } - - @Nullable - public <T> T getObjectByIdentifier(@NonNull Class<T> cl, @NonNull String objectName) { - return getObjectByIdentifier(cl, cl.getSimpleName(), objectName); - } - - @SuppressWarnings("unchecked") - @Nullable - public <T> T getObjectByIdentifier(@NonNull Class<T> cl, @NonNull String className, @NonNull String objectName) { - Object obj = unsafe_getObjectByIdentifier(className, objectName); - // The fancy version of "instanceof" that works with erased types, too - if (obj == null || !cl.isAssignableFrom(obj.getClass())) - return null; - else - return (T) obj; - } - - public void init(@NonNull SessionState sessionState) { - networkManager.init(sessionState.NetworkIds); - identityManager.init(sessionState.Identities); - bufferManager.init(sessionState.BufferInfos); - - requestInitObject("BufferSyncer", ""); - requestInitObject("BufferViewManager", ""); - requestInitObject("AliasManager", ""); - requestInitObject("NetworkConfig", "GlobalNetworkConfig"); - requestInitObject("IgnoreListManager", ""); - requestInitObject("CoreInfo", ""); - //sendInitRequest("TransferManager", ""); - // This thing never gets sent... - - assertNotNull(provider); - provider.event.postSticky(new InitEvent(initRequestMax - initRequests.size(), initRequestMax)); - } - - @NonNull - public NetworkManager networkManager() { - return networkManager; - } - - @NonNull - public BufferManager bufferManager() { - return bufferManager; - } - - @NonNull - public IdentityManager identityManager() { - return identityManager; - } - - public void requestInitObject(@NonNull String className, String objectName) { - assertNotNull(provider); - - if (connectionStatus() == ConnectionChangeEvent.Status.INITIALIZING_DATA) { - initRequests.add(hashName(className, objectName)); - initRequestMax++; - } - - provider.dispatch(new InitRequestFunction(className, objectName)); - } - - public void initObject(String className, @NonNull String objectName, @NonNull SyncableObject object) { - assertNotNull(provider); - - object.init(objectName, provider, this); - - if (connectionStatus() == ConnectionChangeEvent.Status.INITIALIZING_DATA) { - initRequests.remove(hashName(className, objectName)); - provider.event.postSticky(new InitEvent(initRequestMax - initRequests.size(), initRequestMax)); - if (initRequests.isEmpty()) { - setConnectionStatus(ConnectionChangeEvent.Status.LOADING_BACKLOG); - } - } - - synchronized (bufferedSyncs) { - if (r > 0) r--; - else throw new RuntimeException(); - // Execute cached sync requests - if (bufferedSyncs.size() > 0) { - String key = hashName(className, objectName); - if (bufferedSyncs.containsKey(key)) { - Log.d("libquassel", "Unqueueing syncs: " + className + ":" + objectName); - List<SyncFunction> functions = bufferedSyncs.get(key); - for (SyncFunction function : functions) - provider.handle(function); - bufferedSyncs.remove(key); - } - } - r++; - } - } - - @NonNull - private String hashName(String className, String objectName) { - return className + ":" + objectName; - } - - public void setLatency(long latency) { - assertNotNull(provider); - - this.latency = latency; - provider.sendEvent(new LagChangedEvent(latency)); - } - - public CoreInfo coreInfo() { - return coreInfo; - } - - public void setCoreInfo(CoreInfo coreInfo) { - this.coreInfo = coreInfo; - } - - public CoreStatus core() { - return core; - } - - public void setCore(CoreStatus core) { - this.core = core; - } - - public long latency() { - return latency; - } - - public void setBufferSyncer(QBufferSyncer bufferSyncer) { - this.bufferSyncer = bufferSyncer; - } - - public void setBufferViewManager(QBufferViewManager bufferViewManager) { - this.bufferViewManager = bufferViewManager; - } - - public void setAliasManager(QAliasManager aliasManager) { - this.aliasManager = aliasManager; - } - - public void setIgnoreListManager(QIgnoreListManager ignoreListManager) { - this.ignoreListManager = ignoreListManager; - } - - public void setGlobalNetworkConfig(QNetworkConfig globalNetworkConfig) { - this.globalNetworkConfig = globalNetworkConfig; - } - - @NonNull - public BacklogStorage backlogStorage() { - return backlogStorage; - } - - public void bufferSync(@NonNull SyncFunction packedFunc) { - String key = hashName(packedFunc.className, packedFunc.objectName); - if (connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) { - Log.d("libquassel", "Queueing sync: " + packedFunc); - } - - synchronized (bufferedSyncs) { - if (r > 0) r--; - else throw new RuntimeException(); - if (!bufferedSyncs.containsKey(key)) - bufferedSyncs.put(key, new LinkedList<>()); - bufferedSyncs.get(key).add(packedFunc); - Log.d("libquassel", "Queued syncs: " + bufferedSyncs.keySet()); - r++; - } - } - - public void bufferBuffer(QBufferViewConfig bufferViewConfig, int bufferId, int pos) { - bufferedBuffers.put(bufferId, Pair.create(bufferViewConfig, pos)); - Log.d("libquassel", "Queueing buffer: " + bufferId); - Log.d("libquassel", "Queued buffers: " + bufferedBuffers.keySet()); - } - - public void unbufferBuffer(@NonNull BufferInfo info) { - if (!bufferManager().exists(info)) { - bufferManager().createBuffer(info); - Log.d("libquassel", "Creating buffer from message info: " + info.id); - } - if (bufferedBuffers.containsKey(info.id)) { - Pair<QBufferViewConfig, Integer> pair = bufferedBuffers.get(info.id); - pair.first._addBuffer(info.id, pair.second); - Log.d("libquassel", "Un-Queueing buffer: " + info.id); - } - } - - @Nullable - public BusProvider provider() { - return provider; - } - - public BufferMetaDataManager metaDataManager() { - return metaDataManager; - } - - public String coreId() { - return coreId; - } - - public X509Certificate[] certificateChain() { - return certificateChain; - } - - public void setCertificateChain(X509Certificate[] certificateChain) { - this.certificateChain = certificateChain; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/client/ClientData.java b/app/src/main/java/de/kuschku/libquassel/client/ClientData.java deleted file mode 100644 index ed6d7b9a6..000000000 --- a/app/src/main/java/de/kuschku/libquassel/client/ClientData.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.client; - -import android.support.annotation.NonNull; - -import java.util.Arrays; - -public class ClientData { - /** - * The flags the client supports. - */ - @NonNull - public final FeatureFlags flags; - - /** - * The list of protocols supported, 0x01 is Legacy and 0x02 is Datastream. - */ - @NonNull - public final byte[] supportedProtocols; - - /** - * A string identifying the client. - */ - @NonNull - public final String identifier; - - /** - * The protocol version of Quassel internally, for example 10. - */ - public final int protocolVersion; - - public ClientData(@NonNull FeatureFlags flags, @NonNull byte[] supportedProtocols, @NonNull String identifier, int protocolVersion) { - this.flags = flags; - this.supportedProtocols = supportedProtocols; - this.identifier = identifier; - this.protocolVersion = protocolVersion; - } - - @NonNull - public byte[] getSupportedProtocols() { - return supportedProtocols; - } - - @NonNull - @Override - public String toString() { - return "ClientData{" + - "flags=" + flags + - ", supportedProtocols=" + Arrays.toString(supportedProtocols) + - ", identifier='" + identifier + '\'' + - ", protocolVersion=" + protocolVersion + - '}'; - } - -} diff --git a/app/src/main/java/de/kuschku/libquassel/client/FeatureFlags.java b/app/src/main/java/de/kuschku/libquassel/client/FeatureFlags.java deleted file mode 100644 index ab3cd609a..000000000 --- a/app/src/main/java/de/kuschku/libquassel/client/FeatureFlags.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.client; - -import android.support.annotation.NonNull; - -public class FeatureFlags { - public final boolean supportsSSL; - public final boolean supportsCompression; - public final byte flags; - - public FeatureFlags(final byte flags) { - this.flags = flags; - this.supportsSSL = (flags & 0x01) > 0; - this.supportsCompression = (flags & 0x02) > 0; - } - - public FeatureFlags(final boolean supportsSSL, final boolean supportsCompression) { - this.supportsSSL = supportsSSL; - this.supportsCompression = supportsCompression; - this.flags = (byte) ((this.supportsSSL ? 0x01 : 0x00) | - (this.supportsCompression ? 0x02 : 0x00)); - } - - @NonNull - @Override - public String toString() { - return "FeatureFlags{" + - "supportsSSL=" + supportsSSL + - ", supportsCompression=" + supportsCompression + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java b/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java deleted file mode 100644 index feff60900..000000000 --- a/app/src/main/java/de/kuschku/libquassel/client/IdentityManager.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.client; - -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -public class IdentityManager { - @NonNull - private final Map<Integer, QIdentity> identities = new HashMap<>(); - private final AndroidObservableSortedList<QIdentity> identityList = new AndroidObservableSortedList<>(QIdentity.class, new AndroidObservableSortedList.ItemComparator<QIdentity>() { - @Override - public int compare(QIdentity o1, QIdentity o2) { - if (o1 == null && o2 == null) - return 0; - if (o1 == null) - return 1; - if (o2 == null) - return -1; - return o1.id() - o2.id(); - } - - @Override - public boolean areContentsTheSame(QIdentity oldItem, QIdentity newItem) { - return oldItem.equals(newItem); - } - - @Override - public boolean areItemsTheSame(QIdentity item1, QIdentity item2) { - return item1.id() == item2.id(); - } - }); - - public void createIdentity(@NonNull QIdentity identity) { - identities.put(identity.id(), identity); - identityList.add(identity); - } - - public void removeIdentity(@IntRange(from = 0) int id) { - identityList.remove(identities.remove(id)); - } - - @Nullable - public QIdentity identity(@IntRange(from = 0) int id) { - return identities.get(id); - } - - public void init(@NonNull List<QIdentity> identities) { - for (QIdentity identity : identities) { - createIdentity(identity); - } - } - - public AndroidObservableSortedList<QIdentity> identities() { - return identityList; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java b/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java deleted file mode 100644 index 7bc59075f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/client/NetworkManager.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.client; - -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Observable; - -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.syncables.types.impl.Network; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class NetworkManager extends Observable { - @NonNull - private final Map<Integer, QNetwork> networks = new HashMap<>(); - @NonNull - private final AndroidObservableSortedList<QNetwork> list = new AndroidObservableSortedList<QNetwork>(QNetwork.class, new AndroidObservableSortedList.ItemComparator<QNetwork>() { - @Override - public int compare(QNetwork o1, QNetwork o2) { - assertNotNull(o1); - assertNotNull(o2); - - String name1 = o1.networkName(); - String name2 = o2.networkName(); - - if (name1 == null && name2 == null) { - return 0; - } else if (name1 == null) { - return 1; - } else if (name2 == null) { - return -1; - } else { - return name1.compareTo(name2); - } - } - - @Override - public boolean areContentsTheSame(QNetwork oldItem, QNetwork newItem) { - return oldItem == newItem; - } - - @Override - public boolean areItemsTheSame(QNetwork item1, QNetwork item2) { - return item1.networkId() == item2.networkId(); - } - }) { - @Override - public boolean add(QNetwork object) { - if (object == null) - throw new Error(); - return super.add(object); - } - - @Override - public void add(int location, QNetwork object) { - if (object == null) - throw new Error(); - super.add(location, object); - } - }; - @NonNull - private final Client client; - - public NetworkManager(@NonNull Client client) { - this.client = client; - } - - public void createNetwork(@IntRange(from = 0) int networkId) { - createNetwork(Network.create(networkId)); - client.requestInitObject("Network", String.valueOf(networkId)); - } - - public void createNetwork(@NonNull QNetwork network) { - QNetwork qNetwork = networks.get(network.networkId()); - if (qNetwork != null && list.contains(qNetwork)) - list.remove(qNetwork); - networks.put(network.networkId(), network); - list.add(network); - - if (client.connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) - for (QBufferViewConfig config : client.bufferViewManager().bufferViewConfigs()) { - config.updateNetworks(); - } - } - - public QNetwork network(@IntRange(from = 0) int networkId) { - return networks.get(networkId); - } - - public void removeNetwork(@IntRange(from = 0) int network) { - QNetwork qNetwork = networks.get(network); - if (qNetwork != null) - list.remove(qNetwork); - networks.remove(network); - for (QBufferViewConfig config : client.bufferViewManager().bufferViewConfigs()) { - config.updateNetworks(); - } - } - - - public void init(@NonNull List<Integer> networkIds) { - for (int networkId : networkIds) { - client.requestInitObject("Network", String.valueOf(networkId)); - } - } - - @NonNull - public AndroidObservableSortedList<QNetwork> networks() { - return list; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/client/QClient.java b/app/src/main/java/de/kuschku/libquassel/client/QClient.java deleted file mode 100644 index a615d92e6..000000000 --- a/app/src/main/java/de/kuschku/libquassel/client/QClient.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.client; - -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.objects.types.Command; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.libquassel.syncables.types.impl.Identity; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; - -public interface QClient { - @Synced - void sendInput(BufferInfo info, String message); - - @Synced - void sendInput(Command command); - - @Synced - void createIdentity(QIdentity identity, Map<String, QVariant> certs); - - @Synced - void updateIdentity(int id, final Map<String, QVariant> serialized); - - @Synced - void removeIdentity(int id); - - @Synced - void createNetwork(NetworkInfo info); - - @Synced - void createNetwork(NetworkInfo info, List<String> persistentChannels); - - @Synced - void updateNetwork(NetworkInfo info); - - @Synced - void removeNetwork(int id); - - @Synced - void changePassword(String username, String oldPassword, String newPassword); - - void _displayMsg(final Message msg); - - void _displayStatusMsg(String network, String message); - - void _bufferInfoUpdated(BufferInfo bufferInfo); - - void _identityCreated(Identity identity); - - void _identityRemoved(int id); - - void _networkCreated(int network); - - void _networkRemoved(int network); - - void _passwordChanged(long peerPtr, boolean success); - - void ___objectRenamed__(String type, String oldName, String newName); - - void login(String username, String password); -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/BacklogInitEvent.java b/app/src/main/java/de/kuschku/libquassel/events/BacklogInitEvent.java deleted file mode 100644 index 5696d9be4..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/BacklogInitEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import java.util.Locale; - -public class BacklogInitEvent { - public final int loaded; - public final int max; - - public BacklogInitEvent(int loaded, int max) { - this.loaded = loaded; - this.max = max; - } - - @Override - public String toString() { - return String.format(Locale.US, "LOADING_BACKLOG: %d/%d", loaded, max); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/BacklogReceivedEvent.java b/app/src/main/java/de/kuschku/libquassel/events/BacklogReceivedEvent.java deleted file mode 100644 index 567c395a1..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/BacklogReceivedEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.IntRange; - -@SuppressWarnings("WeakerAccess") -public class BacklogReceivedEvent { - @IntRange(from = -1) - public final int bufferId; - - public BacklogReceivedEvent(int bufferId) { - this.bufferId = bufferId; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/BufferChangeEvent.java b/app/src/main/java/de/kuschku/libquassel/events/BufferChangeEvent.java deleted file mode 100644 index 2cef25718..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/BufferChangeEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -public class BufferChangeEvent { -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/CertificateAcceptedEvent.java b/app/src/main/java/de/kuschku/libquassel/events/CertificateAcceptedEvent.java deleted file mode 100644 index a993bf6c8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/CertificateAcceptedEvent.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import java.security.cert.X509Certificate; - -public class CertificateAcceptedEvent { - public final X509Certificate certificate; - - public CertificateAcceptedEvent(X509Certificate certificate) { - this.certificate = certificate; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/ConnectionChangeEvent.java b/app/src/main/java/de/kuschku/libquassel/events/ConnectionChangeEvent.java deleted file mode 100644 index 7e556380f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/ConnectionChangeEvent.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.NonNull; - -@SuppressWarnings("WeakerAccess") -public class ConnectionChangeEvent { - @NonNull - public final Status status; - @NonNull - public final String reason; - - public ConnectionChangeEvent(@NonNull Status status) { - this(status, ""); - } - - public ConnectionChangeEvent(@NonNull Status status, @NonNull String reason) { - this.status = status; - this.reason = reason; - } - - @NonNull - @Override - public String toString() { - return "ConnectionChangeEvent{" + - "status=" + status + - ", reason='" + reason + '\'' + - '}'; - } - - public enum Status { - DISCONNECTED, - HANDSHAKE, - INITIALIZING_DATA, - LOADING_BACKLOG, - CONNECTED - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/CoreSetupFailedEvent.java b/app/src/main/java/de/kuschku/libquassel/events/CoreSetupFailedEvent.java deleted file mode 100644 index d4b362a76..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/CoreSetupFailedEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.NonNull; - -@SuppressWarnings("WeakerAccess") -public class CoreSetupFailedEvent { - public final String reason; - - public CoreSetupFailedEvent(String reason) { - this.reason = reason; - } - - @NonNull - @Override - public String toString() { - return "CoreSetupFailedEvent{" + - "reason='" + reason + '\'' + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/CoreSetupRequiredEvent.java b/app/src/main/java/de/kuschku/libquassel/events/CoreSetupRequiredEvent.java deleted file mode 100644 index 4038cf60d..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/CoreSetupRequiredEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -public class CoreSetupRequiredEvent { -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/CoreSetupSuccessfulEvent.java b/app/src/main/java/de/kuschku/libquassel/events/CoreSetupSuccessfulEvent.java deleted file mode 100644 index 7b1584f2e..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/CoreSetupSuccessfulEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.NonNull; - -@SuppressWarnings("WeakerAccess") -public class CoreSetupSuccessfulEvent { - public CoreSetupSuccessfulEvent() { - } - - @NonNull - @Override - public String toString() { - return "CoreSetupSuccessfulEvent{}"; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/CriticalErrorEvent.java b/app/src/main/java/de/kuschku/libquassel/events/CriticalErrorEvent.java deleted file mode 100644 index 2a8b8a247..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/CriticalErrorEvent.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -public class CriticalErrorEvent { - public String debugInfo; - public Exception exception; - - public CriticalErrorEvent(String debugInfo) { - this.debugInfo = debugInfo; - } - - public CriticalErrorEvent(Exception exception) { - this.exception = exception; - } - - public CriticalErrorEvent(Exception exception, String debugInfo) { - this.debugInfo = debugInfo; - this.exception = exception; - } - - @Override - public String toString() { - if (debugInfo == null) - return String.format("%s: %s", exception.getClass().getSimpleName(), exception.getLocalizedMessage()); - else if (exception == null) - return debugInfo; - else - return String.format("%s: %s\n%s", exception.getClass().getSimpleName(), exception.getLocalizedMessage(), debugInfo); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java b/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java deleted file mode 100644 index 00534a76e..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/GeneralErrorEvent.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.NonNull; - -@SuppressWarnings("WeakerAccess") -public class GeneralErrorEvent { - public String debugInfo; - public Exception exception; - - public GeneralErrorEvent(String debugInfo) { - this.debugInfo = debugInfo; - } - - public GeneralErrorEvent(Exception exception) { - this.exception = exception; - } - - public GeneralErrorEvent(Exception exception, String debugInfo) { - this.debugInfo = debugInfo; - this.exception = exception; - } - - @Override - @NonNull - public String toString() { - if (debugInfo == null) - return String.format("%s: %s", exception.getClass().getSimpleName(), exception.getLocalizedMessage()); - else if (exception == null) - return debugInfo; - else - return String.format("%s: %s\n%s", exception.getClass().getSimpleName(), exception.getLocalizedMessage(), debugInfo); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/HandshakeFailedEvent.java b/app/src/main/java/de/kuschku/libquassel/events/HandshakeFailedEvent.java deleted file mode 100644 index a610e05c5..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/HandshakeFailedEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.NonNull; - -@SuppressWarnings("WeakerAccess") -public class HandshakeFailedEvent { - public final String reason; - - public HandshakeFailedEvent(String reason) { - this.reason = reason; - } - - @NonNull - @Override - public String toString() { - return "HandshakeFailedEvent{" + - "reason='" + reason + '\'' + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/InitEvent.java b/app/src/main/java/de/kuschku/libquassel/events/InitEvent.java deleted file mode 100644 index 8d2367971..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/InitEvent.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import java.util.Locale; - -public class InitEvent { - public final int loaded; - public final int max; - - public InitEvent(int loaded, int max) { - this.loaded = loaded; - this.max = max; - } - - @Override - public String toString() { - return String.format(Locale.US, "INITIALIZING_DATA: %d/%d", loaded, max); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java b/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java deleted file mode 100644 index 6c937b862..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/LagChangedEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.NonNull; - -public class LagChangedEvent { - public final long lag; - - public LagChangedEvent(long lag) { - this.lag = lag; - } - - @NonNull - @Override - public String toString() { - return "LagChangedEvent{" + - "lag=" + lag + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/LoginRequireEvent.java b/app/src/main/java/de/kuschku/libquassel/events/LoginRequireEvent.java deleted file mode 100644 index 6c47dfd21..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/LoginRequireEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -public class LoginRequireEvent { - public final boolean failedLast; - - public LoginRequireEvent(boolean failedLast) { - this.failedLast = failedLast; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/PasswordChangeEvent.java b/app/src/main/java/de/kuschku/libquassel/events/PasswordChangeEvent.java deleted file mode 100644 index bcaf7c023..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/PasswordChangeEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.NonNull; - -public class PasswordChangeEvent { - public final boolean success; - - public PasswordChangeEvent(boolean success) { - this.success = success; - } - - @NonNull - @Override - public String toString() { - return "PasswordChangeEvent{" + - "success=" + success + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/StatusMessageEvent.java b/app/src/main/java/de/kuschku/libquassel/events/StatusMessageEvent.java deleted file mode 100644 index fe3404d04..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/StatusMessageEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -@SuppressWarnings("WeakerAccess") -public class StatusMessageEvent { - public final String scope; - public final String message; - - public StatusMessageEvent(String scope, String message) { - this.scope = scope; - this.message = message; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java b/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java deleted file mode 100644 index 04d9b2bc6..000000000 --- a/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.events; - -import android.support.annotation.NonNull; - -import java.security.cert.X509Certificate; - -import de.kuschku.libquassel.ssl.UnknownCertificateException; -import de.kuschku.util.accounts.ServerAddress; - -public class UnknownCertificateEvent { - public final X509Certificate certificate; - public final ServerAddress address; - - public UnknownCertificateEvent(X509Certificate certificate, ServerAddress address) { - this.certificate = certificate; - this.address = address; - } - - public UnknownCertificateEvent(@NonNull UnknownCertificateException cause) { - this(cause.certificate, cause.address); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java b/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java deleted file mode 100644 index 5ed768278..000000000 --- a/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.exceptions; - -import java.lang.reflect.InvocationTargetException; - -public class SyncInvocationException extends InvocationTargetException { - public SyncInvocationException() { - } - - public SyncInvocationException(String detailMessage) { - super(null, detailMessage); - } - - public SyncInvocationException(Throwable exception) { - super(exception); - } - - public SyncInvocationException(Throwable exception, String detailMessage) { - super(exception, detailMessage); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/exceptions/UnknownTypeException.java b/app/src/main/java/de/kuschku/libquassel/exceptions/UnknownTypeException.java deleted file mode 100644 index 774f845c9..000000000 --- a/app/src/main/java/de/kuschku/libquassel/exceptions/UnknownTypeException.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.exceptions; - -import android.support.annotation.Nullable; - -public class UnknownTypeException extends IllegalArgumentException { - public final String typeName; - public final String additionalData; - - public UnknownTypeException(String typeName) { - this(typeName, null); - } - - public UnknownTypeException(String typeName, Object additionalData) { - this.typeName = typeName; - this.additionalData = String.valueOf(additionalData); - } - - @Nullable - @Override - public String getLocalizedMessage() { - return getMessage(); - } - - @Override - public String getMessage() { - return String.format("Unknown type: %s; %s", typeName, additionalData); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/FunctionType.java b/app/src/main/java/de/kuschku/libquassel/functions/FunctionType.java deleted file mode 100644 index e9307cd1b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/FunctionType.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions; - -import android.support.annotation.NonNull; - -public enum FunctionType { - INVALID(0), - SYNC(1), - RPCCALL(2), - INITREQUEST(3), - INITDATA(4), - HEARTBEAT(5), - HEARTBEATREPLY(6); - - public final int id; - - FunctionType(int id) { - this.id = id; - } - - @NonNull - public static FunctionType fromId(int id) { - switch (id) { - case 1: - return SYNC; - case 2: - return RPCCALL; - case 3: - return INITREQUEST; - case 4: - return INITDATA; - case 5: - return HEARTBEAT; - case 6: - return HEARTBEATREPLY; - default: - return INVALID; - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/FunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/FunctionSerializer.java deleted file mode 100644 index bf25aabef..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/FunctionSerializer.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import java.util.List; - -public interface FunctionSerializer<T> { - @NonNull - List serialize(@NonNull T data); - - @NonNull - T deserialize(@NonNull List packedFunc); -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java deleted file mode 100644 index 88b60dc69..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -import java.util.Arrays; -import java.util.List; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.HeartbeatReply; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -public class HeartbeatReplySerializer implements FunctionSerializer<HeartbeatReply> { - @NonNull - private static final HeartbeatReplySerializer serializer = new HeartbeatReplySerializer(); - - private HeartbeatReplySerializer() { - } - - @NonNull - public static HeartbeatReplySerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull HeartbeatReply data) { - return Arrays.asList( - new QVariant<>(QMetaType.Type.Int, FunctionType.HEARTBEATREPLY.id), - new QVariant<>(QMetaType.Type.QDateTime, data.dateTime) - ); - } - - @NonNull - @Override - public HeartbeatReply deserialize(@NonNull List packedFunc) { - assertTrue(packedFunc.size() == 1); - - return new HeartbeatReply((DateTime) ((QVariant) packedFunc.remove(0)).data); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java deleted file mode 100644 index 200daa3db..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -import java.util.Arrays; -import java.util.List; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.Heartbeat; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -public class HeartbeatSerializer implements FunctionSerializer<Heartbeat> { - @NonNull - private static final HeartbeatSerializer serializer = new HeartbeatSerializer(); - - private HeartbeatSerializer() { - } - - @NonNull - public static HeartbeatSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull Heartbeat data) { - return Arrays.asList( - new QVariant<>(QMetaType.Type.Int, FunctionType.HEARTBEAT.id), - new QVariant<>(QMetaType.Type.QDateTime, data.dateTime) - ); - } - - @NonNull - @Override - public Heartbeat deserialize(@NonNull List packedFunc) { - assertTrue(packedFunc.size() == 1); - - return new Heartbeat((DateTime) ((QVariant) packedFunc.remove(0)).data); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitDataFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitDataFunctionSerializer.java deleted file mode 100644 index f11650520..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitDataFunctionSerializer.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.functions.types.InitDataFunction; -import de.kuschku.libquassel.functions.types.PackedInitDataFunction; -import de.kuschku.libquassel.functions.types.UnpackedInitDataFunction; - -public class InitDataFunctionSerializer implements FunctionSerializer<InitDataFunction> { - @NonNull - private static final InitDataFunctionSerializer serializer = new InitDataFunctionSerializer(); - - private InitDataFunctionSerializer() { - } - - @NonNull - public static InitDataFunctionSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull final InitDataFunction data) { - if (data instanceof UnpackedInitDataFunction) { - return PackedInitDataFunctionSerializer.get().serialize((UnpackedInitDataFunction) data); - } else if (data instanceof PackedInitDataFunction) { - return UnpackedInitDataFunctionSerializer.get().serialize((PackedInitDataFunction) data); - } else { - throw new IllegalArgumentException("Can not be applied to these arguments"); - } - } - - @NonNull - @Override - public InitDataFunction deserialize(@NonNull final List packedFunc) { - throw new IllegalArgumentException("Can not be applied to these arguments"); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitRequestFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitRequestFunctionSerializer.java deleted file mode 100644 index dd714be92..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitRequestFunctionSerializer.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import com.google.common.collect.Lists; - -import java.util.List; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.InitRequestFunction; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.libquassel.primitives.QMetaType.Type.Int; -import static de.kuschku.libquassel.primitives.QMetaType.Type.QByteArray; -import static de.kuschku.util.AndroidAssert.assertNotNull; -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings("unchecked") -public class InitRequestFunctionSerializer implements FunctionSerializer<InitRequestFunction> { - @NonNull - private static final InitRequestFunctionSerializer serializer = new InitRequestFunctionSerializer(); - - private InitRequestFunctionSerializer() { - } - - @NonNull - public static InitRequestFunctionSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull final InitRequestFunction data) { - return Lists.newArrayList( - FunctionType.INITREQUEST.id, - data.className, - data.objectName - ); - } - - // TODO: Add this for all such serializers - @NonNull - public List serializePacked(@NonNull final InitRequestFunction data) { - return Lists.newArrayList( - new QVariant<>(Int, FunctionType.INITREQUEST.id), - new QVariant<>(QByteArray, data.className), - new QVariant<>(QByteArray, data.objectName) - ); - } - - @NonNull - @Override - public InitRequestFunction deserialize(@NonNull final List packedFunc) { - assertTrue(packedFunc.size() >= 2); - - String className = (String) packedFunc.remove(0); - String objectName = (String) packedFunc.remove(0); - assertNotNull(className); - - return new InitRequestFunction( - className, - objectName - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedInitDataFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedInitDataFunctionSerializer.java deleted file mode 100644 index 387835a6b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedInitDataFunctionSerializer.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.UnpackedInitDataFunction; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.protocols.DatastreamPeer; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class PackedInitDataFunctionSerializer implements FunctionSerializer<UnpackedInitDataFunction> { - @NonNull - private static final PackedInitDataFunctionSerializer serializer = new PackedInitDataFunctionSerializer(); - - private PackedInitDataFunctionSerializer() { - } - - @NonNull - public static PackedInitDataFunctionSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull final UnpackedInitDataFunction data) { - final List func = new ArrayList<>(); - func.add(FunctionType.INITDATA.id); - func.add(data.className); - func.add(data.objectName); - func.add(data.getData()); - return func; - } - - @NonNull - @Override - public UnpackedInitDataFunction deserialize(@NonNull final List packedFunc) { - assertTrue(packedFunc.size() >= 2); - - return new UnpackedInitDataFunction( - ((QVariant<String>) packedFunc.remove(0)).data, - ((QVariant<String>) packedFunc.remove(0)).data, - DatastreamPeer.listToMap(packedFunc) - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedRpcCallFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedRpcCallFunctionSerializer.java deleted file mode 100644 index 1cd1c9d2d..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedRpcCallFunctionSerializer.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.protocols.DatastreamPeer; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class PackedRpcCallFunctionSerializer implements FunctionSerializer<RpcCallFunction> { - @NonNull - private static final PackedRpcCallFunctionSerializer serializer = new PackedRpcCallFunctionSerializer(); - - private PackedRpcCallFunctionSerializer() { - } - - @NonNull - public static PackedRpcCallFunctionSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull final RpcCallFunction data) { - final List func = new ArrayList<>(); - func.add(new QVariant<>(QMetaType.Type.Int, FunctionType.RPCCALL.id)); - func.add(new QVariant<>(QMetaType.Type.QByteArray, data.functionName)); - func.addAll(data.params); - return func; - } - - @NonNull - @Override - public RpcCallFunction deserialize(@NonNull final List packedFunc) { - assertTrue(packedFunc.size() >= 1); - - return new RpcCallFunction( - ((QVariant<String>) packedFunc.remove(0)).data, - DatastreamPeer.unboxList(packedFunc) - ); - } - -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedSyncFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedSyncFunctionSerializer.java deleted file mode 100644 index b71316ab3..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedSyncFunctionSerializer.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.protocols.DatastreamPeer; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class PackedSyncFunctionSerializer<T> implements FunctionSerializer<SyncFunction<T>> { - @NonNull - private static final PackedSyncFunctionSerializer serializer = new PackedSyncFunctionSerializer(); - - private PackedSyncFunctionSerializer() { - } - - @NonNull - public static PackedSyncFunctionSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull final SyncFunction data) { - final List func = new ArrayList<>(); - func.add(new QVariant<>(QMetaType.Type.Int, FunctionType.SYNC.id)); - func.add(new QVariant<>(QMetaType.Type.QByteArray, data.className)); - func.add(new QVariant<>(QMetaType.Type.QByteArray, data.objectName)); - func.add(new QVariant<>(QMetaType.Type.QByteArray, data.methodName)); - func.addAll(data.params); - return func; - } - - @NonNull - @Override - public SyncFunction<T> deserialize(@NonNull final List packedFunc) { - assertTrue(packedFunc.size() >= 3); - - return new SyncFunction<>( - ((QVariant<String>) packedFunc.remove(0)).data, - ((QVariant<String>) packedFunc.remove(0)).data, - ((QVariant<String>) packedFunc.remove(0)).data, - DatastreamPeer.unboxList(packedFunc) - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedInitDataFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedInitDataFunctionSerializer.java deleted file mode 100644 index e842e2eb3..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedInitDataFunctionSerializer.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.PackedInitDataFunction; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class UnpackedInitDataFunctionSerializer implements FunctionSerializer<PackedInitDataFunction> { - @NonNull - private static final UnpackedInitDataFunctionSerializer serializer = new UnpackedInitDataFunctionSerializer(); - - private UnpackedInitDataFunctionSerializer() { - } - - @NonNull - public static UnpackedInitDataFunctionSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull final PackedInitDataFunction data) { - final List func = new ArrayList<>(); - func.add(FunctionType.INITDATA.id); - func.add(data.className); - func.add(data.objectName); - func.add(data.getData()); - return func; - } - - @NonNull - @Override - public PackedInitDataFunction deserialize(@NonNull final List packedFunc) { - assertTrue(packedFunc.size() >= 3); - - return new PackedInitDataFunction( - (String) packedFunc.remove(0), - (String) packedFunc.remove(0), - (Map<String, QVariant>) packedFunc.remove(0) - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedRpcCallFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedRpcCallFunctionSerializer.java deleted file mode 100644 index e28650f0a..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedRpcCallFunctionSerializer.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class UnpackedRpcCallFunctionSerializer implements FunctionSerializer<RpcCallFunction> { - @NonNull - private static final UnpackedRpcCallFunctionSerializer serializer = new UnpackedRpcCallFunctionSerializer(); - - private UnpackedRpcCallFunctionSerializer() { - } - - @NonNull - public static UnpackedRpcCallFunctionSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull final RpcCallFunction data) { - final List func = new ArrayList<>(); - func.add(new QVariant<>(QMetaType.Type.Int, FunctionType.RPCCALL.id)); - func.add(new QVariant<>(QMetaType.Type.QByteArray, data.functionName)); - func.addAll(data.params); - return func; - } - - @NonNull - @Override - public RpcCallFunction deserialize(@NonNull final List packedFunc) { - assertTrue(packedFunc.size() >= 1); - - return new RpcCallFunction( - (String) packedFunc.remove(0), - packedFunc - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedSyncFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedSyncFunctionSerializer.java deleted file mode 100644 index 27e933104..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedSyncFunctionSerializer.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.serializers; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class UnpackedSyncFunctionSerializer<T> implements FunctionSerializer<SyncFunction<T>> { - @NonNull - private static final UnpackedSyncFunctionSerializer serializer = new UnpackedSyncFunctionSerializer(); - - private UnpackedSyncFunctionSerializer() { - } - - @NonNull - public static UnpackedSyncFunctionSerializer get() { - return serializer; - } - - @NonNull - @Override - public List serialize(@NonNull final SyncFunction data) { - final List func = new ArrayList<>(); - func.add(new QVariant<>(QMetaType.Type.Int, FunctionType.SYNC.id)); - func.add(new QVariant<>(QMetaType.Type.QByteArray, data.className)); - func.add(new QVariant<>(QMetaType.Type.QByteArray, data.objectName)); - func.add(new QVariant<>(QMetaType.Type.QByteArray, data.methodName)); - func.addAll(data.params); - return func; - } - - @NonNull - @Override - public SyncFunction<T> deserialize(@NonNull final List packedFunc) { - assertTrue(packedFunc.size() >= 3); - - return new SyncFunction<>( - (String) packedFunc.remove(0), - (String) packedFunc.remove(0), - (String) packedFunc.remove(0), - packedFunc - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/HandshakeFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/HandshakeFunction.java deleted file mode 100644 index 75d7384ab..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/HandshakeFunction.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -public class HandshakeFunction { - public final Object data; - - public HandshakeFunction(Object data) { - this.data = data; - } - - @NonNull - @Override - public String toString() { - return "HandshakeFunction{" + - "data=" + data + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java b/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java deleted file mode 100644 index 8972e8ca8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/Heartbeat.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -public class Heartbeat { - public final DateTime dateTime; - - public Heartbeat(DateTime dateTime) { - this.dateTime = dateTime; - } - - public Heartbeat() { - this(DateTime.now().toDateTimeISO()); - } - - @NonNull - @Override - public String toString() { - return "Heartbeat{" + - "dateTime=" + dateTime + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java b/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java deleted file mode 100644 index 8ae2cb05f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/HeartbeatReply.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -public class HeartbeatReply { - public final DateTime dateTime; - - public HeartbeatReply(DateTime dateTime) { - this.dateTime = dateTime; - } - - public HeartbeatReply() { - this(DateTime.now().toDateTimeISO()); - } - - public HeartbeatReply(@NonNull Heartbeat heartbeat) { - this(heartbeat.dateTime); - } - - @NonNull - @Override - public String toString() { - return "HeartbeatReply{" + - "dateTime=" + dateTime + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/InitDataFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/InitDataFunction.java deleted file mode 100644 index 8f66606da..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/InitDataFunction.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; - -public abstract class InitDataFunction implements SerializedFunction<Map<String, QVariant>> { - public String className; - public String objectName; -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/InitRequestFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/InitRequestFunction.java deleted file mode 100644 index 5822d3128..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/InitRequestFunction.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -public class InitRequestFunction { - @NonNull - public final String className; - @Nullable - public final String objectName; - - public InitRequestFunction(@NonNull String className, @Nullable String objectName) { - this.className = className; - this.objectName = objectName; - } - - @NonNull - @Override - public String toString() { - return "InitRequestFunction{" + - "className='" + className + '\'' + - ", objectName='" + objectName + '\'' + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/PackedFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/PackedFunction.java deleted file mode 100644 index c72444741..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/PackedFunction.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; - -public interface PackedFunction extends SerializedFunction<Map<String, QVariant>> { - @NonNull - Map<String, QVariant> getData(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/PackedInitDataFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/PackedInitDataFunction.java deleted file mode 100644 index 943022e37..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/PackedInitDataFunction.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; - -public class PackedInitDataFunction extends InitDataFunction implements PackedFunction { - @NonNull - private final Map<String, QVariant> data; - - public PackedInitDataFunction(@NonNull String className, @NonNull String objectName, @NonNull Map<String, QVariant> data) { - this.className = className; - this.objectName = objectName; - this.data = data; - } - - @NonNull - @Override - public Map<String, QVariant> getData() { - return data; - } - - @NonNull - @Override - public String toString() { - return "PackedInitDataFunction{" + - "data=" + data + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java deleted file mode 100644 index 4f9dffe9f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/RpcCallFunction.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -import java.util.Arrays; -import java.util.List; - -public class RpcCallFunction { - @NonNull - public final String functionName; - @NonNull - public final List params; - - public RpcCallFunction(@NonNull String functionName, @NonNull List params) { - this.functionName = functionName; - this.params = params; - } - - public RpcCallFunction(@NonNull String functionName, @NonNull Object... params) { - this.functionName = functionName; - this.params = Arrays.asList(params); - } - - @NonNull - @Override - public String toString() { - return "RpcCallFunction{" + - "functionName='" + functionName + '\'' + - ", params=" + params + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/SerializedFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/SerializedFunction.java deleted file mode 100644 index c2c9b56d6..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/SerializedFunction.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -public interface SerializedFunction<T> { - @NonNull - T getData(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/SyncFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/SyncFunction.java deleted file mode 100644 index 1a157532a..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/SyncFunction.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.List; - -public class SyncFunction<T> { - @NonNull - public final String className; - @Nullable - public final String objectName; - @NonNull - public final String methodName; - @NonNull - public final List<T> params; - - public SyncFunction(@NonNull String className, @Nullable String objectName, @NonNull String methodName, @NonNull List<T> params) { - this.className = className; - this.objectName = objectName; - this.methodName = methodName; - this.params = params; - } - - @NonNull - @Override - public String toString() { - return "SyncFunction{" + - "className='" + className + '\'' + - ", objectName='" + objectName + '\'' + - ", methodName='" + methodName + '\'' + - ", params=" + params + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/UnpackedFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/UnpackedFunction.java deleted file mode 100644 index 78bd30506..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/UnpackedFunction.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; - -public interface UnpackedFunction extends SerializedFunction<Map<String, QVariant>> { - @NonNull - Map<String, QVariant> getData(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/functions/types/UnpackedInitDataFunction.java b/app/src/main/java/de/kuschku/libquassel/functions/types/UnpackedInitDataFunction.java deleted file mode 100644 index 4a1ae753e..000000000 --- a/app/src/main/java/de/kuschku/libquassel/functions/types/UnpackedInitDataFunction.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.functions.types; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; - -public class UnpackedInitDataFunction extends InitDataFunction implements UnpackedFunction { - @NonNull - private final Map<String, QVariant> data; - - public UnpackedInitDataFunction(@NonNull String className, @NonNull String objectName, @NonNull Map<String, QVariant> data) { - this.className = className; - this.objectName = objectName; - this.data = data; - } - - @NonNull - @Override - public Map<String, QVariant> getData() { - return data; - } - - @NonNull - @Override - public String toString() { - return "UnpackedInitDataFunction{" + - "data=" + data + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java deleted file mode 100644 index 441cdabdf..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.raizlabs.android.dbflow.sql.language.SQLite; - -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.message.Message_Table; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.observables.callbacks.ElementCallback; -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.lists.AndroidObservableComparableSortedList; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class BacklogFilter implements UICallback { - @NonNull - private final Client client; - private final int bufferId; - @NonNull - private final AndroidObservableComparableSortedList<Message> unfiltered; - @NonNull - private final AndroidObservableComparableSortedList<Message> filtered; - - private final EventBus bus = new EventBus(); - ElementCallback<Message.Type> typeCallback = new ElementCallback<Message.Type>() { - @Override - public void notifyItemInserted(Message.Type element) { - bus.post(new UpdateRemoveEvent()); - } - - @Override - public void notifyItemRemoved(Message.Type element) { - bus.post(new UpdateAddEvent()); - } - - @Override - public void notifyItemChanged(Message.Type element) { - - } - }; - @Nullable - private CharSequence searchQuery; - private Message markerlineMessage; - - public BacklogFilter(@NonNull Client client, int bufferId, @NonNull AndroidObservableComparableSortedList<Message> unfiltered, @NonNull AndroidObservableComparableSortedList<Message> filtered) { - this.client = client; - this.bufferId = bufferId; - this.unfiltered = unfiltered; - this.filtered = filtered; - this.bus.register(this); - client.bufferSyncer().getFilteredTypes(bufferId).addCallback(typeCallback); - updateDayChangeMessages(); - } - - public void loadBackload() { - bus.post(new LoadBacklogEvent()); - } - - private Message createMarkerlineMessage(int id) { - return Message.create( - id, - null, - Message.Type.Markerline, - new Message.Flags((byte) 0x00), - BufferInfo.create( - bufferId, - -1, - BufferInfo.Type.INVALID, - -1, - null - ), - null, - null - ); - } - - public void setMarkerlineMessage(int id) { - /* - Message markerlineMessage = this.markerlineMessage; - bus.post(new MessageRemoveEvent(markerlineMessage)); - this.markerlineMessage = createMarkerlineMessage(id); - bus.post(new MessageInsertEvent(this.markerlineMessage)); - */ - } - - @Override - public void notifyItemInserted(int position) { - Message message = unfiltered.get(position); - bus.post(new MessageFilterEvent(message)); - } - - private void updateDayChangeMessages() { - /* - LocalDate date = null; - Message lastMessage = null; - for (Message message : filtered) { - if (Objects.equals(date, message.getLocalDate())) - continue; - date = message.getLocalDate(); - if (message.type == Message.Type.DayChange) { - if (lastMessage != null && lastMessage.type == Message.Type.DayChange) { - bus.post(new MessageRemoveEvent(lastMessage)); - } - lastMessage = message; - continue; - } - - lastMessage = message; - date = message.getLocalDate(); - DateTime time = message.time.withMillisOfDay(0); - bus.post(new MessageInsertEvent(Message.create( - (int) DateTimeUtils.toJulianDay(time.getMillis()), - time, - Message.Type.DayChange, - new Message.Flags(false, false, false, false, false), - BufferInfo.create( - bufferId, - -1, - BufferInfo.Type.INVALID, - -1, - null - ), - "", - "" - ))); - } - DateTime time = DateTime.now(); - if (!Objects.equals(date, time.toLocalDate())) { - time = time.withMillisOfDay(0); - bus.post(new MessageInsertEvent(Message.create( - (int) DateTimeUtils.toJulianDay(time.getMillis()), - time, - Message.Type.DayChange, - new Message.Flags(false, false, false, false, false), - BufferInfo.create( - bufferId, - -1, - BufferInfo.Type.INVALID, - -1, - null - ), - "", - "" - ))); - } - */ - } - - private boolean filterItem(@NonNull Message message) { - QNetwork network = client.networkManager().network(client.bufferManager().buffer(message.bufferInfo.id).getInfo().networkId); - assertNotNull(network); - boolean ignored = client.ignoreListManager() != null && client.ignoreListManager().matches(message, network); - boolean filtered = client.bufferSyncer().getFilteredTypes(bufferId).contains(message.type); - boolean isSearching = searchQuery != null && searchQuery.length() != 0; - return ignored || filtered || (isSearching && !message.content.contains(searchQuery)); - } - - public void update() { - bus.post(new UpdateAddEvent()); - bus.post(new UpdateRemoveEvent()); - } - - public void setQuery(CharSequence query) { - searchQuery = query; - update(); - } - - @Subscribe(threadMode = ThreadMode.ASYNC) - public void onEventAsync(UpdateAddEvent event) { - List<Message> filteredMessages = new ArrayList<>(); - for (Message message : unfiltered) { - if (!filterItem(message)) - filteredMessages.add(message); - } - - bus.post(new MessageInsertEvent(filteredMessages)); - } - - @Subscribe(threadMode = ThreadMode.ASYNC) - public void onEventAsync(UpdateRemoveEvent event) { - List<Message> removedMessages = new ArrayList<>(); - for (Message message : unfiltered) { - if (filterItem(message)) - removedMessages.add(message); - } - - bus.post(new MessageRemoveEvent(removedMessages)); - } - - @Subscribe(threadMode = ThreadMode.ASYNC) - public void onEventAsync(@NonNull MessageFilterEvent event) { - List<Message> filteredMessages = new ArrayList<>(); - for (Message message : event.msgs) { - if (!filterItem(message)) - filteredMessages.add(message); - } - - bus.post(new MessageInsertEvent(filteredMessages)); - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(@NonNull MessageInsertEvent event) { - filtered.addAll(event.msgs); - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(@NonNull MessageRemoveEvent event) { - filtered.removeAll(event.msgs); - } - - @Subscribe(threadMode = ThreadMode.ASYNC) - public void onEventAsync(@NonNull LoadBacklogEvent event) { - List<Message> messageList = SQLite.select().from(Message.class).where(Message_Table.bufferInfo_id.eq(bufferId)).queryList(); - bus.post(new BacklogLoadedEvent(messageList)); - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(@NonNull BacklogLoadedEvent event) { - unfiltered.addAll(event.messageList); - } - - @Override - public void notifyItemChanged(int position) { - int position1 = filtered.indexOf(unfiltered.get(position)); - if (position1 != -1) - filtered.notifyItemChanged(position1); - } - - @Override - public void notifyItemRemoved(int position) { - bus.post(new MessageRemoveEvent(unfiltered.get(position))); - } - - @Override - public void notifyItemMoved(int from, int to) { - // Can’t occur: Sorted List - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - List<Message> messages = unfiltered.subList(position, position + count); - bus.post(new MessageFilterEvent(messages)); - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - for (int i = position; i < position + count; i++) { - notifyItemChanged(i); - } - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - List<Message> messages = unfiltered.subList(position, position + count); - bus.post(new MessageRemoveEvent(messages)); - } - - public void onDestroy() { - bus.unregister(this); - client.bufferSyncer().getFilteredTypes(bufferId).removeCallback(typeCallback); - typeCallback = null; - } - - private class MessageInsertEvent { - public final List<Message> msgs; - - public MessageInsertEvent(Message msg) { - this.msgs = Collections.singletonList(msg); - } - - public MessageInsertEvent(List<Message> msgs) { - this.msgs = msgs; - } - } - - private class MessageRemoveEvent { - public final List<Message> msgs; - - public MessageRemoveEvent(Message msg) { - this.msgs = Collections.singletonList(msg); - } - - public MessageRemoveEvent(List<Message> msgs) { - this.msgs = msgs; - } - } - - private class MessageFilterEvent { - public final List<Message> msgs; - - public MessageFilterEvent(Message msg) { - this.msgs = Collections.singletonList(msg); - } - - public MessageFilterEvent(List<Message> msgs) { - this.msgs = msgs; - } - } - - private class UpdateAddEvent { - } - - private class UpdateRemoveEvent { - } - - private class LoadBacklogEvent { - } - - private class BacklogLoadedEvent { - private final List<Message> messageList; - - public BacklogLoadedEvent(List<Message> messageList) { - this.messageList = messageList; - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java deleted file mode 100644 index 953dbebca..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.backlogstorage; - -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; - -import java.util.List; -import java.util.Set; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.localtypes.BacklogFilter; -import de.kuschku.libquassel.message.Message; -import de.kuschku.util.observables.lists.AndroidObservableComparableSortedList; - -public interface BacklogStorage { - @NonNull - AndroidObservableComparableSortedList<Message> getUnfiltered(@IntRange(from = 0) int bufferid); - - @NonNull - AndroidObservableComparableSortedList<Message> getFiltered(@IntRange(from = 0) int bufferid); - - @NonNull - BacklogFilter getFilter(@IntRange(from = 0) int bufferid); - - int getLatest(@IntRange(from = 0) int bufferid); - - void insertMessages(@IntRange(from = 0) int bufferId, Message... messages); - - void insertMessages(@IntRange(from = 0) int bufferId, List<Message> messages); - - void insertMessages(Message... messages); - - void insertMessages(List<Message> messages); - - void setClient(Client client); - - void markBufferUnused(@IntRange(from = 0) int bufferid); - - void clear(@IntRange(from = 0) int bufferid); - - Set<BacklogFilter> getFilters(); - - void setMarkerLine(@IntRange(from = 0) int buffer, int msgId); - - void merge(@IntRange(from = 0) int buffer1, @IntRange(from = 0) int buffer2); -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java deleted file mode 100644 index 0779ed071..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.backlogstorage; - -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; -import android.util.Log; -import android.util.SparseArray; - -import com.raizlabs.android.dbflow.config.FlowManager; -import com.raizlabs.android.dbflow.sql.language.SQLite; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.localtypes.BacklogFilter; -import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.message.Message_Table; -import de.kuschku.util.observables.lists.AndroidObservableComparableSortedList; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class HybridBacklogStorage implements BacklogStorage { - @NonNull - private final SparseArray<AndroidObservableComparableSortedList<Message>> backlogs = new SparseArray<>(); - @NonNull - private final SparseArray<AndroidObservableComparableSortedList<Message>> filteredBacklogs = new SparseArray<>(); - @NonNull - private final SparseArray<BacklogFilter> filters = new SparseArray<>(); - @NonNull - private final SparseArray<Integer> latestMessage = new SparseArray<>(); - @NonNull - private final Set<BacklogFilter> filterSet = new HashSet<>(); - - private ExecutorService executor = Executors.newCachedThreadPool(); - - private Client client; - - @NonNull - @Override - public AndroidObservableComparableSortedList<Message> getUnfiltered(@IntRange(from = -1) int bufferid) { - ensureExisting(bufferid); - return backlogs.get(bufferid); - } - - @NonNull - @Override - public AndroidObservableComparableSortedList<Message> getFiltered(@IntRange(from = -1) int bufferid) { - ensureExisting(bufferid); - return filteredBacklogs.get(bufferid); - } - - @NonNull - @Override - public BacklogFilter getFilter(int bufferid) { - ensureExisting(bufferid); - return filters.get(bufferid); - } - - @Override - public int getLatest(@IntRange(from = 0) int bufferid) { - return latestMessage.get(bufferid, -1); - } - - @Override - public void insertMessages(@IntRange(from = 0) int bufferId, @NonNull Message... messages) { - FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(databaseWrapper -> { - for (Message message : messages) { - client.unbufferBuffer(message.bufferInfo); - synchronized (backlogs) { - client.bufferSyncer().addActivity(message); - message.save(); - message.bufferInfo.save(); - } - updateLatest(message); - } - - synchronized (backlogs) { - if (backlogs.get(bufferId) != null) - backlogs.get(bufferId).addAll(Arrays.asList(messages)); - } - }); - } - - @Override - public void insertMessages(@IntRange(from = 0) int bufferId, List<Message> messages) { - FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(databaseWrapper -> { - for (Message message : messages) { - client.unbufferBuffer(message.bufferInfo); - synchronized (backlogs) { - if (backlogs.get(bufferId) != null) - backlogs.get(bufferId).add(message); - client.bufferSyncer().addActivity(message); - message.save(); - message.bufferInfo.save(); - } - updateLatest(message); - } - - synchronized (backlogs) { - if (backlogs.get(bufferId) != null) - backlogs.get(bufferId).addAll(messages); - } - }); - } - - public void updateLatest(@NonNull Message message) { - if (message.id > getLatest(message.bufferInfo.id)) { - latestMessage.put(message.bufferInfo.id, message.id); - } - } - - @Override - public void insertMessages(@NonNull Message... messages) { - FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(databaseWrapper -> { - for (Message message : messages) { - client.unbufferBuffer(message.bufferInfo); - synchronized (backlogs) { - if (backlogs.get(message.bufferInfo.id) != null) - backlogs.get(message.bufferInfo.id).add(message); - if (client.bufferSyncer() != null) - client.bufferSyncer().addActivity(message); - message.save(); - message.bufferInfo.save(); - } - updateLatest(message); - } - }); - } - - @Override - public void insertMessages(List<Message> messages) { - FlowManager.getDatabase(ConnectedDatabase.class).executeTransaction(databaseWrapper -> { - for (Message message : messages) { - client.unbufferBuffer(message.bufferInfo); - synchronized (backlogs) { - if (backlogs.get(message.bufferInfo.id) != null) - backlogs.get(message.bufferInfo.id).add(message); - client.bufferSyncer().addActivity(message); - message.save(); - message.bufferInfo.save(); - } - updateLatest(message); - } - }); - } - - public void setClient(Client client) { - this.client = client; - } - - @Override - public void markBufferUnused(@IntRange(from = 0) int bufferid) { - synchronized (backlogs) { - BacklogFilter filter = filters.get(bufferid); - if (backlogs.get(bufferid) != null && filter != null) - backlogs.get(bufferid).removeCallbacks(); - backlogs.remove(bufferid); - if (filter != null) - filter.onDestroy(); - if (filteredBacklogs.get(bufferid) != null) - filteredBacklogs.get(bufferid).removeCallbacks(); - filteredBacklogs.delete(bufferid); - synchronized (filterSet) { - filterSet.remove(filter); - filters.delete(bufferid); - } - } - } - - @Override - public void clear(@IntRange(from = 0) int bufferid) { - synchronized (backlogs) { - Log.w("libquassel", String.format("Backlog gap detected, clearing backlog for buffer %d", bufferid)); - SQLite.delete().from(Message.class).where(Message_Table.bufferInfo_id.eq(bufferid)).execute(); - } - } - - @NonNull - @Override - public Set<BacklogFilter> getFilters() { - return filterSet; - } - - @Override - public void setMarkerLine(@IntRange(from = 0) int buffer, int msgId) { - BacklogFilter filter = filters.get(buffer); - if (filter != null) { - Log.w("DEBUG", "Setting markerline for open buffer"); - filter.setMarkerlineMessage(msgId); - } else { - Log.w("DEBUG", "Buffer not open"); - } - } - - @Override - public void merge(@IntRange(from = 0) int buffer1, @IntRange(from = 0) int buffer2) { - SQLite.update(Message.class).set(Message_Table.bufferInfo_id.eq(buffer1)).where(Message_Table.bufferInfo_id.eq(buffer2)).execute(); - } - - private void ensureExisting(@IntRange(from = -1) int bufferId) { - assertNotNull(client); - if (backlogs.get(bufferId) == null) { - AndroidObservableComparableSortedList<Message> messages = new AndroidObservableComparableSortedList<>(Message.class, true); - AndroidObservableComparableSortedList<Message> filteredMessages = new AndroidObservableComparableSortedList<>(Message.class, true); - BacklogFilter backlogFilter = new BacklogFilter(client, bufferId, messages, filteredMessages); - if (client.bufferSyncer() != null) { - backlogFilter.setMarkerlineMessage(client.bufferSyncer().markerLine(bufferId)); - Log.w("DEBUG", "Setting markerline for newly opened buffer"); - } else { - Log.w("DEBUG", "BufferSyncer is null!"); - } - messages.addCallback(backlogFilter); - synchronized (backlogs) { - backlogs.put(bufferId, messages); - } - executor.submit((Runnable) () -> { - List<Message> messageList = SQLite.select().from(Message.class).where(Message_Table.bufferInfo_id.eq(bufferId)).queryList(); - messages.addAll(messageList); - }); - filteredBacklogs.put(bufferId, filteredMessages); - synchronized (filterSet) { - filters.put(bufferId, backlogFilter); - filterSet.add(backlogFilter); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java deleted file mode 100644 index f1f404a9a..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffer.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.buffers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.util.observables.lists.ObservableElement; - -public interface Buffer { - @NonNull - BufferInfo getInfo(); - - void setInfo(@NonNull BufferInfo info); - - @Nullable - String getName(); - - @NonNull - ObservableElement<BufferInfo.BufferStatus> getStatus(); - - void renameBuffer(@NonNull String newName); - - @NonNull - String objectName(); - - @NonNull - String objectName(String name); -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java deleted file mode 100644 index dcbd564f9..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.buffers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.BufferInfo; - -public class Buffers { - private Buffers() { - - } - - @Nullable - public static Buffer fromType(@NonNull BufferInfo info, @NonNull Client client) { - switch (info.type) { - case QUERY: - return new QueryBuffer(info, client); - case CHANNEL: - return new ChannelBuffer(info, client); - case STATUS: - return new StatusBuffer(info, client); - default: - return null; - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java deleted file mode 100644 index b68a12f34..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.buffers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.util.observables.lists.ObservableElement; - -public class ChannelBuffer implements Buffer { - @NonNull - private final Client client; - private final ObservableElement<BufferInfo.BufferStatus> status = new ObservableElement<>(); - @NonNull - private BufferInfo info; - - public ChannelBuffer(@NonNull BufferInfo info, @NonNull Client client) { - this.info = info; - this.client = client; - } - - @NonNull - @Override - public BufferInfo getInfo() { - return info; - } - - @Override - public void setInfo(@NonNull BufferInfo info) { - this.info = info; - } - - @Nullable - @Override - public String getName() { - return getInfo().name; - } - - @NonNull - @Override - public ObservableElement<BufferInfo.BufferStatus> getStatus() { - // FIXME: Make this dynamic - status.set(getChannel() == null ? BufferInfo.BufferStatus.OFFLINE : BufferInfo.BufferStatus.ONLINE); - return status; - } - - @Override - public void renameBuffer(@NonNull String newName) { - info.name = newName; - } - - @NonNull - @Override - public String objectName() { - return objectName(info.name); - } - - @NonNull - @Override - public String objectName(String name) { - return info.networkId + "/" + name; - } - - @Nullable - public QIrcChannel getChannel() { - return client.networkManager().network(info.networkId).ircChannel(info.name); - } - - @NonNull - @Override - public String toString() { - return "ChannelBuffer{" + - "info=" + info + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java deleted file mode 100644 index abba42b89..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.buffers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.util.observables.lists.ObservableElement; - -public class QueryBuffer implements Buffer { - @NonNull - private final Client client; - private final ObservableElement<BufferInfo.BufferStatus> status = new ObservableElement<>(); - @NonNull - private BufferInfo info; - - public QueryBuffer(@NonNull BufferInfo info, @NonNull Client client) { - this.info = info; - this.client = client; - } - - @NonNull - @Override - public BufferInfo getInfo() { - return info; - } - - @Override - public void setInfo(@NonNull BufferInfo info) { - this.info = info; - } - - @Nullable - @Override - public String getName() { - return getInfo().name; - } - - @NonNull - @Override - public ObservableElement<BufferInfo.BufferStatus> getStatus() { - // FIXME: Make this dynamic - status.set((getUser() == null) ? BufferInfo.BufferStatus.OFFLINE : - (getUser().isAway()) ? BufferInfo.BufferStatus.AWAY : - BufferInfo.BufferStatus.ONLINE); - return status; - } - - @Override - public void renameBuffer(@NonNull String newName) { - info.name = newName; - } - - @NonNull - @Override - public String objectName() { - return objectName(info.name); - } - - @NonNull - @Override - public String objectName(String name) { - return info.networkId + "/" + name; - } - - @Nullable - public QIrcUser getUser() { - return client.networkManager().network(info.networkId).ircUser(info.name); - } - - @NonNull - @Override - public String toString() { - return "QueryBuffer{" + - "info=" + info + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java deleted file mode 100644 index f1b8ce7ba..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.buffers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.observables.lists.ObservableElement; - -public class StatusBuffer implements Buffer { - @NonNull - private final Client client; - private final ObservableElement<BufferInfo.BufferStatus> status = new ObservableElement<>(); - @NonNull - private BufferInfo info; - - public StatusBuffer(@NonNull BufferInfo info, @NonNull Client client) { - this.info = info; - this.client = client; - } - - public void updateStatus() { - status.set(getNetwork() != null && getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE); - } - - @NonNull - @Override - public BufferInfo getInfo() { - return info; - } - - @Override - public void setInfo(@NonNull BufferInfo info) { - this.info = info; - } - - public QNetwork getNetwork() { - return client.networkManager().network(info.networkId); - } - - @Nullable - @Override - public String getName() { - return getNetwork().networkName(); - } - - @NonNull - @Override - public ObservableElement<BufferInfo.BufferStatus> getStatus() { - updateStatus(); - return status; - } - - @NonNull - @Override - public String objectName() { - return objectName(info.name); - } - - @NonNull - @Override - public String objectName(String name) { - return info.networkId + "/" + name; - } - - @Override - public void renameBuffer(@NonNull String newName) { - this.info.name = newName; - } - - @NonNull - @Override - public String toString() { - return "StatusBuffer{" + - "info=" + info + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/ConnectedDatabase.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/ConnectedDatabase.java deleted file mode 100644 index eec59165d..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/ConnectedDatabase.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.orm; - -import com.raizlabs.android.dbflow.annotation.Database; - -@Database(name = ConnectedDatabase.NAME, version = ConnectedDatabase.VERSION) -public class ConnectedDatabase { - public static final String NAME = "ConnectedDatabase"; - public static final int VERSION = 2; -} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/BufferTypeConverter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/BufferTypeConverter.java deleted file mode 100644 index 8bfa78dfb..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/BufferTypeConverter.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.orm.converters; - -import com.raizlabs.android.dbflow.converter.TypeConverter; - -import de.kuschku.libquassel.primitives.types.BufferInfo; - -@com.raizlabs.android.dbflow.annotation.TypeConverter -public class BufferTypeConverter extends TypeConverter<Short, BufferInfo.Type> { - @Override - public Short getDBValue(BufferInfo.Type model) { - return model.id; - } - - @Override - public BufferInfo.Type getModelValue(Short data) { - return BufferInfo.Type.fromId(data); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/DateTimeConverter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/DateTimeConverter.java deleted file mode 100644 index 31ee0fdd8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/DateTimeConverter.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.orm.converters; - -import com.raizlabs.android.dbflow.converter.TypeConverter; - -import org.joda.time.DateTime; - -@com.raizlabs.android.dbflow.annotation.TypeConverter -public class DateTimeConverter extends TypeConverter<Long, DateTime> { - @Override - public Long getDBValue(DateTime model) { - return model.getMillis(); - } - - @Override - public DateTime getModelValue(Long data) { - return new DateTime(data.longValue()); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageFlagsConverter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageFlagsConverter.java deleted file mode 100644 index 6ae99fa3f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageFlagsConverter.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.orm.converters; - -import com.raizlabs.android.dbflow.converter.TypeConverter; - -import de.kuschku.libquassel.message.Message; - -@com.raizlabs.android.dbflow.annotation.TypeConverter -public class MessageFlagsConverter extends TypeConverter<Short, Message.Flags> { - @Override - public Short getDBValue(Message.Flags model) { - return (short) model.flags; - } - - @Override - public Message.Flags getModelValue(Short data) { - return new Message.Flags(data.byteValue()); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageTypeConverter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageTypeConverter.java deleted file mode 100644 index 54da63107..000000000 --- a/app/src/main/java/de/kuschku/libquassel/localtypes/orm/converters/MessageTypeConverter.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.localtypes.orm.converters; - -import com.raizlabs.android.dbflow.converter.TypeConverter; - -import de.kuschku.libquassel.message.Message; - -@com.raizlabs.android.dbflow.annotation.TypeConverter -public class MessageTypeConverter extends TypeConverter<Integer, Message.Type> { - @Override - public Integer getDBValue(Message.Type model) { - return model.value; - } - - @Override - public Message.Type getModelValue(Integer data) { - return Message.Type.fromId(data); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/message/Message.java b/app/src/main/java/de/kuschku/libquassel/message/Message.java deleted file mode 100644 index eb795a5b9..000000000 --- a/app/src/main/java/de/kuschku/libquassel/message/Message.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.message; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.raizlabs.android.dbflow.annotation.Column; -import com.raizlabs.android.dbflow.annotation.ForeignKey; -import com.raizlabs.android.dbflow.annotation.PrimaryKey; -import com.raizlabs.android.dbflow.annotation.Table; -import com.raizlabs.android.dbflow.structure.BaseModel; - -import org.joda.time.DateTime; -import org.joda.time.LocalDate; - -import java.io.Serializable; -import java.util.Comparator; - -import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.util.backports.Objects; -import de.kuschku.util.observables.ContentComparable; - -@Table(database = ConnectedDatabase.class) -public class Message extends BaseModel implements ContentComparable<Message> { - @PrimaryKey - public int id; - - @Column - public DateTime time; - - @Column - public Type type; - - @Column - public Flags flags; - - @ForeignKey - public BufferInfo bufferInfo; - - @Column - public String sender; - - @Column - public String content; - - public LocalDate date; - - public static Message create(int id, DateTime time, Type type, Flags flags, BufferInfo bufferInfo, String sender, String content) { - Message message = new Message(); - message.id = id; - message.time = time; - message.type = type; - message.flags = flags; - message.bufferInfo = bufferInfo; - message.sender = sender; - message.content = content; - return message; - } - - public LocalDate getLocalDate() { - if (date == null) - date = time.toLocalDate(); - return date; - } - - @NonNull - @Override - public String toString() { - return "Message{" + - "id=" + id + - ", time=" + time + - ", type=" + type + - ", flags=" + flags + - ", bufferInfo=" + bufferInfo + - ", sender='" + sender + '\'' + - ", content='" + content + '\'' + - '}'; - } - - @Override - public boolean areContentsTheSame(@Nullable Message message) { - return message != null && this.id == message.id && Objects.equals(this.sender, message.sender) && this.type == message.type && Objects.equals(this.time, message.time) && Objects.equals(this.content, message.content) && this.flags == message.flags; - } - - @Override - public boolean areItemsTheSame(@NonNull Message other) { - if (this.type == Type.DayChange && other.type == Type.DayChange) - return this.bufferInfo.id == other.bufferInfo.id && this.time.equals(other.time); - else if (this.type == Type.DayChange) - return false; - else if (other.type == Type.DayChange) - return false; - else - return this.id == other.id; - } - - @Override - public int hashCode() { - return id; - } - - @Override - public int compareTo(@NonNull Message another) { - if (this.type == Type.DayChange || another.type == Type.DayChange) { - return this.time.compareTo(another.time); - } else if (this.id == another.id) { - if (this.type == Type.Markerline) - return 1; - else if (another.type == Type.Markerline) - return -1; - else - return 0; - } else { - return this.id - another.id; - } - } - - public enum Type { - Plain(0x00001), - Notice(0x00002), - Action(0x00004), - Nick(0x00008), - Mode(0x00010), - Join(0x00020), - Part(0x00040), - Quit(0x00080), - Kick(0x00100), - Kill(0x00200), - Server(0x00400), - Info(0x00800), - Error(0x01000), - DayChange(0x02000), - Topic(0x04000), - NetsplitJoin(0x08000), - NetsplitQuit(0x10000), - Invite(0x20000), - Markerline(0x40000); - - public final int value; - - Type(int value) { - this.value = value; - } - - @NonNull - public static Type fromId(int id) { - switch (id) { - case 0x00001: - return Plain; - case 0x00002: - return Notice; - case 0x00004: - return Action; - case 0x00008: - return Nick; - case 0x00010: - return Mode; - case 0x00020: - return Join; - case 0x00040: - return Part; - case 0x00080: - return Quit; - case 0x00100: - return Kick; - case 0x00200: - return Kill; - case 0x00400: - return Server; - case 0x00800: - return Info; - case 0x01000: - return Error; - case 0x02000: - return DayChange; - case 0x04000: - return Topic; - case 0x08000: - return NetsplitJoin; - case 0x10000: - return NetsplitQuit; - case 0x20000: - return Invite; - default: - return Error; - } - } - - } - - public static class Flags { - public final boolean Self; - public final boolean Highlight; - public final boolean Redirected; - public final boolean ServerMsg; - public final boolean Backlog; - - public final byte flags; - - public Flags(boolean self, boolean highlight, boolean redirected, boolean serverMsg, boolean backlog) { - Self = self; - Highlight = highlight; - Redirected = redirected; - ServerMsg = serverMsg; - Backlog = backlog; - - flags = (byte) ((Self ? 0x01 : 0x00) | - (Highlight ? 0x02 : 0x00) | - (Redirected ? 0x04 : 0x00) | - (ServerMsg ? 0x08 : 0x00) | - (Backlog ? 0x80 : 0x00)); - } - - public Flags(byte flags) { - this.flags = flags; - Self = (0 != (flags & 0x01)); - Highlight = (0 != (flags & 0x02)); - Redirected = (0 != (flags & 0x04)); - ServerMsg = (0 != (flags & 0x08)); - Backlog = (0 != (flags & 0x80)); - } - - @NonNull - @Override - public String toString() { - final StringBuilder output = new StringBuilder("Flags[, "); - if (Self) output.append("Self, "); - if (Highlight) output.append("Highlight, "); - if (Redirected) output.append("Redirected, "); - if (ServerMsg) output.append("ServerMsg, "); - if (Backlog) output.append("Backlog, "); - output.deleteCharAt(output.length() - 1); - output.deleteCharAt(output.length() - 1); - output.append("]"); - output.append(flags); - return output.toString(); - } - - } - - public static class MessageComparator implements Comparator<Message>, Serializable { - @Override - public int compare(@NonNull Message o1, @NonNull Message o2) { - return o1.id - o2.id; - } - - @Override - public boolean equals(@Nullable Object obj) { - return obj == this; - } - } - -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/MessageTypeRegistry.java b/app/src/main/java/de/kuschku/libquassel/objects/MessageTypeRegistry.java deleted file mode 100644 index 5633e9d3f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/MessageTypeRegistry.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.objects.serializers.ClientInitAckSerializer; -import de.kuschku.libquassel.objects.serializers.ClientInitRejectSerializer; -import de.kuschku.libquassel.objects.serializers.ClientInitSerializer; -import de.kuschku.libquassel.objects.serializers.ClientLoginAckSerializer; -import de.kuschku.libquassel.objects.serializers.ClientLoginRejectSerializer; -import de.kuschku.libquassel.objects.serializers.ClientLoginSerializer; -import de.kuschku.libquassel.objects.serializers.CoreSetupAckSerializer; -import de.kuschku.libquassel.objects.serializers.CoreSetupDataSerializer; -import de.kuschku.libquassel.objects.serializers.CoreSetupRejectSerializer; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.objects.serializers.SessionInitSerializer; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class MessageTypeRegistry { - @NonNull - private static final Map<String, ObjectSerializer> serializerMap = new HashMap<>(); - - static { - serializerMap.put("ClientInit", ClientInitSerializer.get()); - serializerMap.put("ClientInitAck", ClientInitAckSerializer.get()); - serializerMap.put("ClientInitReject", ClientInitRejectSerializer.get()); - serializerMap.put("ClientLogin", ClientLoginSerializer.get()); - serializerMap.put("ClientLoginAck", ClientLoginAckSerializer.get()); - serializerMap.put("ClientLoginReject", ClientLoginRejectSerializer.get()); - serializerMap.put("CoreSetupData", CoreSetupDataSerializer.get()); - serializerMap.put("CoreSetupAck", CoreSetupAckSerializer.get()); - serializerMap.put("CoreSetupReject", CoreSetupRejectSerializer.get()); - serializerMap.put("SessionInit", SessionInitSerializer.get()); - } - - // Disable Constructor - private MessageTypeRegistry() { - - } - - @NonNull - public static <T> T from(@NonNull final Map<String, QVariant> function) { - final String msgType = (String) function.get("MsgType").data; - if (serializerMap.containsKey(msgType)) - return (T) serializerMap.get(msgType).fromLegacy(function); - else - throw new IllegalArgumentException(String.format("Unknown MessageType: %s", msgType)); - } - - @NonNull - public static <T> QVariant<Map<String, QVariant>> toVariantMap(@NonNull final T data) { - assertTrue(serializerMap.containsKey(data.getClass().getSimpleName())); - - final QVariant<Map<String, QVariant>> map = new QVariant<>(serializerMap.get(data.getClass().getSimpleName()).toVariantMap(data)); - map.data.put("MsgType", new QVariant(QMetaType.Type.QString, data.getClass().getSimpleName())); - return map; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitAckSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitAckSerializer.java deleted file mode 100644 index ea3725b3e..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitAckSerializer.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.ClientInitAck; -import de.kuschku.libquassel.objects.types.StorageBackend; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class ClientInitAckSerializer implements ObjectSerializer<ClientInitAck> { - @NonNull - private static final ClientInitAckSerializer serializer = new ClientInitAckSerializer(); - - private ClientInitAckSerializer() { - } - - @NonNull - public static ClientInitAckSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientInitAck data) { - final List<Map<String, QVariant<Object>>> storageBackends = new ArrayList<>(); - final StorageBackendSerializer storageBackendSerializer = StorageBackendSerializer.get(); - if (data.StorageBackends != null) - for (StorageBackend backend : data.StorageBackends) { - storageBackends.add(storageBackendSerializer.toVariantMap(backend)); - } - - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("Configured", new QVariant<>(QMetaType.Type.Bool, data.Configured)); - map.put("LoginEnabled", new QVariant<>(QMetaType.Type.Bool, data.LoginEnabled)); - map.put("StorageBackends", new QVariant<>(QMetaType.Type.QVariantList, storageBackends)); - map.put("CoreFeatures", new QVariant<>(QMetaType.Type.Int, data.CoreFeatures)); - return map; - } - - @NonNull - @Override - public ClientInitAck fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public ClientInitAck fromLegacy(@NonNull Map<String, QVariant> map) { - final List<StorageBackend> storageBackends = new ArrayList<>(); - if (map.containsKey("StorageBackends")) { - final StorageBackendSerializer storageBackendSerializer = StorageBackendSerializer.get(); - for (Map<String, QVariant> backend : (List<Map<String, QVariant>>) map.get("StorageBackends").data) { - storageBackends.add(storageBackendSerializer.fromLegacy(backend)); - } - } - final int coreFeatures = map.containsKey("CoreFeatures") ? ((QVariant<Integer>) map.get("CoreFeatures")).data : 0x00; - return new ClientInitAck( - ((QVariant<Boolean>) map.get("Configured")).data, - ((QVariant<Boolean>) map.get("LoginEnabled")).data, - coreFeatures, - storageBackends - ); - } - - @Nullable - @Override - public ClientInitAck from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitRejectSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitRejectSerializer.java deleted file mode 100644 index 5b861cf71..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitRejectSerializer.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.ClientInitReject; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class ClientInitRejectSerializer implements ObjectSerializer<ClientInitReject> { - @NonNull - private static final ClientInitRejectSerializer serializer = new ClientInitRejectSerializer(); - - private ClientInitRejectSerializer() { - } - - @NonNull - public static ClientInitRejectSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientInitReject data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("Error", new QVariant<>(QMetaType.Type.QString, data.Error)); - return map; - } - - @NonNull - @Override - public ClientInitReject fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public ClientInitReject fromLegacy(@NonNull Map<String, QVariant> map) { - return new ClientInitReject( - (String) map.get("Error").data - ); - } - - @Override - public ClientInitReject from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitSerializer.java deleted file mode 100644 index bb0e5aaf9..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitSerializer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.ClientInit; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class ClientInitSerializer implements ObjectSerializer<ClientInit> { - @NonNull - private static final ClientInitSerializer serializer = new ClientInitSerializer(); - - private ClientInitSerializer() { - } - - @NonNull - public static ClientInitSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientInit data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("ClientDate", new QVariant<>(QMetaType.Type.QString, data.ClientDate)); - map.put("UseSsl", new QVariant<>(QMetaType.Type.Bool, data.UseSsl)); - map.put("ClientVersion", new QVariant<>(QMetaType.Type.QString, data.ClientVersion)); - map.put("UseCompression", new QVariant<>(QMetaType.Type.Bool, data.UseCompression)); - map.put("ProtocolVersion", new QVariant<>(QMetaType.Type.Int, data.ProtocolVersion)); - return map; - } - - @NonNull - @Override - public ClientInit fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public ClientInit fromLegacy(@NonNull final Map<String, QVariant> map) { - return new ClientInit( - ((QVariant<String>) map.get("ClientDate")).data, - ((QVariant<Boolean>) map.get("UseSsl")).data, - ((QVariant<String>) map.get("ClientVersion")).data, - ((QVariant<Boolean>) map.get("UseCompression")).data, - ((QVariant<Integer>) map.get("ProtocolVersion")).data - ); - } - - @Override - public ClientInit from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginAckSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginAckSerializer.java deleted file mode 100644 index b6b444c3c..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginAckSerializer.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.ClientLoginAck; -import de.kuschku.libquassel.primitives.types.QVariant; - -public class ClientLoginAckSerializer implements ObjectSerializer<ClientLoginAck> { - @NonNull - private static final ClientLoginAckSerializer serializer = new ClientLoginAckSerializer(); - - private ClientLoginAckSerializer() { - } - - @NonNull - public static ClientLoginAckSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientLoginAck data) { - return new HashMap<>(); - } - - @NonNull - @Override - public ClientLoginAck fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public ClientLoginAck fromLegacy(@NonNull final Map<String, QVariant> map) { - return new ClientLoginAck(); - } - - @Override - public ClientLoginAck from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginRejectSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginRejectSerializer.java deleted file mode 100644 index 2c45e0aa6..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginRejectSerializer.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.ClientLoginReject; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class ClientLoginRejectSerializer implements ObjectSerializer<ClientLoginReject> { - @NonNull - private static final ClientLoginRejectSerializer serializer = new ClientLoginRejectSerializer(); - - private ClientLoginRejectSerializer() { - } - - @NonNull - public static ClientLoginRejectSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientLoginReject data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - assertNotNull(map); - - map.put("Error", new QVariant<>(QMetaType.Type.QString, data.Error)); - return map; - } - - @NonNull - @Override - public ClientLoginReject fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public ClientLoginReject fromLegacy(@NonNull Map<String, QVariant> map) { - return new ClientLoginReject( - (String) map.get("Error").data - ); - } - - @Override - public ClientLoginReject from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginSerializer.java deleted file mode 100644 index 15936211f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginSerializer.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.ClientLogin; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class ClientLoginSerializer implements ObjectSerializer<ClientLogin> { - @NonNull - private static final ClientLoginSerializer serializer = new ClientLoginSerializer(); - - private ClientLoginSerializer() { - } - - @NonNull - public static ClientLoginSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientLogin data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - - map.put("User", new QVariant<>(QMetaType.Type.QString, data.User)); - map.put("Password", new QVariant<>(QMetaType.Type.QString, data.Password)); - return map; - } - - @NonNull - @Override - public ClientLogin fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public ClientLogin fromLegacy(@NonNull Map<String, QVariant> map) { - return new ClientLogin( - (String) map.get("User").data, - (String) map.get("Password").data - ); - } - - @Override - public ClientLogin from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupAckSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupAckSerializer.java deleted file mode 100644 index bc5ba9393..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupAckSerializer.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.CoreSetupAck; -import de.kuschku.libquassel.primitives.types.QVariant; - -public class CoreSetupAckSerializer implements ObjectSerializer<CoreSetupAck> { - @NonNull - private static final CoreSetupAckSerializer serializer = new CoreSetupAckSerializer(); - - private CoreSetupAckSerializer() { - } - - @NonNull - public static CoreSetupAckSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final CoreSetupAck data) { - return new HashMap<>(); - } - - @NonNull - @Override - public CoreSetupAck fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public CoreSetupAck fromLegacy(@NonNull Map<String, QVariant> map) { - return new CoreSetupAck(); - } - - @Override - public CoreSetupAck from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupDataSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupDataSerializer.java deleted file mode 100644 index 73cb431fc..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupDataSerializer.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.CoreSetupData; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class CoreSetupDataSerializer implements ObjectSerializer<CoreSetupData> { - @NonNull - private static final CoreSetupDataSerializer serializer = new CoreSetupDataSerializer(); - - private CoreSetupDataSerializer() { - } - - @NonNull - public static CoreSetupDataSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final CoreSetupData data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("SetupData", new QVariant<>(QMetaType.Type.QVariantMap, SetupDataInitializer.get().toVariantMap(data.SetupData))); - return map; - } - - @NonNull - @Override - public CoreSetupData fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public CoreSetupData fromLegacy(@NonNull Map<String, QVariant> map) { - return new CoreSetupData( - SetupDataInitializer.get().fromLegacy((Map<String, QVariant>) map.get("SetupData").data) - ); - } - - @Override - public CoreSetupData from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupRejectSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupRejectSerializer.java deleted file mode 100644 index ebef8b2e3..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupRejectSerializer.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.CoreSetupReject; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class CoreSetupRejectSerializer implements ObjectSerializer<CoreSetupReject> { - @NonNull - private static final CoreSetupRejectSerializer serializer = new CoreSetupRejectSerializer(); - - private CoreSetupRejectSerializer() { - } - - @NonNull - public static CoreSetupRejectSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final CoreSetupReject data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("Error", new QVariant<>(QMetaType.Type.QString, data.Error)); - return map; - } - - @NonNull - @Override - public CoreSetupReject fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public CoreSetupReject fromLegacy(@NonNull Map<String, QVariant> map) { - return new CoreSetupReject( - (String) map.get("Error").data - ); - } - - @Override - public CoreSetupReject from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/NetworkServerSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/NetworkServerSerializer.java deleted file mode 100644 index 80d43e454..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/NetworkServerSerializer.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class NetworkServerSerializer implements ObjectSerializer<NetworkServer> { - @NonNull - private static final NetworkServerSerializer serializer = new NetworkServerSerializer(); - - private NetworkServerSerializer() { - } - - @NonNull - public static NetworkServerSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull NetworkServer data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - - map.put("UseSSL", new QVariant<>(QMetaType.Type.Bool, data.useSSL)); - map.put("sslVersion", new QVariant<>(QMetaType.Type.Int, data.sslVersion)); - map.put("Host", new QVariant<>(QMetaType.Type.QString, data.host)); - map.put("Port", new QVariant<>(QMetaType.Type.Int, data.port)); - map.put("Password", new QVariant<>(QMetaType.Type.QString, data.password)); - map.put("UseProxy", new QVariant<>(QMetaType.Type.Bool, data.useProxy)); - map.put("ProxyType", new QVariant<>(QMetaType.Type.Int, data.proxyType.id)); - map.put("ProxyHost", new QVariant<>(QMetaType.Type.QString, data.proxyHost)); - map.put("ProxyPort", new QVariant<>(QMetaType.Type.Int, data.proxyPort)); - map.put("ProxyUser", new QVariant<>(QMetaType.Type.QString, data.proxyUser)); - map.put("ProxyPass", new QVariant<>(QMetaType.Type.QString, data.proxyPass)); - return map; - } - - @NonNull - @Override - public NetworkServer fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public NetworkServer fromLegacy(@NonNull Map<String, QVariant> map) { - return new NetworkServer( - (boolean) map.get("UseSSL").data, - (int) map.get("sslVersion").data, - (String) map.get("Host").data, - (int) map.get("Port").data, - (String) map.get("Password").data, - (boolean) map.get("UseProxy").data, - NetworkServer.ProxyType.fromId((int) map.get("ProxyType").data), - (String) map.get("ProxyHost").data, - (int) map.get("ProxyPort").data, - (String) map.get("ProxyUser").data, - (String) map.get("ProxyPass").data - ); - } - - @Override - public NetworkServer from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ObjectSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ObjectSerializer.java deleted file mode 100644 index d2486ebb7..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ObjectSerializer.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.Map; - -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.primitives.types.QVariant; - -public interface ObjectSerializer<T> { - @Nullable - Map<String, QVariant<Object>> toVariantMap(@NonNull T data); - - @NonNull - T fromDatastream(@NonNull Map<String, QVariant> map); - - @NonNull - T fromLegacy(@NonNull Map<String, QVariant> map); - - @Nullable - T from(@NonNull SerializedFunction function); -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionInitSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionInitSerializer.java deleted file mode 100644 index b0421697b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionInitSerializer.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.SessionInit; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class SessionInitSerializer implements ObjectSerializer<SessionInit> { - @NonNull - private static final SessionInitSerializer serializer = new SessionInitSerializer(); - - private SessionInitSerializer() { - } - - @NonNull - public static SessionInitSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final SessionInit data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("SessionState", new QVariant<>(QMetaType.Type.QVariantMap, SessionStateSerializer.get().toVariantMap(data.SessionState))); - return map; - } - - @NonNull - @Override - public SessionInit fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public SessionInit fromLegacy(@NonNull Map<String, QVariant> map) { - return new SessionInit( - SessionStateSerializer.get().fromLegacy((Map<String, QVariant>) map.get("SessionState").data) - ); - } - - @Override - public SessionInit from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionStateSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionStateSerializer.java deleted file mode 100644 index 060cca0b8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionStateSerializer.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.SessionState; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class SessionStateSerializer implements ObjectSerializer<SessionState> { - @NonNull - private static final SessionStateSerializer serializer = new SessionStateSerializer(); - - private SessionStateSerializer() { - } - - @NonNull - public static SessionStateSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final SessionState data) { - return null; - } - - @NonNull - @Override - public SessionState fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public SessionState fromLegacy(@NonNull Map<String, QVariant> map) { - return new SessionState( - (List<QIdentity>) map.get("Identities").or(new ArrayList<>()), - (List<BufferInfo>) map.get("BufferInfos").or(new ArrayList<>()), - (List<Integer>) map.get("NetworkIds").or(new ArrayList<>()) - ); - } - - @Override - public SessionState from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SetupDataInitializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/SetupDataInitializer.java deleted file mode 100644 index eac46bd79..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SetupDataInitializer.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.SetupData; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class SetupDataInitializer implements ObjectSerializer<SetupData> { - @NonNull - private static final SetupDataInitializer serializer = new SetupDataInitializer(); - - private SetupDataInitializer() { - } - - @NonNull - public static SetupDataInitializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final SetupData data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - - map.put("AdminPasswd", new QVariant<>(QMetaType.Type.QString, data.AdminPasswd)); - map.put("AdminUser", new QVariant<>(QMetaType.Type.QString, data.AdminUser)); - map.put("Backend", new QVariant<>(QMetaType.Type.QString, data.Backend)); - map.put("ConnectionProperties", new QVariant<>(QMetaType.Type.QVariantMap, data.ConnectionProperties)); - return map; - } - - @NonNull - @Override - public SetupData fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public SetupData fromLegacy(@NonNull Map<String, QVariant> map) { - return new SetupData( - (String) map.get("AdminPasswd").data, - (String) map.get("AdminUser").data, - (String) map.get("Backend").data, - (Map<String, QVariant>) map.get("ConnectionProperties").data - ); - } - - @Override - public SetupData from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/StorageBackendSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/StorageBackendSerializer.java deleted file mode 100644 index 1d1e8549e..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/StorageBackendSerializer.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.types.StorageBackend; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class StorageBackendSerializer implements ObjectSerializer<StorageBackend> { - @NonNull - private static final StorageBackendSerializer serializer = new StorageBackendSerializer(); - - private StorageBackendSerializer() { - } - - @NonNull - public static StorageBackendSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull final StorageBackend data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - - map.put("DisplayName", new QVariant<>(QMetaType.Type.QString, data.DisplayName)); - map.put("SetupDefaults", new QVariant<>(QMetaType.Type.QVariantMap, data.SetupDefaults)); - map.put("Description", new QVariant<>(QMetaType.Type.QString, data.Description)); - map.put("SetupKeys", new QVariant<>(QMetaType.Type.QStringList, data.SetupKeys)); - return map; - } - - @NonNull - @Override - public StorageBackend fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public StorageBackend fromLegacy(@NonNull Map<String, QVariant> map) { - return new StorageBackend( - (String) map.get("DisplayName").data, - (Map<String, QVariant>) map.get("SetupDefaults").data, - (String) map.get("Description").data, - (List<String>) map.get("SetupKeys").data - ); - } - - @Override - public StorageBackend from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/StringObjectMapSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/StringObjectMapSerializer.java deleted file mode 100644 index b57b2be7c..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/StringObjectMapSerializer.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class StringObjectMapSerializer<T> implements ObjectSerializer<Map<String, T>> { - @NonNull - private static final StringObjectMapSerializer serializer = new StringObjectMapSerializer(); - - private StringObjectMapSerializer() { - } - - @NonNull - public static <T> StringObjectMapSerializer<T> get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull Map<String, T> data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - - for (Map.Entry<String, T> entry : data.entrySet()) { - map.put(entry.getKey(), new QVariant<>(entry.getValue())); - } - return map; - } - - @NonNull - @Override - public Map<String, T> fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public Map<String, T> fromLegacy(@NonNull Map<String, QVariant> map) { - final HashMap<String, T> result = new HashMap<>(); - for (Map.Entry<String, QVariant> entry : map.entrySet()) { - result.put(entry.getKey(), (T) entry.getValue().get()); - } - return result; - } - - @Override - public Map<String, T> from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInit.java b/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInit.java deleted file mode 100644 index 6743ea7d4..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInit.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -public class ClientInit { - @NonNull - public final String ClientDate; - public final boolean UseSsl; - @NonNull - public final String ClientVersion; - public final boolean UseCompression; - public final int ProtocolVersion; - - public ClientInit(@NonNull String clientDate, boolean useSsl, @NonNull String clientVersion, boolean useCompression, - int protocolVersion) { - ClientDate = clientDate; - UseSsl = useSsl; - ClientVersion = clientVersion; - UseCompression = useCompression; - ProtocolVersion = protocolVersion; - } - - @NonNull - @Override - public String toString() { - return "ClientInit{" + - "ClientDate='" + ClientDate + '\'' + - ", UseSsl=" + UseSsl + - ", ClientVersion='" + ClientVersion + '\'' + - ", UseCompression=" + UseCompression + - ", ProtocolVersion=" + ProtocolVersion + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInitAck.java b/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInitAck.java deleted file mode 100644 index 559577e99..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInitAck.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.Nullable; - -import java.util.List; - -public class ClientInitAck extends CoreStatus { - public ClientInitAck(boolean configured, boolean loginEnabled, int coreFeatures, @Nullable List<StorageBackend> storageBackends) { - super(configured, loginEnabled, coreFeatures, storageBackends); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInitReject.java b/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInitReject.java deleted file mode 100644 index e430cc04c..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientInitReject.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -public class ClientInitReject { - @Nullable - public final String Error; - - public ClientInitReject(@Nullable String error) { - Error = error; - } - - @NonNull - @Override - public String toString() { - return "ClientInitReject{" + - "Error='" + Error + '\'' + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLogin.java b/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLogin.java deleted file mode 100644 index c65b666be..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLogin.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -public class ClientLogin { - @NonNull - public final String User; - @NonNull - public final String Password; - - public ClientLogin(@NonNull String user, @NonNull String password) { - User = user; - Password = password; - } - - @NonNull - @Override - public String toString() { - return "ClientLogin{" + - "User='" + User + '\'' + - ", Password='" + Password + '\'' + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLoginAck.java b/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLoginAck.java deleted file mode 100644 index 1aa9f1bc8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLoginAck.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -public class ClientLoginAck { - public ClientLoginAck() { - } - - @NonNull - @Override - public String toString() { - return "ClientLoginAck{}"; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLoginReject.java b/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLoginReject.java deleted file mode 100644 index 9ceaaf587..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/ClientLoginReject.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -public class ClientLoginReject { - @Nullable - public final String Error; - - public ClientLoginReject(@Nullable String error) { - Error = error; - } - - @NonNull - @Override - public String toString() { - return "ClientLoginReject{" + - "Error='" + Error + '\'' + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/Command.java b/app/src/main/java/de/kuschku/libquassel/objects/types/Command.java deleted file mode 100644 index 0a2d34c7a..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/Command.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import de.kuschku.libquassel.primitives.types.BufferInfo; - -public class Command { - public final BufferInfo buffer; - public final String command; - - public Command(BufferInfo buffer, String command) { - this.buffer = buffer; - this.command = command; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupAck.java b/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupAck.java deleted file mode 100644 index e1906bb2d..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupAck.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -public class CoreSetupAck { - public CoreSetupAck() { - - } - - @NonNull - @Override - public String toString() { - return "CoreSetupAck{}"; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupData.java b/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupData.java deleted file mode 100644 index e310023ec..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupData.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -public class CoreSetupData { - @NonNull - public final SetupData SetupData; - - public CoreSetupData(@NonNull SetupData setupData) { - SetupData = setupData; - } - - @NonNull - @Override - public String toString() { - return "CoreSetupData{" + - "SetupData=" + SetupData + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupReject.java b/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupReject.java deleted file mode 100644 index de2f75bb5..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/CoreSetupReject.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -public class CoreSetupReject { - @Nullable - public final String Error; - - public CoreSetupReject(@Nullable String error) { - Error = error; - } - - @NonNull - @Override - public String toString() { - return "CoreSetupReject{" + - "Error='" + Error + '\'' + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/CoreStatus.java b/app/src/main/java/de/kuschku/libquassel/objects/types/CoreStatus.java deleted file mode 100644 index ab9807ace..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/CoreStatus.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.Log; - -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.primitives.types.QVariant; - -public class CoreStatus { - public final boolean Configured; - public final boolean LoginEnabled; - public final int CoreFeatures; - @Nullable - public final List<StorageBackend> StorageBackends; - - public CoreStatus(boolean configured, boolean loginEnabled, int coreFeatures, - @Nullable List<StorageBackend> storageBackends) { - Configured = configured; - LoginEnabled = loginEnabled; - CoreFeatures = coreFeatures; - StorageBackends = storageBackends; - } - - @NonNull - @Override - public String toString() { - return "ClientInitAck{" + - "Configured=" + Configured + - ", LoginEnabled=" + LoginEnabled + - ", CoreFeatures=" + CoreFeatures + - ", StorageBackends=" + StorageBackends + - '}'; - } - - public ArrayList<Bundle> getStorageBackendsAsBundle() { - if (StorageBackends == null) - return null; - - ArrayList<Bundle> backends = new ArrayList<>(StorageBackends.size()); - for (StorageBackend backend : StorageBackends) { - Bundle bundle = new Bundle(); - bundle.putString("displayName", backend.DisplayName); - bundle.putString("description", backend.Description); - Bundle defaults = new Bundle(); - Bundle types = new Bundle(); - for (String key : backend.SetupKeys) { - QVariant value = backend.SetupDefaults.get(key); - if (value != null) { - switch (value.type.type) { - case Int: - case UInt: { - defaults.putInt(key, (int) value.data); - types.putString(key, "int"); - } - break; - case Short: - case UShort: { - defaults.putShort(key, (short) value.data); - types.putString(key, "short"); - } - break; - case Long: - case ULong: { - defaults.putLong(key, (long) value.data); - types.putString(key, "long"); - } - break; - case Bool: { - defaults.putBoolean(key, (boolean) value.data); - types.putString(key, "boolean"); - } - break; - case Double: { - bundle.putDouble(key, (double) value.data); - types.putString(key, "double"); - } - break; - case Float: { - defaults.putDouble(key, (float) value.data); - types.putString(key, "float"); - } - break; - case QString: { - defaults.putString(key, (String) value.data); - types.putString(key, "string"); - } - break; - default: { - Log.w("CoreSetup", "Found configuration element with incompatible type: " + key + " : " + value.type.type); - } - break; - } - } else { - defaults.putString(key, ""); - types.putString(key, "string"); - } - } - bundle.putBundle("defaults", defaults); - bundle.putBundle("types", types); - backends.add(bundle); - } - return backends; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/NetworkServer.java b/app/src/main/java/de/kuschku/libquassel/objects/types/NetworkServer.java deleted file mode 100644 index 8f3d77286..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/NetworkServer.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -public class NetworkServer { - public final boolean useSSL; - public final int sslVersion; - - @NonNull - public final String host; - public final int port; - @Nullable - public final String password; - - public final boolean useProxy; - public final ProxyType proxyType; - @Nullable - public final String proxyHost; - public final int proxyPort; - @Nullable - public final String proxyUser; - @Nullable - public final String proxyPass; - - public NetworkServer(boolean useSSL, int sslVersion, @NonNull String host, int port, @Nullable String password, boolean useProxy, - ProxyType proxyType, @Nullable String proxyHost, int proxyPort, @Nullable String proxyUser, @Nullable String proxyPass) { - this.useSSL = useSSL; - this.sslVersion = sslVersion; - this.host = host; - this.port = port; - this.password = password; - this.useProxy = useProxy; - this.proxyType = proxyType; - this.proxyHost = proxyHost; - this.proxyPort = proxyPort; - this.proxyUser = proxyUser; - this.proxyPass = proxyPass; - } - - @NonNull - @Override - public String toString() { - return "NetworkServer{" + - "UseSSL=" + useSSL + - ", sslVersion=" + sslVersion + - ", Host='" + host + '\'' + - ", Port=" + port + - ", Password='" + password + '\'' + - ", UseProxy=" + useProxy + - ", ProxyType=" + proxyType + - ", ProxyHost='" + proxyHost + '\'' + - ", ProxyPort=" + proxyPort + - ", ProxyUser='" + proxyUser + '\'' + - ", ProxyPass='" + proxyPass + '\'' + - '}'; - } - - public enum ProxyType { - DefaultProxy(0), - Socks5Proxy(1), - HttpProxy(3); - - public final int id; - - ProxyType(int id) { - this.id = id; - } - - public static ProxyType fromId(int id) { - switch (id) { - default: - case 0: - return DefaultProxy; - case 1: - return Socks5Proxy; - case 3: - return HttpProxy; - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/SessionInit.java b/app/src/main/java/de/kuschku/libquassel/objects/types/SessionInit.java deleted file mode 100644 index e4bce8c54..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/SessionInit.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -public class SessionInit { - public final SessionState SessionState; - - public SessionInit(de.kuschku.libquassel.objects.types.SessionState sessionState) { - SessionState = sessionState; - } - - @NonNull - @Override - public String toString() { - return "SessionInit{" + - "SessionState=" + SessionState + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/SessionState.java b/app/src/main/java/de/kuschku/libquassel/objects/types/SessionState.java deleted file mode 100644 index 3e82b3dc7..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/SessionState.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; - -public class SessionState { - @NonNull - public final List<QIdentity> Identities; - @NonNull - public final List<BufferInfo> BufferInfos; - @NonNull - public final List<Integer> NetworkIds; - - public SessionState(@NonNull List<QIdentity> identities, @NonNull List<BufferInfo> bufferInfos, - @NonNull List<Integer> networkIds) { - this.Identities = identities; - this.BufferInfos = bufferInfos; - this.NetworkIds = networkIds; - } - - @NonNull - @Override - public String toString() { - return "SessionState{" + - "Identities=" + Identities + - ", BufferInfos=" + BufferInfos + - ", NetworkIds=" + NetworkIds + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/SetupData.java b/app/src/main/java/de/kuschku/libquassel/objects/types/SetupData.java deleted file mode 100644 index 85a486c4e..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/SetupData.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; - -public class SetupData { - @NonNull - public final String AdminUser; - @NonNull - public final String AdminPasswd; - @NonNull - public final String Backend; - @NonNull - public final Map<String, QVariant> ConnectionProperties; - - public SetupData(@NonNull String adminUser, @NonNull String adminPasswd, @NonNull String backend, @NonNull Map<String, QVariant> connectionProperties) { - this.AdminUser = adminUser; - this.AdminPasswd = adminPasswd; - this.Backend = backend; - this.ConnectionProperties = connectionProperties; - } - - @NonNull - @Override - public String toString() { - return "SetupData{" + - "AdminUser='" + AdminUser + '\'' + - ", AdminPasswd='" + AdminPasswd + '\'' + - ", Backend='" + Backend + '\'' + - ", ConnectionProperties=" + ConnectionProperties + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/objects/types/StorageBackend.java b/app/src/main/java/de/kuschku/libquassel/objects/types/StorageBackend.java deleted file mode 100644 index 641c041b2..000000000 --- a/app/src/main/java/de/kuschku/libquassel/objects/types/StorageBackend.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.objects.types; - -import android.support.annotation.NonNull; - -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; - -public class StorageBackend { - @NonNull - public final String DisplayName; - @NonNull - public final Map<String, QVariant> SetupDefaults; - @NonNull - public final String Description; - @NonNull - public final List<String> SetupKeys; - - public StorageBackend(@NonNull String displayName, @NonNull Map<String, QVariant> setupDefaults, @NonNull String description, - @NonNull List<String> setupKeys) { - this.DisplayName = displayName; - this.SetupDefaults = setupDefaults; - this.Description = description; - this.SetupKeys = setupKeys; - } - - @NonNull - @Override - public String toString() { - return "StorageBackend{" + - "DisplayName='" + DisplayName + '\'' + - ", SetupDefaults=" + SetupDefaults + - ", Description='" + Description + '\'' + - ", SetupKeys=" + SetupKeys + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java deleted file mode 100644 index 58f2f58ae..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java +++ /dev/null @@ -1,344 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.io.IOException; -import java.util.Locale; - -import de.kuschku.libquassel.primitives.serializers.PrimitiveSerializer; - -/** - * This class stores Qt types, the corresponding Java type, and a (De-)Serializer for it. - * - * @param <T> the type of the stored value - * @author Janne Koschinski - * @author Martin Sandsmark - */ -public class QMetaType<T> { - @NonNull - public final Type type; - @NonNull - public final String name; - @NonNull - public final Class<T> cl; - @Nullable - public final PrimitiveSerializer<T> serializer; - - public QMetaType(@NonNull Class cl, @NonNull Type type) { - this(cl, type, type.getSerializableName()); - } - - public QMetaType(@NonNull Class cl, @NonNull Type type, @NonNull String name) { - this(cl, type, name, null); - } - - public QMetaType(@NonNull Class cl, @NonNull Type type, @Nullable PrimitiveSerializer<T> serializer) { - this(cl, type, type.getSerializableName(), serializer); - } - - @SuppressWarnings("unchecked") - public QMetaType(@NonNull Class cl, @NonNull Type type, @NonNull String name, @Nullable PrimitiveSerializer<T> serializer) { - this.cl = cl; - this.type = type; - this.name = name; - this.serializer = serializer; - - } - - @NonNull - @Override - public String toString() { - return "QMetaType{" + - "type=" + type + - ", name='" + name + '\'' + - ", serializer=" + serializer + - '}'; - } - - public enum Type { - Void(0), - Bool(1), - Int(2), - UInt(3), - LongLong(4), - ULongLong(5), - - Double(6), - QChar(7), - QVariantMap(8), - QVariantList(9), - - QString(10), - QStringList(11), - QByteArray(12), - - QBitArray(13), - QDate(14), - QTime(15), - QDateTime(16), - QUrl(17), - - QLocale(18), - QRect(19), - QRectF(20), - QSize(21), - QSizeF(22), - - QLine(23), - QLineF(24), - QPoint(25), - QPointF(26), - QRegExp(27), - - QVariantHash(28), - QEasingCurve(29), - - FirstGuiType(63), - - QFont(64), - QPixmap(65), - QBrush(66), - QColor(67), - QPalette(68), - - QIcon(69), - QImage(70), - QPolygon(71), - QRegion(72), - QBitmap(73), - - QCursor(74), - QSizePolicy(75), - QKeySequence(76), - QPen(77), - - QTextLength(78), - QTextFormat(79), - QMatrix(80), - QTransform(81), - - QMatrix4x4(82), - QVector2D(83), - QVector3D(84), - QVector4D(85), - - QQuaternion(86), - - VoidStar(128), - Long(129), - Short(130), - Char(131), - ULong(132), - - UShort(133), - UChar(134), - Float(135), - QObjectStar(136), - QWidgetStar(137), - - QVariant(138), - - User(256), - UserType(127), - LastType(0xffffffff); - - final int value; - - Type(int value) { - this.value = value; - } - - @NonNull - public static Type fromId(int id) throws IOException { - switch (id) { - case 0: - return Void; - case 1: - return Bool; - case 2: - return Int; - case 3: - return UInt; - case 4: - return LongLong; - case 5: - return ULongLong; - - case 6: - return Double; - case 7: - return QChar; - case 8: - return QVariantMap; - case 9: - return QVariantList; - - case 10: - return QString; - case 11: - return QStringList; - case 12: - return QByteArray; - - case 13: - return QBitArray; - case 14: - return QDate; - case 15: - return QTime; - case 16: - return QDateTime; - case 17: - return QUrl; - - case 18: - return QLocale; - case 19: - return QRect; - case 20: - return QRectF; - case 21: - return QSize; - case 22: - return QSizeF; - - case 23: - return QLine; - case 24: - return QLineF; - case 25: - return QPoint; - case 26: - return QPointF; - case 27: - return QRegExp; - - case 28: - return QVariantHash; - case 29: - return QEasingCurve; - - case 63: - return FirstGuiType; - - case 64: - return QFont; - case 65: - return QPixmap; - case 66: - return QBrush; - case 67: - return QColor; - case 68: - return QPalette; - - case 69: - return QIcon; - case 70: - return QImage; - case 71: - return QPolygon; - case 72: - return QRegion; - case 73: - return QBitmap; - - case 74: - return QCursor; - case 75: - return QSizePolicy; - case 76: - return QKeySequence; - case 77: - return QPen; - - case 78: - return QTextLength; - case 79: - return QTextFormat; - case 80: - return QMatrix; - case 81: - return QTransform; - - case 82: - return QMatrix4x4; - case 83: - return QVector2D; - case 84: - return QVector3D; - case 85: - return QVector4D; - - case 86: - return QQuaternion; - - case 128: - return VoidStar; - case 129: - return Long; - case 130: - return Short; - case 131: - return Char; - case 132: - return ULong; - - case 133: - return UShort; - case 134: - return UChar; - case 135: - return Float; - case 136: - return QObjectStar; - case 137: - return QWidgetStar; - - case 138: - return QVariant; - - case 256: - return User; - case 127: - return UserType; - - - default: - throw new IOException("Unknown type: " + id); - } - } - - public int getValue() { - return value; - } - - @NonNull - public String getSerializableName() { - if (name().startsWith("Q")) return name(); - else return name().toLowerCase(Locale.ENGLISH); - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java deleted file mode 100644 index b6fe16f83..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import org.joda.time.DateTime; - -import java.io.IOException; -import java.math.BigDecimal; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.objects.serializers.NetworkServerSerializer; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.primitives.serializers.BoolSerializer; -import de.kuschku.libquassel.primitives.serializers.BufferInfoSerializer; -import de.kuschku.libquassel.primitives.serializers.ByteArraySerializer; -import de.kuschku.libquassel.primitives.serializers.ByteSerializer; -import de.kuschku.libquassel.primitives.serializers.CharSerializer; -import de.kuschku.libquassel.primitives.serializers.DateTimeSerializer; -import de.kuschku.libquassel.primitives.serializers.IntSerializer; -import de.kuschku.libquassel.primitives.serializers.LongSerializer; -import de.kuschku.libquassel.primitives.serializers.MessageSerializer; -import de.kuschku.libquassel.primitives.serializers.PrimitiveSerializer; -import de.kuschku.libquassel.primitives.serializers.ShortSerializer; -import de.kuschku.libquassel.primitives.serializers.StringListSerializer; -import de.kuschku.libquassel.primitives.serializers.StringSerializer; -import de.kuschku.libquassel.primitives.serializers.TimeSerializer; -import de.kuschku.libquassel.primitives.serializers.UserTypeSerializer; -import de.kuschku.libquassel.primitives.serializers.VariantListSerializer; -import de.kuschku.libquassel.primitives.serializers.VariantMapSerializer; -import de.kuschku.libquassel.primitives.serializers.VariantSerializer; -import de.kuschku.libquassel.primitives.serializers.VariantVariantListSerializer; -import de.kuschku.libquassel.primitives.serializers.VoidSerializer; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.IdentitySerializer; -import de.kuschku.libquassel.syncables.serializers.NetworkInfoSerializer; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class QMetaTypeRegistry { - @NonNull - private static final Map<QMetaType.Type, QMetaType> typeSerializerMap = new HashMap<>(); - @NonNull - private static final Map<String, QMetaType> stringSerializerMap = new HashMap<>(); - - static { - addType(Void.class, QMetaType.Type.Void, VoidSerializer.get()); - addType(boolean.class, QMetaType.Type.Bool, BoolSerializer.get()); - addType(int.class, QMetaType.Type.Int, IntSerializer.get()); - addType(int.class, QMetaType.Type.UserType, "BufferId", IntSerializer.get()); - addType(int.class, QMetaType.Type.UserType, "NetworkId", IntSerializer.get()); - addType(int.class, QMetaType.Type.UserType, "IdentityId", IntSerializer.get()); - addType(int.class, QMetaType.Type.UserType, "MsgId", IntSerializer.get()); - addType(long.class, QMetaType.Type.UserType, "PeerPtr", LongSerializer.get()); - addType(BufferInfo.class, QMetaType.Type.UserType, "BufferInfo", BufferInfoSerializer.get()); - addType(Message.class, QMetaType.Type.UserType, "Message", MessageSerializer.get()); - addType(QIdentity.class, QMetaType.Type.UserType, "Identity", new UserTypeSerializer<>(IdentitySerializer.get(), "Identity")); - addType(NetworkServer.class, QMetaType.Type.UserType, "Network::Server", new UserTypeSerializer<>(NetworkServerSerializer.get(), "Network::Server")); - addType(NetworkInfo.class, QMetaType.Type.UserType, "NetworkInfo", new UserTypeSerializer<>(NetworkInfoSerializer.get(), "NetworkInfo")); - addType(int.class, QMetaType.Type.UInt, IntSerializer.get()); - addType(short.class, QMetaType.Type.UShort, ShortSerializer.get()); - - // TODO: Implement more custom quassel types - - addType(DateTime.class, QMetaType.Type.QTime, TimeSerializer.get()); - addType(BigDecimal.class, QMetaType.Type.LongLong); - addType(BigDecimal.class, QMetaType.Type.ULongLong); - addType(double.class, QMetaType.Type.Double); - addType(char.class, QMetaType.Type.QChar, CharSerializer.get()); - addType(List.class, QMetaType.Type.QVariantList, VariantListSerializer.get()); - addType(Map.class, QMetaType.Type.QVariantMap, VariantMapSerializer.get()); - addType(List.class, QMetaType.Type.QStringList, StringListSerializer.get()); - addType(String.class, QMetaType.Type.QString, StringSerializer.get()); - addType(String.class, QMetaType.Type.QByteArray, ByteArraySerializer.get()); - addType(void.class, QMetaType.Type.QBitArray); - addType(void.class, QMetaType.Type.QDate); - addType(DateTime.class, QMetaType.Type.QDateTime, DateTimeSerializer.get()); - addType(void.class, QMetaType.Type.QUrl); - addType(void.class, QMetaType.Type.QLocale); - addType(void.class, QMetaType.Type.QRect); - addType(void.class, QMetaType.Type.QRectF); - addType(void.class, QMetaType.Type.QSize); - addType(void.class, QMetaType.Type.QSizeF); - addType(void.class, QMetaType.Type.QLine); - addType(void.class, QMetaType.Type.QLineF); - addType(void.class, QMetaType.Type.QPoint); - addType(void.class, QMetaType.Type.QPointF); - addType(void.class, QMetaType.Type.QRegExp); - addType(void.class, QMetaType.Type.QVariantHash); - addType(void.class, QMetaType.Type.QEasingCurve); - - // UI Types - addType(void.class, QMetaType.Type.QFont); - addType(void.class, QMetaType.Type.QPixmap); - addType(void.class, QMetaType.Type.QBrush); - addType(void.class, QMetaType.Type.QColor); - addType(void.class, QMetaType.Type.QPalette); - addType(void.class, QMetaType.Type.QIcon); - addType(void.class, QMetaType.Type.QImage); - addType(void.class, QMetaType.Type.QPolygon); - addType(void.class, QMetaType.Type.QRegion); - addType(void.class, QMetaType.Type.QBitmap); - addType(void.class, QMetaType.Type.QCursor); - addType(void.class, QMetaType.Type.QSizePolicy); - addType(void.class, QMetaType.Type.QKeySequence); - addType(void.class, QMetaType.Type.QPen); - addType(void.class, QMetaType.Type.QTextLength); - addType(void.class, QMetaType.Type.QTextFormat); - addType(void.class, QMetaType.Type.QMatrix); - addType(void.class, QMetaType.Type.QTransform); - addType(void.class, QMetaType.Type.QMatrix4x4); - addType(void.class, QMetaType.Type.QVector2D); - addType(void.class, QMetaType.Type.QVector3D); - addType(void.class, QMetaType.Type.QVector4D); - addType(void.class, QMetaType.Type.QQuaternion); - - addType(void.class, QMetaType.Type.VoidStar, "void*"); - addType(long.class, QMetaType.Type.Long, LongSerializer.get()); - addType(short.class, QMetaType.Type.Short, ShortSerializer.get()); - addType(byte.class, QMetaType.Type.Char, ByteSerializer.get()); - addType(long.class, QMetaType.Type.ULong, LongSerializer.get()); - addType(byte.class, QMetaType.Type.UChar, ByteSerializer.get()); - addType(void.class, QMetaType.Type.Float); - addType(void.class, QMetaType.Type.QObjectStar, "QObject*"); - addType(void.class, QMetaType.Type.QWidgetStar, "QWidget*"); - addType(QVariant.class, QMetaType.Type.QVariant, VariantSerializer.get()); - } - - // Disable Constructor - private QMetaTypeRegistry() { - - } - - private static <T> void addType(@NonNull final Class cl, @NonNull final QMetaType.Type type, @NonNull final String name, @Nullable final PrimitiveSerializer<T> serializer) { - addType(new QMetaType<>(cl, type, name, serializer)); - } - - private static <T> void addType(@NonNull final Class cl, @NonNull final QMetaType.Type type, @NonNull final String name) { - addType(new QMetaType<>(cl, type, name)); - } - - private static <T> void addType(@NonNull final Class cl, @NonNull final QMetaType.Type type, @Nullable final PrimitiveSerializer<T> serializer) { - addType(new QMetaType<>(cl, type, serializer)); - } - - private static <T> void addType(@NonNull final Class cl, @NonNull final QMetaType.Type type) { - addType(new QMetaType<>(cl, type)); - } - - private static <T> void addType(@NonNull final QMetaType<T> metaType) { - if (!typeSerializerMap.containsKey(metaType.type)) - typeSerializerMap.put(metaType.type, metaType); - stringSerializerMap.put(metaType.name, metaType); - } - - @Nullable - public static <T> T deserialize(@NonNull final ByteBuffer buffer) throws IOException { - final int id = deserialize(QMetaType.Type.UInt, buffer); - final QMetaType.Type type = QMetaType.Type.fromId(id); - return deserialize(type, buffer); - } - - @Nullable - public static <T> T deserialize(@NonNull final QMetaType.Type type, @NonNull final ByteBuffer buffer) throws IOException { - return deserialize((getMetaTypeByType(type)), buffer); - } - - @Nullable - public static <T> T deserialize(@NonNull final String type, @NonNull final ByteBuffer buffer) throws IOException { - return deserialize((getMetaTypeByString(type)), buffer); - } - - @Nullable - public static <T> T deserialize(@NonNull final QMetaType<T> type, @NonNull final ByteBuffer buffer) throws IOException { - return type.serializer.deserialize(buffer); - } - - public static <T> void serialize(@NonNull final QMetaType.Type type, @NonNull final ByteChannel channel, @NonNull final T data) throws IOException { - getType(type).serializer.serialize(channel, data); - } - - public static <T> void serialize(@NonNull final String type, @NonNull final ByteChannel channel, @NonNull final T data) throws IOException { - getType(type).serializer.serialize(channel, data); - } - - public static <T> void serializeWithType(@NonNull final QMetaType.Type type, @NonNull final ByteChannel channel, @NonNull final T data) throws IOException { - serialize(QMetaType.Type.UInt, channel, type.getValue()); - serialize(type, channel, data); - } - - @NonNull - public static <T> PrimitiveSerializer<T> getSerializer(String typeName) { - return (PrimitiveSerializer<T>) stringSerializerMap.get(typeName).serializer; - } - - @NonNull - public static <T> PrimitiveSerializer<T> getSerializer(QMetaType.Type type) { - return (PrimitiveSerializer<T>) typeSerializerMap.get(type); - } - - @NonNull - public static <T> QMetaType<T> getType(@NonNull String typeName) { - return getMetaTypeByString(typeName); - } - - @NonNull - private static <T> QMetaType<T> getMetaTypeByString(@NonNull String typeName) { - QMetaType<T> result = stringSerializerMap.get(typeName); - assertNotNull(String.format("Unknown type %s", typeName), result); - assertNotNull(String.format("Unknown type %s", typeName), result.serializer); - - return result; - } - - @NonNull - public static <T> QMetaType<T> getType(@NonNull QMetaType.Type type) { - return getMetaTypeByType(type); - } - - @NonNull - private static <T> QMetaType<T> getMetaTypeByType(@NonNull QMetaType.Type type) { - QMetaType<T> result = typeSerializerMap.get(type); - assertNotNull(String.format("Unknown type %s", type.toString()), result); - assertNotNull(String.format("Unknown type %s", type.toString()), result.serializer); - - return result; - } - - @Nullable - public static <T> QMetaType<T> getTypeByObject(@Nullable T type) { - if (type == null) - return null; - else if (type instanceof Void) return getMetaTypeByType(QMetaType.Type.Void); - else if (type instanceof Boolean) - return getMetaTypeByType(QMetaType.Type.Bool); - else if (type instanceof Integer) - return getMetaTypeByType(QMetaType.Type.Int); - else if (type instanceof Short) - return getMetaTypeByType(QMetaType.Type.Short); - else if (type instanceof DateTime) - return getMetaTypeByType(QMetaType.Type.QDateTime); - else if (type instanceof Character) - return getMetaTypeByType(QMetaType.Type.QChar); - else if (type instanceof List) { - if (((List) type).size() > 0 && ((List) type).get(0) instanceof String) - return getMetaTypeByType(QMetaType.Type.QStringList); - else if (((List) type).size() > 0 && ((List) type).get(0) instanceof QVariant) - return new QMetaType<>((Class) type.getClass(), QMetaType.Type.QVariantList, (PrimitiveSerializer<T>) VariantVariantListSerializer.get()); - else - return getMetaTypeByType(QMetaType.Type.QVariantList); - } else if (type instanceof Map) - return getMetaTypeByType(QMetaType.Type.QVariantMap); - else if (type instanceof String) - return getMetaTypeByType(QMetaType.Type.QString); - else if (type instanceof Long) - return getMetaTypeByType(QMetaType.Type.Long); - else if (type instanceof Byte) - return getMetaTypeByType(QMetaType.Type.Char); - else if (type instanceof QVariant) - return getMetaTypeByType(QMetaType.Type.QVariant); - else if (type instanceof Message) return stringSerializerMap.get("Message"); - else if (type instanceof BufferInfo) return stringSerializerMap.get("BufferInfo"); - else if (type instanceof NetworkInfo) return stringSerializerMap.get("NetworkInfo"); - else if (type instanceof QIdentity) return stringSerializerMap.get("Identity"); - else if (type instanceof NetworkServer) return stringSerializerMap.get("Network::Server"); - else - return null; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BoolSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BoolSerializer.java deleted file mode 100644 index 8d6cd3f23..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BoolSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public class BoolSerializer implements PrimitiveSerializer<Boolean> { - @NonNull - private static final BoolSerializer serializer = new BoolSerializer(); - - private BoolSerializer() { - } - - @NonNull - public static BoolSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final Boolean data) throws IOException { - final ByteBuffer buffer = ByteBuffer.allocate(1); - buffer.put(0, (byte) (data ? 0x01 : 0x00)); - channel.write(buffer); - } - - @NonNull - @Override - public Boolean deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return buffer.get() > 0; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BufferInfoSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BufferInfoSerializer.java deleted file mode 100644 index 0e838f015..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/BufferInfoSerializer.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -import de.kuschku.libquassel.primitives.types.BufferInfo; - -public class BufferInfoSerializer implements PrimitiveSerializer<BufferInfo> { - @NonNull - private static final BufferInfoSerializer serializer = new BufferInfoSerializer(); - - private BufferInfoSerializer() { - } - - @NonNull - public static BufferInfoSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull ByteChannel channel, @NonNull BufferInfo data) throws IOException { - IntSerializer.get().serialize(channel, data.id); - IntSerializer.get().serialize(channel, data.networkId); - ShortSerializer.get().serialize(channel, data.type.id); - IntSerializer.get().serialize(channel, data.groupId); - ByteArraySerializer.get().serialize(channel, data.name); - } - - @NonNull - @Override - public BufferInfo deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return BufferInfo.create( - IntSerializer.get().deserialize(buffer), - IntSerializer.get().deserialize(buffer), - BufferInfo.Type.fromId(ShortSerializer.get().deserialize(buffer)), - IntSerializer.get().deserialize(buffer), - ByteArraySerializer.get().deserialize(buffer) - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteArraySerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteArraySerializer.java deleted file mode 100644 index 57345559c..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteArraySerializer.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.google.common.base.Charsets; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public class ByteArraySerializer implements PrimitiveSerializer<String> { - @NonNull - private static final ByteArraySerializer serializerFalse = new ByteArraySerializer(false); - @NonNull - private static final ByteArraySerializer serializerTrue = new ByteArraySerializer(true); - private final boolean trimLastByte; - - private ByteArraySerializer(boolean trimLastByte) { - this.trimLastByte = trimLastByte; - } - - @NonNull - public static ByteArraySerializer get() { - return get(false); - } - - @NonNull - public static ByteArraySerializer get(boolean trimLastByte) { - if (trimLastByte) return serializerTrue; - else return serializerFalse; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @Nullable final String data) throws IOException { - if (data == null) { - IntSerializer.get().serialize(channel, -1); - } else { - final ByteBuffer contentBuffer = Charsets.ISO_8859_1.encode(data); - IntSerializer.get().serialize(channel, contentBuffer.limit() + (trimLastByte ? 1 : 0)); - channel.write(contentBuffer); - if (trimLastByte) channel.write(ByteBuffer.allocate(1)); - } - } - - @Nullable - @Override - public String deserialize(@NonNull final ByteBuffer buffer) throws IOException { - final int len = IntSerializer.get().deserialize(buffer); - if (len == -1) - return null; - else if (len == 0) - return ""; - else { - final ByteBuffer contentBuffer = ByteBuffer.allocate(len); - contentBuffer.put(buffer.array(), buffer.position(), len); - contentBuffer.position(0); - buffer.position(buffer.position() + len); - - // We have to do this for the usecase of usertype names, as those are serialized with \0 at the end - if (trimLastByte) { - // Get rid of the null byte at the end - contentBuffer.limit(len - 1); - } - return Charsets.UTF_8.decode(contentBuffer).toString(); - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteSerializer.java deleted file mode 100644 index 83aa2f1f8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public class ByteSerializer implements PrimitiveSerializer<Byte> { - @NonNull - private static final ByteSerializer serializer = new ByteSerializer(); - - private ByteSerializer() { - } - - @NonNull - public static ByteSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final Byte data) throws IOException { - final ByteBuffer buffer = ByteBuffer.allocate(1); - buffer.put(0, data); - channel.write(buffer); - } - - @NonNull - @Override - public Byte deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return buffer.get(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/CharSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/CharSerializer.java deleted file mode 100644 index cd5864283..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/CharSerializer.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.nio.charset.Charset; - -public class CharSerializer implements PrimitiveSerializer<Character> { - @NonNull - private static final CharSerializer serializer = new CharSerializer(); - - private CharSerializer() { - } - - @NonNull - public static CharSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final Character data) throws IOException { - final ByteBuffer contentBuffer = Charset.forName("UTF-16BE").encode(String.copyValueOf(new char[]{data})); - channel.write(contentBuffer); - } - - @NonNull - @Override - public Character deserialize(@NonNull final ByteBuffer buffer) throws IOException { - int len = 2; - final ByteBuffer contentBuffer = ByteBuffer.allocate(len); - contentBuffer.put(buffer.array(), buffer.position(), len); - contentBuffer.position(0); - buffer.position(buffer.position() + len); - return Charset.forName("UTF-16BE").decode(contentBuffer).toString().charAt(0); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/DateTimeSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/DateTimeSerializer.java deleted file mode 100644 index 5373ac9bb..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/DateTimeSerializer.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; -import org.joda.time.DateTimeUtils; -import org.joda.time.DateTimeZone; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -import de.kuschku.util.backports.Objects; - -public class DateTimeSerializer implements PrimitiveSerializer<DateTime> { - @NonNull - private static final DateTimeSerializer serializer = new DateTimeSerializer(); - - private DateTimeSerializer() { - } - - @NonNull - public static DateTimeSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final DateTime data) throws IOException { - final boolean isUTC; - final DateTimeZone zone = data.getZone(); - if (Objects.equals(zone, DateTimeZone.UTC)) { - isUTC = true; - } else if (Objects.equals(zone, DateTimeZone.getDefault())) { - isUTC = false; - // TODO: Add serialization for other timezones - } else { - throw new IllegalArgumentException("Serialization of timezones except for local and UTC is not supported"); - } - - - IntSerializer.get().serialize(channel, (int) DateTimeUtils.toJulianDayNumber(data.getMillis())); - IntSerializer.get().serialize(channel, data.getMillisOfDay()); - BoolSerializer.get().serialize(channel, isUTC); - } - - @NonNull - @Override - public DateTime deserialize(@NonNull final ByteBuffer buffer) throws IOException { - final long julianDay = IntSerializer.get().deserialize(buffer); - final int millisSinceMidnight = IntSerializer.get().deserialize(buffer); - - final short zone = ByteSerializer.get().deserialize(buffer); - - if (millisSinceMidnight == 0x73007300 && julianDay == 0x50006100 || millisSinceMidnight == -1 || julianDay == -1) - return new DateTime(0); - - if ((zone & 0xfffffff0) > 0) { - throw new IllegalArgumentException("Deserialization of timezones except for local and UTC is not supported: " + zone); - } - - DateTime time = new DateTime(DateTimeUtils.fromJulianDay(julianDay)); - time = time.millisOfDay().setCopy(millisSinceMidnight); - if (zone == 0) time = time.withZone(DateTimeZone.getDefault()); - else time = time.withZone(DateTimeZone.UTC); - - return time; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/IntSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/IntSerializer.java deleted file mode 100644 index 5a1714ed7..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/IntSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public class IntSerializer implements PrimitiveSerializer<Integer> { - @NonNull - private static final IntSerializer serializer = new IntSerializer(); - - private IntSerializer() { - } - - @NonNull - public static IntSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final Integer data) throws IOException { - final ByteBuffer buffer = ByteBuffer.allocate(4); - buffer.putInt(0, data); - channel.write(buffer); - } - - @NonNull - @Override - public Integer deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return buffer.getInt(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/LongSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/LongSerializer.java deleted file mode 100644 index baacd2b51..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/LongSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public class LongSerializer implements PrimitiveSerializer<Long> { - @NonNull - private static final LongSerializer serializer = new LongSerializer(); - - private LongSerializer() { - } - - @NonNull - public static LongSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final Long data) throws IOException { - final ByteBuffer buffer = ByteBuffer.allocate(8); - buffer.putLong(0, data); - channel.write(buffer); - } - - @NonNull - @Override - public Long deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return buffer.getLong(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/MessageSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/MessageSerializer.java deleted file mode 100644 index 9e7b73796..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/MessageSerializer.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import org.joda.time.DateTime; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.types.BufferInfo; - -public class MessageSerializer implements PrimitiveSerializer<Message> { - @NonNull - private static final MessageSerializer serializer = new MessageSerializer(); - - private MessageSerializer() { - } - - @NonNull - public static MessageSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull ByteChannel channel, @NonNull Message data) throws IOException { - IntSerializer.get().serialize(channel, data.id); - IntSerializer.get().serialize(channel, (int) (data.time.getMillis() / 1000)); - IntSerializer.get().serialize(channel, data.type.value); - ByteSerializer.get().serialize(channel, data.flags.flags); - BufferInfoSerializer.get().serialize(channel, data.bufferInfo); - ByteArraySerializer.get().serialize(channel, data.sender); - ByteArraySerializer.get().serialize(channel, data.content); - } - - @Nullable - @Override - public Message deserialize(@NonNull final ByteBuffer buffer) throws IOException { - Integer messageId = IntSerializer.get().deserialize(buffer); - DateTime time = new DateTime(((long) IntSerializer.get().deserialize(buffer)) * 1000); - Message.Type type = Message.Type.fromId(IntSerializer.get().deserialize(buffer)); - Message.Flags flags = new Message.Flags(ByteSerializer.get().deserialize(buffer)); - BufferInfo bufferInfo = BufferInfoSerializer.get().deserialize(buffer); - String sender = ByteArraySerializer.get().deserialize(buffer); - String message = ByteArraySerializer.get().deserialize(buffer); - - return Message.create( - messageId, - time, - type, - flags, - bufferInfo, - sender, - message - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/PrimitiveSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/PrimitiveSerializer.java deleted file mode 100644 index 36d70e12d..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/PrimitiveSerializer.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public interface PrimitiveSerializer<T> { - void serialize(@NonNull ByteChannel channel, @NonNull T data) throws IOException; - - @Nullable - T deserialize(@NonNull ByteBuffer buffer) throws IOException; -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ProtocolSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ProtocolSerializer.java deleted file mode 100644 index d3daf78f7..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ProtocolSerializer.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -import de.kuschku.libquassel.client.FeatureFlags; -import de.kuschku.libquassel.primitives.types.Protocol; - -public class ProtocolSerializer implements PrimitiveSerializer<Protocol> { - @NonNull - private static final ProtocolSerializer serializer = new ProtocolSerializer(); - - private ProtocolSerializer() { - } - - @NonNull - public static ProtocolSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull ByteChannel channel, @NonNull Protocol data) throws IOException { - ByteSerializer.get().serialize(channel, data.protocolFlags.flags); - ShortSerializer.get().serialize(channel, data.protocolData); - ByteSerializer.get().serialize(channel, data.protocolVersion); - } - - @NonNull - @Override - public Protocol deserialize(@NonNull ByteBuffer buffer) throws IOException { - return new Protocol( - new FeatureFlags(ByteSerializer.get().deserialize(buffer)), - ShortSerializer.get().deserialize(buffer), - ByteSerializer.get().deserialize(buffer) - ); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ShortSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ShortSerializer.java deleted file mode 100644 index 17053f479..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ShortSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public class ShortSerializer implements PrimitiveSerializer<Short> { - @NonNull - private static final ShortSerializer serializer = new ShortSerializer(); - - private ShortSerializer() { - } - - @NonNull - public static ShortSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final Short data) throws IOException { - final ByteBuffer buffer = ByteBuffer.allocate(2); - buffer.putShort(0, data); - channel.write(buffer); - } - - @NonNull - @Override - public Short deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return buffer.getShort(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/StringListSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/StringListSerializer.java deleted file mode 100644 index 710683412..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/StringListSerializer.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.util.ArrayList; -import java.util.List; - -public class StringListSerializer implements PrimitiveSerializer<List<String>> { - @NonNull - private static final StringListSerializer serializer = new StringListSerializer(); - - private StringListSerializer() { - } - - @NonNull - public static StringListSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @Nullable final List<String> data) throws IOException { - if (data == null) { - IntSerializer.get().serialize(channel, 0); - } else { - IntSerializer.get().serialize(channel, data.size()); - for (String element : data) { - StringSerializer.get().serialize(channel, element); - } - } - } - - @NonNull - @Override - public List<String> deserialize(@NonNull final ByteBuffer buffer) throws IOException { - final int size = IntSerializer.get().deserialize(buffer); - final List<String> list = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - list.add(StringSerializer.get().deserialize(buffer)); - } - return list; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/StringSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/StringSerializer.java deleted file mode 100644 index 9ea3bcad2..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/StringSerializer.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.nio.charset.Charset; - -public class StringSerializer implements PrimitiveSerializer<String> { - @NonNull - private static final StringSerializer serializer = new StringSerializer(); - - private StringSerializer() { - } - - @NonNull - public static StringSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @Nullable final String data) throws IOException { - if (data == null) { - IntSerializer.get().serialize(channel, 0xffffffff); - } else { - final ByteBuffer contentBuffer = Charset.forName("UTF-16BE").encode(data); - IntSerializer.get().serialize(channel, contentBuffer.limit()); - channel.write(contentBuffer); - } - } - - @Nullable - @Override - public String deserialize(@NonNull final ByteBuffer buffer) throws IOException { - final int len = IntSerializer.get().deserialize(buffer); - if (len == 0xffffffff) - return null; - else { - final ByteBuffer contentBuffer = ByteBuffer.allocate(len); - contentBuffer.put(buffer.array(), buffer.position(), len); - contentBuffer.position(0); - buffer.position(buffer.position() + len); - return Charset.forName("UTF-16BE").decode(contentBuffer).toString(); - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/TimeSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/TimeSerializer.java deleted file mode 100644 index cd2765bd3..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/TimeSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public class TimeSerializer implements PrimitiveSerializer<DateTime> { - @NonNull - private static final TimeSerializer serializer = new TimeSerializer(); - - private TimeSerializer() { - } - - @NonNull - public static TimeSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final DateTime data) throws IOException { - IntSerializer.get().serialize(channel, data.millisOfDay().get()); - } - - @NonNull - @Override - public DateTime deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return DateTime.now().millisOfDay().setCopy(IntSerializer.get().deserialize(buffer)); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java deleted file mode 100644 index 3a55c3c24..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.util.Map; - -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class UserTypeSerializer<T> implements PrimitiveSerializer<T> { - @NonNull - private final ObjectSerializer<T> objectSerializer; - - public UserTypeSerializer(@NonNull ObjectSerializer<T> objectSerializer, String type) { - this.objectSerializer = objectSerializer; - } - - @Override - public void serialize(@NonNull ByteChannel channel, @NonNull T data) throws IOException { - Map<String, QVariant<Object>> variantMap = objectSerializer.toVariantMap(data); - assertNotNull(variantMap); - VariantMapSerializer.get().serialize(channel, variantMap); - } - - @SuppressWarnings("RedundantCast") - @NonNull - @Override - public T deserialize(@NonNull ByteBuffer buffer) throws IOException { - return (T) (Object) objectSerializer.fromLegacy(((VariantMapSerializer) VariantMapSerializer.get()).deserialize(buffer)); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantListSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantListSerializer.java deleted file mode 100644 index f89dedb26..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantListSerializer.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class VariantListSerializer<T> implements PrimitiveSerializer<List<T>> { - @NonNull - private static final VariantListSerializer serializer = new VariantListSerializer(); - - private VariantListSerializer() { - } - - @NonNull - public static <T> VariantListSerializer<T> get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final List<T> data) throws IOException { - IntSerializer.get().serialize(channel, data.size()); - - final VariantSerializer<T> variantSerializer = VariantSerializer.get(); - for (T element : data) { - variantSerializer.serialize(channel, new QVariant<>(element)); - } - } - - @NonNull - @Override - public List<T> deserialize(@NonNull final ByteBuffer buffer) throws IOException { - final int length = IntSerializer.get().deserialize(buffer); - final List<T> list = new ArrayList<>(length); - - final VariantSerializer<T> variantSerializer = VariantSerializer.get(); - for (int i = 0; i < length; i++) { - list.add(variantSerializer.deserialize(buffer).data); - } - return list; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantMapSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantMapSerializer.java deleted file mode 100644 index 8c0a745aa..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantMapSerializer.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class VariantMapSerializer<T> implements PrimitiveSerializer<Map<String, QVariant<T>>> { - @NonNull - private static final VariantMapSerializer serializer = new VariantMapSerializer(); - @NonNull - private final PrimitiveSerializer<String> stringSerializer = StringSerializer.get(); - @NonNull - private final VariantSerializer<T> variantSerializer = VariantSerializer.get(); - - private VariantMapSerializer() { - } - - @NonNull - public static <T> VariantMapSerializer<T> get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final Map<String, QVariant<T>> data) throws IOException { - IntSerializer.get().serialize(channel, data.size()); - - for (Map.Entry<String, QVariant<T>> element : data.entrySet()) { - stringSerializer.serialize(channel, element.getKey()); - variantSerializer.serialize(channel, element.getValue()); - } - } - - @NonNull - @Override - public Map<String, QVariant<T>> deserialize(@NonNull final ByteBuffer buffer) throws IOException { - final int length = IntSerializer.get().deserialize(buffer); - final Map<String, QVariant<T>> map = new HashMap<>(length); - - for (int i = 0; i < length; i++) { - map.put(stringSerializer.deserialize(buffer), variantSerializer.deserialize(buffer)); - } - return map; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantSerializer.java deleted file mode 100644 index a0513f36f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantSerializer.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.QMetaTypeRegistry; -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class VariantSerializer<T> implements PrimitiveSerializer<QVariant<T>> { - @NonNull - private static final VariantSerializer serializer = new VariantSerializer(); - - private VariantSerializer() { - } - - @NonNull - public static <T> VariantSerializer<T> get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final QVariant<T> data) throws IOException { - IntSerializer.get().serialize(channel, data.type.type.getValue()); - BoolSerializer.get().serialize(channel, data.data == null); - if (data.type.type == QMetaType.Type.UserType) { - ByteArraySerializer.get(true).serialize(channel, data.type.name); - } - if (data.type.serializer == null) { - throw new IOException("Unknown type: " + data.type.name); - } - data.type.serializer.serialize(channel, data.data); - } - - @NonNull - @Override - public QVariant<T> deserialize(@NonNull final ByteBuffer buffer) throws IOException { - // Read original type - final QMetaType.Type type = QMetaType.Type.fromId(IntSerializer.get().deserialize(buffer)); - - // Read if the data is defined or null - // TODO: For some reason, this is completely ignored. Figure out why and document. - final boolean isNull = BoolSerializer.get().deserialize(buffer); - - // Get the actual serialized type - final QMetaType<T> mtype; - if (type == QMetaType.Type.UserType) { - // If the type is a user-defined type, read type name - // WARNING: This ByteArray has a trailing null byte, which we can’t deserialize. - // Therefore we have to pass a flag to make sure the serializer removes it. - final String typeName = ByteArraySerializer.get(true).deserialize(buffer); - mtype = QMetaTypeRegistry.getType(typeName); - - if (mtype == null || mtype.serializer == null) { - throw new IOException("Unknown type: " + typeName); - } - } else { - mtype = QMetaTypeRegistry.getType(type); - - if (mtype == null || mtype.serializer == null) { - throw new IOException("Unknown type: " + type.name()); - } - } - - // Return data - return new QVariant<>(mtype, mtype.serializer.deserialize(buffer)); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantVariantListSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantVariantListSerializer.java deleted file mode 100644 index 93f2c0599..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantVariantListSerializer.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.primitives.types.QVariant; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class VariantVariantListSerializer<T> implements PrimitiveSerializer<List<QVariant<T>>> { - @NonNull - private static final VariantVariantListSerializer serializer = new VariantVariantListSerializer(); - - private VariantVariantListSerializer() { - } - - @NonNull - public static <T> VariantVariantListSerializer<T> get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final List<QVariant<T>> data) throws IOException { - IntSerializer.get().serialize(channel, data.size()); - - final VariantSerializer<T> variantSerializer = VariantSerializer.get(); - for (QVariant<T> element : data) { - variantSerializer.serialize(channel, element); - } - } - - @NonNull - @Override - public List<QVariant<T>> deserialize(@NonNull final ByteBuffer buffer) throws IOException { - final int length = IntSerializer.get().deserialize(buffer); - final List<QVariant<T>> list = new ArrayList<>(length); - - final VariantSerializer<T> variantSerializer = VariantSerializer.get(); - for (int i = 0; i < length; i++) { - list.add(variantSerializer.deserialize(buffer)); - } - return list; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VoidSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VoidSerializer.java deleted file mode 100644 index 61d3064ff..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VoidSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.serializers; - - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; - -public class VoidSerializer implements PrimitiveSerializer<Void> { - @NonNull - private static final VoidSerializer serializer = new VoidSerializer(); - - private VoidSerializer() { - } - - @NonNull - public static VoidSerializer get() { - return serializer; - } - - @Override - public void serialize(@NonNull final ByteChannel channel, @NonNull final Void data) throws IOException { - - } - - @Nullable - @Override - public Void deserialize(@NonNull final ByteBuffer buffer) throws IOException { - return null; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/types/BufferInfo.java b/app/src/main/java/de/kuschku/libquassel/primitives/types/BufferInfo.java deleted file mode 100644 index 85899e7e4..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/types/BufferInfo.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.types; - -import android.support.annotation.NonNull; - -import com.raizlabs.android.dbflow.annotation.Column; -import com.raizlabs.android.dbflow.annotation.PrimaryKey; -import com.raizlabs.android.dbflow.annotation.Table; -import com.raizlabs.android.dbflow.structure.BaseModel; - -import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; - -@Table(database = ConnectedDatabase.class) -public class BufferInfo extends BaseModel { - @PrimaryKey - public int id; - - @Column - public int networkId; - - @Column - public Type type; - - @Column - public int groupId; - - @Column - public String name; - - public static BufferInfo create(int id, int networkId, Type type, int groupId, String name) { - BufferInfo info = new BufferInfo(); - info.id = id; - info.networkId = networkId; - info.type = type; - info.groupId = groupId; - info.name = name; - return info; - } - - @NonNull - @Override - public String toString() { - return "BufferInfo{" + - "id=" + id + - ", networkId=" + networkId + - ", type=" + type + - ", groupId=" + groupId + - ", name='" + name + '\'' + - '}'; - } - - public enum Type { - INVALID(0x00), - STATUS(0x01), - CHANNEL(0x02), - QUERY(0x04), - GROUP(0x08); - - public static final int ALL = STATUS.id | CHANNEL.id | QUERY.id | GROUP.id; - - public final short id; - - Type(short id) { - this.id = id; - } - - Type(int id) { - this((short) id); - } - - @NonNull - public static Type fromId(short id) { - switch (id) { - case 0x01: - return STATUS; - case 0x02: - return CHANNEL; - case 0x04: - return QUERY; - case 0x08: - return GROUP; - default: - return INVALID; - } - } - - } - - public enum BufferStatus { - OFFLINE, - AWAY, - ONLINE - } - - public enum ContentStatus { - NONE, - ACTIVITY, - MESSAGES, - HIGHLIGHTS - } - -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/types/Protocol.java b/app/src/main/java/de/kuschku/libquassel/primitives/types/Protocol.java deleted file mode 100644 index fb461cc04..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/types/Protocol.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.types; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.client.FeatureFlags; - -public class Protocol { - @NonNull - public final FeatureFlags protocolFlags; - public final short protocolData; - public final byte protocolVersion; - - public Protocol(@NonNull FeatureFlags protocolFlags, short protocolData, byte protocolVersion) { - this.protocolFlags = protocolFlags; - this.protocolData = protocolData; - this.protocolVersion = protocolVersion; - } - - @NonNull - @Override - public String toString() { - return "Protocol{" + - "protocolFlags=" + protocolFlags + - ", protocolData=" + protocolData + - ", protocolVersion=" + protocolVersion + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/types/QVariant.java b/app/src/main/java/de/kuschku/libquassel/primitives/types/QVariant.java deleted file mode 100644 index b4de80848..000000000 --- a/app/src/main/java/de/kuschku/libquassel/primitives/types/QVariant.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.primitives.types; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.ArrayList; -import java.util.Set; - -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.QMetaTypeRegistry; -import de.kuschku.libquassel.syncables.SyncableRegistry; -import de.kuschku.libquassel.syncables.types.interfaces.QSyncableObject; - -public class QVariant<T> { - @Nullable - public final T data; - @Nullable - public final QMetaType<T> type; - - @SuppressWarnings("unchecked") - public QVariant(@NonNull T data) { - if (data instanceof Set) { - this.data = (T) new ArrayList((Set) data); - } else { - if (QMetaTypeRegistry.getTypeByObject(data) != null) { - this.data = data; - } else if (data instanceof QSyncableObject) { - this.data = (T) SyncableRegistry.toVariantMap((QSyncableObject) data); - } else { - throw new IllegalArgumentException(); - } - } - - this.type = QMetaTypeRegistry.getTypeByObject(this.data); - } - - public QVariant(@NonNull QMetaType<T> type, @Nullable T data) { - this.type = type; - this.data = data; - } - - public QVariant(@NonNull QMetaType.Type type, @Nullable T data) { - this.type = QMetaTypeRegistry.getType(type); - this.data = data; - } - - public QVariant(@NonNull String typeName, @Nullable T data) { - this.type = QMetaTypeRegistry.getType(typeName); - this.data = data; - } - - @Nullable - public static <T> T orNull(@Nullable QVariant<T> data) { - if (data == null) return null; - else return data.data; - } - - @NonNull - public String toString() { - return "QVariant(data=" + String.valueOf(this.data) + ", type=" + this.type.name + ")"; - } - - @NonNull - public T or(@NonNull T ifNull) { - return data == null ? ifNull : data; - } - - @Nullable - public T get() { - return data; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java deleted file mode 100644 index e34f01e17..000000000 --- a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java +++ /dev/null @@ -1,336 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.protocols; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.google.common.base.Function; -import com.google.common.collect.Lists; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.BufferOverflowException; -import java.nio.BufferUnderflowException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.CoreConnection; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.events.GeneralErrorEvent; -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.serializers.HeartbeatReplySerializer; -import de.kuschku.libquassel.functions.serializers.HeartbeatSerializer; -import de.kuschku.libquassel.functions.serializers.InitDataFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.InitRequestFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.PackedInitDataFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.PackedRpcCallFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.PackedSyncFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.UnpackedRpcCallFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.UnpackedSyncFunctionSerializer; -import de.kuschku.libquassel.functions.types.HandshakeFunction; -import de.kuschku.libquassel.functions.types.Heartbeat; -import de.kuschku.libquassel.functions.types.HeartbeatReply; -import de.kuschku.libquassel.functions.types.InitDataFunction; -import de.kuschku.libquassel.functions.types.InitRequestFunction; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.objects.MessageTypeRegistry; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.serializers.IntSerializer; -import de.kuschku.libquassel.primitives.serializers.PrimitiveSerializer; -import de.kuschku.libquassel.primitives.serializers.VariantVariantListSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.util.niohelpers.Helper; -import de.kuschku.util.niohelpers.WrappedChannel; - -import static de.kuschku.util.AndroidAssert.assertFalse; -import static de.kuschku.util.AndroidAssert.assertNotNull; - -/** - * A helper class processing incoming and outgoing messages. - * Implements the Qt Datastream protocol. - * - * @author Janne Koschinski - */ -@SuppressWarnings({"unchecked", "unused"}) -public class DatastreamPeer implements RemotePeer { - @NonNull - private final CoreConnection connection; - @NonNull - private final BusProvider busProvider; - @NonNull - private final ExecutorService parseExecutor; - @NonNull - private ByteBuffer buffer = ByteBuffer.allocate(0); - - public DatastreamPeer(@NonNull CoreConnection connection, @NonNull BusProvider busProvider) { - this.connection = connection; - this.busProvider = busProvider; - this.busProvider.dispatch.register(this); - this.parseExecutor = Executors.newSingleThreadExecutor(); - } - - @NonNull - public static List<QVariant<Object>> mapToList(@NonNull Map<String, QVariant> data) { - final List<QVariant<Object>> list = new ArrayList<>(data.size() * 2); - for (Map.Entry<String, QVariant> entry : data.entrySet()) { - list.add(new QVariant<>(QMetaType.Type.QByteArray, entry.getKey())); - list.add(entry.getValue()); - } - return list; - } - - @NonNull - public static Map<String, QVariant> listToMap(@NonNull List<QVariant> data) { - final Map<String, QVariant> map = new HashMap<>(data.size() / 2); - for (int i = 0; i < data.size(); i += 2) { - map.put((String) data.get(i).data, data.get(i + 1)); - } - return map; - } - - @NonNull - public static <T> Map<T, T> unboxedListToMap(@NonNull List<T> data) { - final Map<T, T> map = new HashMap<>(data.size() / 2); - for (int i = 0; i < data.size(); i += 2) { - map.put(data.get(i), data.get(i + 1)); - } - return map; - } - - @NonNull - public static List unboxList(@NonNull List packedFunc) { - return Lists.transform(packedFunc, new Function<QVariant, Object>() { - @Override - public Object apply(@Nullable QVariant input) { - assertNotNull(input); - - return input.data; - } - }); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull SyncFunction func) { - assertNotNull(connection.getOutputExecutor()); - assertFalse(connection.getOutputExecutor().isShutdown()); - connection.getOutputExecutor().submit(new OutputRunnable<>( - VariantVariantListSerializer.<SyncFunction>get(), - UnpackedSyncFunctionSerializer.get().serialize(func) - )); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull RpcCallFunction func) { - assertNotNull(connection.getOutputExecutor()); - assertFalse(connection.getOutputExecutor().isShutdown()); - connection.getOutputExecutor().submit(new OutputRunnable<>( - VariantVariantListSerializer.<RpcCallFunction>get(), - UnpackedRpcCallFunctionSerializer.get().serialize(func) - )); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull InitRequestFunction func) { - assertNotNull(connection.getOutputExecutor()); - assertFalse(connection.getOutputExecutor().isShutdown()); - connection.getOutputExecutor().submit(new OutputRunnable<>( - VariantVariantListSerializer.<InitRequestFunction>get(), - InitRequestFunctionSerializer.get().serializePacked(func) - )); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull InitDataFunction func) { - assertNotNull(connection.getOutputExecutor()); - assertFalse(connection.getOutputExecutor().isShutdown()); - connection.getOutputExecutor().submit(new OutputRunnable<>( - VariantVariantListSerializer.<InitDataFunction>get(), - InitDataFunctionSerializer.get().serialize(func) - )); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull Heartbeat func) { - assertNotNull(connection.getOutputExecutor()); - assertFalse(connection.getOutputExecutor().isShutdown()); - connection.getOutputExecutor().submit(new OutputRunnable<>( - VariantVariantListSerializer.<InitDataFunction>get(), - HeartbeatSerializer.get().serialize(func) - )); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull HeartbeatReply func) { - assertNotNull(connection.getOutputExecutor()); - assertFalse(connection.getOutputExecutor().isShutdown()); - connection.getOutputExecutor().submit(new OutputRunnable<>( - VariantVariantListSerializer.<InitDataFunction>get(), - HeartbeatReplySerializer.get().serialize(func) - )); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull HandshakeFunction func) { - assertNotNull(connection.getOutputExecutor()); - assertFalse(connection.getOutputExecutor().isShutdown()); - Map<String, QVariant> variantMap = MessageTypeRegistry.toVariantMap(func.data).data; - assertNotNull(variantMap); - connection.getOutputExecutor().submit(new OutputRunnable<>( - VariantVariantListSerializer.get(), - DatastreamPeer.mapToList(variantMap) - )); - } - - private void handleHandshakeMessage(@NonNull List data) { - busProvider.handle(MessageTypeRegistry.from(DatastreamPeer.listToMap(data))); - } - - private void handlePackedFunc(@NonNull List<QVariant> data) { - final FunctionType type = FunctionType.fromId((int) data.get(0).data); - data.remove(0); - switch (type) { - case SYNC: - busProvider.handle(PackedSyncFunctionSerializer.get().deserialize(data)); - break; - case RPCCALL: - busProvider.handle(PackedRpcCallFunctionSerializer.get().deserialize(data)); - break; - case INITREQUEST: - busProvider.handle(InitRequestFunctionSerializer.get().deserialize(data)); - break; - case INITDATA: - busProvider.handle(PackedInitDataFunctionSerializer.get().deserialize(data)); - break; - case HEARTBEAT: - busProvider.handle(HeartbeatSerializer.get().deserialize(data)); - break; - case HEARTBEATREPLY: - busProvider.handle(HeartbeatReplySerializer.get().deserialize(data)); - break; - default: - busProvider.sendEvent(new GeneralErrorEvent("Unknown package received: " + data)); - break; - } - } - - public void processMessage() throws IOException { - buffer = ByteBuffer.allocate(4); - connection.getChannel().read(buffer); - - final int size = IntSerializer.get().deserialize(buffer); - - if (size == 0) return; - - buffer = ByteBuffer.allocate(size); - connection.getChannel().read(buffer); - - parseExecutor.submit(new ParseRunnable(buffer)); - } - - @NonNull - @Override - public ByteBuffer getBuffer() { - return buffer; - } - - /** - * A special runnable that serializes an object into a buffer, writes the size of the buffer, and, if necessary, - * compresses it with deflate. - * - * @param <T> - */ - private class OutputRunnable<T> implements Runnable { - @NonNull - private final T data; - @NonNull - private final PrimitiveSerializer<T> serializer; - - public OutputRunnable(@NonNull PrimitiveSerializer<T> serializer, @NonNull T data) { - this.data = data; - this.serializer = serializer; - } - - @Override - public void run() { - assertNotNull(connection.getChannel()); - - try { - // TODO: Reuse buffer - - // Create a buffer - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - // Wrap it in a fake channel - final WrappedChannel fakeChannel = WrappedChannel.ofStreams(null, new DataOutputStream(out)); - // Serialize the object into the buffer-channel - serializer.serialize(fakeChannel, data); - // Write the size of the buffer over the network - IntSerializer.get().serialize(connection.getChannel(), out.size()); - // Write the content of the buffer over the network - connection.getChannel().write(ByteBuffer.wrap(out.toByteArray())); - // Flush the deflater, if existing - connection.getChannel().flush(); - // Close the buffer - fakeChannel.close(); - } catch (Exception e) { - busProvider.sendEvent(new GeneralErrorEvent(e)); - } - } - } - - private class ParseRunnable implements Runnable { - final ByteBuffer buffer; - - public ParseRunnable(ByteBuffer buffer) { - this.buffer = buffer; - } - - @Override - public void run() { - try { - // TODO: Put this into a future with a time limit, and parallelize it. - final List data = VariantVariantListSerializer.get().deserialize(buffer); - if (connection.getStatus() == ConnectionChangeEvent.Status.HANDSHAKE) { - handleHandshakeMessage(data); - } else { - handlePackedFunc(data); - } - } catch (@NonNull BufferUnderflowException | BufferOverflowException e) { - Helper.printHexDump(buffer.array()); - busProvider.sendEvent(new GeneralErrorEvent(e)); - } catch (Exception e) { - busProvider.sendEvent(new GeneralErrorEvent(e)); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java deleted file mode 100644 index 002610dc4..000000000 --- a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.protocols; - -import android.support.annotation.NonNull; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.CoreConnection; -import de.kuschku.libquassel.events.GeneralErrorEvent; -import de.kuschku.libquassel.functions.FunctionType; -import de.kuschku.libquassel.functions.serializers.HeartbeatReplySerializer; -import de.kuschku.libquassel.functions.serializers.HeartbeatSerializer; -import de.kuschku.libquassel.functions.serializers.InitDataFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.InitRequestFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.UnpackedInitDataFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.UnpackedRpcCallFunctionSerializer; -import de.kuschku.libquassel.functions.serializers.UnpackedSyncFunctionSerializer; -import de.kuschku.libquassel.functions.types.HandshakeFunction; -import de.kuschku.libquassel.functions.types.Heartbeat; -import de.kuschku.libquassel.functions.types.HeartbeatReply; -import de.kuschku.libquassel.functions.types.InitDataFunction; -import de.kuschku.libquassel.functions.types.InitRequestFunction; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.objects.MessageTypeRegistry; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.serializers.IntSerializer; -import de.kuschku.libquassel.primitives.serializers.PrimitiveSerializer; -import de.kuschku.libquassel.primitives.serializers.VariantSerializer; -import de.kuschku.libquassel.primitives.serializers.VariantVariantListSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.util.niohelpers.WrappedChannel; - -import static de.kuschku.libquassel.primitives.QMetaType.Type.QVariantList; -import static de.kuschku.libquassel.primitives.QMetaType.Type.QVariantMap; -import static de.kuschku.util.AndroidAssert.assertNotNull; - -/** - * A helper class processing incoming and outgoing messages. - * Implements the Legacy Protocol with modern Handshake - * - * @author Janne Koschinski - */ -@SuppressWarnings({"unchecked", "unused"}) -public class LegacyPeer implements RemotePeer { - @NonNull - private final CoreConnection connection; - @NonNull - private final BusProvider busProvider; - @NonNull - private final ExecutorService parseExecutor; - @NonNull - private ByteBuffer buffer = ByteBuffer.allocate(0); - - public LegacyPeer(@NonNull CoreConnection connection, @NonNull BusProvider busProvider) { - this.connection = connection; - this.busProvider = busProvider; - this.busProvider.dispatch.register(this); - this.parseExecutor = Executors.newCachedThreadPool(); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public final void onEventBackgroundThread(@NonNull SyncFunction func) { - assertNotNull(connection.getOutputExecutor()); - final List serialize = UnpackedSyncFunctionSerializer.get().serialize(func); - connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(), - new QVariant(new QMetaType(List.class, QMetaType.Type.QVariantList, VariantVariantListSerializer.get()), - serialize))); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull RpcCallFunction func) { - assertNotNull(connection.getOutputExecutor()); - connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(), - new QVariant<>(QVariantList, UnpackedRpcCallFunctionSerializer.get().serialize(func)))); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull InitRequestFunction func) { - assertNotNull(connection.getOutputExecutor()); - connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(), - new QVariant<>(QVariantList, InitRequestFunctionSerializer.get().serialize(func)))); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull InitDataFunction func) { - assertNotNull(connection.getOutputExecutor()); - connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(), - new QVariant<>(QVariantList, InitDataFunctionSerializer.get().serialize(func)))); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull Heartbeat func) { - assertNotNull(connection.getOutputExecutor()); - connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(), - new QVariant<>(QVariantList, HeartbeatSerializer.get().serialize(func)))); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull HeartbeatReply func) { - assertNotNull(connection.getOutputExecutor()); - connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(), - new QVariant<>(QVariantList, HeartbeatReplySerializer.get().serialize(func)))); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void onEventBackgroundThread(@NonNull HandshakeFunction func) { - assertNotNull(connection.getOutputExecutor()); - connection.getOutputExecutor().submit(new OutputRunnable<>( - VariantSerializer.get(), MessageTypeRegistry.toVariantMap(func.data))); - } - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - public void processMessage() throws IOException { - buffer = ByteBuffer.allocate(4); - connection.getChannel().read(buffer); - - final int size = IntSerializer.get().deserialize(buffer); - if (size == 0) return; - - buffer = ByteBuffer.allocate(size); - connection.getChannel().read(buffer); - - parseExecutor.submit(new ParseRunnable(buffer)); - } - - @NonNull - @Override - public ByteBuffer getBuffer() { - return buffer; - } - - /** - * A special runnable that serializes an object into a buffer, writes the size of the buffer, and, if necessary, - * compresses it with deflate. - * - * @param <T> - */ - private class OutputRunnable<T> implements Runnable { - @NonNull - private final T data; - @NonNull - private final PrimitiveSerializer<T> serializer; - - public OutputRunnable(@NonNull PrimitiveSerializer<T> serializer, @NonNull T data) { - this.data = data; - this.serializer = serializer; - } - - @Override - public void run() { - try { - // TODO: Reuse buffer - - // Create a buffer - final ByteArrayOutputStream out = new ByteArrayOutputStream(); - // Wrap it in a fake channel - final WrappedChannel fakeChannel = WrappedChannel.ofStreams(null, new DataOutputStream(out)); - // Serialize the object into the buffer-channel - serializer.serialize(fakeChannel, data); - // Write the size of the buffer over the network - IntSerializer.get().serialize(connection.getChannel(), out.size()); - // Write the content of the buffer over the network - connection.getChannel().write(ByteBuffer.wrap(out.toByteArray())); - // Flush the deflater, if existing - connection.getChannel().flush(); - // Close the buffer - fakeChannel.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - private class ParseRunnable implements Runnable { - final ByteBuffer buffer; - - public ParseRunnable(ByteBuffer buffer) { - this.buffer = buffer; - } - - @Override - public void run() { - try { - // TODO: Put this into a future with a time limit, and parallelize it. - final QVariant data = VariantSerializer.get().deserialize(buffer); - assertNotNull(data.data); - if (data.type.type == QVariantMap) { - busProvider.handle(MessageTypeRegistry.from((Map<String, QVariant>) data.data)); - } else if (data.type.type == QVariantList) { - final FunctionType type = FunctionType.fromId((Integer) ((List<Object>) data.data).remove(0)); - switch (type) { - case SYNC: - busProvider.handle(UnpackedSyncFunctionSerializer.get().deserialize((List<QVariant>) data.data)); - break; - case RPCCALL: - busProvider.handle(UnpackedRpcCallFunctionSerializer.get().deserialize((List<QVariant>) data.data)); - break; - case INITREQUEST: - busProvider.handle(InitRequestFunctionSerializer.get().deserialize((List<QVariant>) data.data)); - break; - case INITDATA: - busProvider.handle(UnpackedInitDataFunctionSerializer.get().deserialize((List<QVariant>) data.data)); - break; - case HEARTBEAT: - busProvider.handle(HeartbeatSerializer.get().deserialize((List<QVariant>) data.data)); - break; - case HEARTBEATREPLY: - busProvider.handle(HeartbeatReplySerializer.get().deserialize((List<QVariant>) data.data)); - break; - default: - busProvider.sendEvent(new GeneralErrorEvent("Unknown package received: " + data)); - break; - } - } - } catch (Exception e) { - busProvider.sendEvent(new GeneralErrorEvent(e)); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/RemotePeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/RemotePeer.java deleted file mode 100644 index 05329d4c2..000000000 --- a/app/src/main/java/de/kuschku/libquassel/protocols/RemotePeer.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.protocols; - -import android.support.annotation.NonNull; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.io.IOException; -import java.nio.ByteBuffer; - -import de.kuschku.libquassel.functions.types.HandshakeFunction; -import de.kuschku.libquassel.functions.types.Heartbeat; -import de.kuschku.libquassel.functions.types.HeartbeatReply; -import de.kuschku.libquassel.functions.types.InitDataFunction; -import de.kuschku.libquassel.functions.types.InitRequestFunction; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.functions.types.SyncFunction; - -public interface RemotePeer { - byte DATASTREAM = 0x02; - byte LEGACY = 0x01; - int PROTOCOL_VERSION_LEGACY = 10; - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - void onEventBackgroundThread(@NonNull SyncFunction func); - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - void onEventBackgroundThread(@NonNull RpcCallFunction func); - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - void onEventBackgroundThread(@NonNull InitRequestFunction func); - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - void onEventBackgroundThread(@NonNull InitDataFunction func); - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - void onEventBackgroundThread(@NonNull HandshakeFunction func); - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - void onEventBackgroundThread(@NonNull Heartbeat func); - - @Subscribe(threadMode = ThreadMode.BACKGROUND) - void onEventBackgroundThread(@NonNull HeartbeatReply func); - - void processMessage() throws IOException; - - @NonNull - ByteBuffer getBuffer(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/CertificateManager.java b/app/src/main/java/de/kuschku/libquassel/ssl/CertificateManager.java deleted file mode 100644 index 08d24dfe1..000000000 --- a/app/src/main/java/de/kuschku/libquassel/ssl/CertificateManager.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.ssl; - -import android.support.annotation.NonNull; - -import java.security.cert.X509Certificate; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import de.kuschku.util.accounts.ServerAddress; - -public interface CertificateManager { - boolean isTrusted(X509Certificate certificate, ServerAddress core); - - boolean addCertificate(X509Certificate certificate, ServerAddress core); - - boolean removeCertificate(X509Certificate certificate, ServerAddress core); - - boolean removeAllCertificates(ServerAddress core); - - @NonNull - List<String> findCertificates(ServerAddress core); - - @NonNull - Map<String, Collection<String>> findAllCertificates(); - - void checkTrusted(X509Certificate certificate, ServerAddress address) throws UnknownCertificateException; -} diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java deleted file mode 100644 index 3a6edbe89..000000000 --- a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.ssl; - -import android.support.annotation.NonNull; - -import java.security.GeneralSecurityException; -import java.security.KeyStore; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509TrustManager; - -import de.kuschku.util.accounts.ServerAddress; -import de.kuschku.util.backports.Consumer; -import de.kuschku.util.certificates.CertificateUtils; - -public class QuasselTrustManager implements X509TrustManager { - @NonNull - private final X509TrustManager wrapped; - @NonNull - private final CertificateManager certificateManager; - @NonNull - private final ServerAddress address; - private final Consumer<X509Certificate[]> callback; - - public QuasselTrustManager(@NonNull X509TrustManager wrapped, @NonNull CertificateManager certificateManager, @NonNull ServerAddress address, Consumer<X509Certificate[]> callback) { - this.wrapped = wrapped; - this.certificateManager = certificateManager; - this.address = address; - this.callback = callback; - } - - @NonNull - public static QuasselTrustManager fromFactory(@NonNull TrustManagerFactory factory, @NonNull CertificateManager certificateManager, @NonNull ServerAddress address, Consumer<X509Certificate[]> callback) throws GeneralSecurityException { - TrustManager[] managers = factory.getTrustManagers(); - for (TrustManager manager : managers) { - if (manager instanceof X509TrustManager) { - return new QuasselTrustManager((X509TrustManager) manager, certificateManager, address, callback); - } - } - throw new GeneralSecurityException("Couldn’t find trustmanager provided by factory"); - } - - @NonNull - public static QuasselTrustManager fromDefault(@NonNull CertificateManager certificateManager, @NonNull ServerAddress address, Consumer<X509Certificate[]> callback) throws GeneralSecurityException { - TrustManagerFactory factory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); - factory.init((KeyStore) null); - return fromFactory(factory, certificateManager, address, callback); - } - - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { - wrapped.checkClientTrusted(chain, authType); - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { - try { - wrapped.checkServerTrusted(chain, authType); - chain[0].checkValidity(); - if (!CertificateUtils.getHostnames(chain[0]).contains(address.host)) - throw new CertificateException("Hostname not in certificate"); - } catch (CertificateException e) { - certificateManager.checkTrusted(chain[0], address); - } - callback.apply(chain); - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return wrapped.getAcceptedIssuers(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/UnknownCertificateException.java b/app/src/main/java/de/kuschku/libquassel/ssl/UnknownCertificateException.java deleted file mode 100644 index 0ef702f9b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/ssl/UnknownCertificateException.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.ssl; - -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -import de.kuschku.util.accounts.ServerAddress; - -public class UnknownCertificateException extends CertificateException { - public final X509Certificate certificate; - public final ServerAddress address; - - public UnknownCertificateException(X509Certificate certificate, ServerAddress address) { - this.certificate = certificate; - this.address = address; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/Syncable.java b/app/src/main/java/de/kuschku/libquassel/syncables/Syncable.java deleted file mode 100644 index 0429ebd67..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/Syncable.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.primitives.QMetaType; - -public @interface Syncable { - @NonNull String name() default ""; - - @NonNull QMetaType.Type type() default QMetaType.Type.LastType; - - @NonNull String userType() default ""; - - @NonNull QMetaType.Type[] paramTypes() default {}; -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java b/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java deleted file mode 100644 index cbfa0d5a9..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.exceptions.UnknownTypeException; -import de.kuschku.libquassel.functions.types.InitDataFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.AliasManagerSerializer; -import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer; -import de.kuschku.libquassel.syncables.serializers.BufferViewConfigSerializer; -import de.kuschku.libquassel.syncables.serializers.BufferViewManagerSerializer; -import de.kuschku.libquassel.syncables.serializers.CoreInfoSerializer; -import de.kuschku.libquassel.syncables.serializers.IdentitySerializer; -import de.kuschku.libquassel.syncables.serializers.IgnoreListManagerSerializer; -import de.kuschku.libquassel.syncables.serializers.IrcChannelSerializer; -import de.kuschku.libquassel.syncables.serializers.IrcUserSerializer; -import de.kuschku.libquassel.syncables.serializers.NetworkConfigSerializer; -import de.kuschku.libquassel.syncables.serializers.NetworkSerializer; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QSyncableObject; - -public class SyncableRegistry { - @NonNull - private static final Map<String, ObjectSerializer> map = new HashMap<>(); - - static { - map.put("IgnoreListManager", IgnoreListManagerSerializer.get()); - map.put("BufferSyncer", BufferSyncerSerializer.get()); - map.put("BufferViewConfig", BufferViewConfigSerializer.get()); - map.put("BufferViewManager", BufferViewManagerSerializer.get()); - map.put("Identity", IdentitySerializer.get()); - map.put("IrcChannel", IrcChannelSerializer.get()); - map.put("IrcUser", IrcUserSerializer.get()); - map.put("Network", NetworkSerializer.get()); - map.put("NetworkConfig", NetworkConfigSerializer.get()); - map.put("AliasManager", AliasManagerSerializer.get()); - map.put("CoreInfo", CoreInfoSerializer.get()); - } - - private SyncableRegistry() { - - } - - @SuppressWarnings("unchecked") - @Nullable - public static SyncableObject from(@NonNull InitDataFunction function) throws UnknownTypeException { - String className = function.className; - ObjectSerializer<? extends SyncableObject> serializer = map.get(className); - if (serializer == null) throw new UnknownTypeException(className, function); - return serializer.from(function); - } - - @SuppressWarnings("unchecked") - @Nullable - public static Map<String, QVariant<Object>> toVariantMap(QSyncableObject data) { - String className = data.getClass().getSimpleName(); - ObjectSerializer<QSyncableObject> serializer = map.get(className); - if (serializer == null) throw new UnknownTypeException(className); - return serializer.toVariantMap(data); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/Synced.java b/app/src/main/java/de/kuschku/libquassel/syncables/Synced.java deleted file mode 100644 index fe7a09ffb..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/Synced.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.SOURCE) -public @interface Synced { -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java deleted file mode 100644 index 9d0b8ca53..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.AliasManager; -import de.kuschku.libquassel.syncables.types.interfaces.QAliasManager; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@SuppressWarnings("unchecked") -public class AliasManagerSerializer implements ObjectSerializer<AliasManager> { - @NonNull - private static final AliasManagerSerializer serializer = new AliasManagerSerializer(); - - private AliasManagerSerializer() { - - } - - @NonNull - public static AliasManagerSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull AliasManager data) { - HashMap<String, QVariant<Object>> aliases = new HashMap<>(); - List<String> names = new ArrayList<>(data.aliases().size()); - List<String> expansions = new ArrayList<>(data.aliases().size()); - for (QAliasManager.Alias alias : data.aliases()) { - names.add(alias.name); - expansions.add(alias.expansion); - } - aliases.put("names", new QVariant(QMetaType.Type.QStringList, names)); - aliases.put("expansions", new QVariant(QMetaType.Type.QStringList, expansions)); - - HashMap<String, QVariant<Object>> map = new HashMap<>(); - map.put("Aliases", new QVariant(QMetaType.Type.QVariantMap, aliases)); - return map; - } - - @NonNull - @Override - public AliasManager fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public AliasManager fromLegacy(@NonNull Map<String, QVariant> map) { - Map<String, QVariant<List<String>>> aliases = (Map<String, QVariant<List<String>>>) map.get("Aliases").data; - assertNotNull(aliases); - return new AliasManager( - aliases.get("names").data, - aliases.get("expansions").data - ); - } - - @Nullable - @Override - public AliasManager from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferSyncerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferSyncerSerializer.java deleted file mode 100644 index bbe5b3127..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferSyncerSerializer.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.protocols.DatastreamPeer; -import de.kuschku.libquassel.syncables.types.impl.BufferSyncer; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class BufferSyncerSerializer implements ObjectSerializer<BufferSyncer> { - @NonNull - private static final BufferSyncerSerializer serializer = new BufferSyncerSerializer(); - - private BufferSyncerSerializer() { - } - - @NonNull - public static BufferSyncerSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull BufferSyncer data) { - // FIXME: IMPLEMENT - throw new IllegalArgumentException(); - } - - @NonNull - @Override - public BufferSyncer fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public BufferSyncer fromLegacy(@NonNull Map<String, QVariant> map) { - return new BufferSyncer( - DatastreamPeer.unboxedListToMap((List<Integer>) map.get("LastSeenMsg").data), - DatastreamPeer.unboxedListToMap((List<Integer>) map.get("MarkerLines").data) - ); - } - - @Override - public BufferSyncer from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferViewConfigSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferViewConfigSerializer.java deleted file mode 100644 index f24025279..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferViewConfigSerializer.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.BufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class BufferViewConfigSerializer implements ObjectSerializer<BufferViewConfig> { - @NonNull - private static final BufferViewConfigSerializer serializer = new BufferViewConfigSerializer(); - - private BufferViewConfigSerializer() { - } - - @NonNull - public static BufferViewConfigSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull BufferViewConfig data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("bufferViewName", new QVariant<>(data.bufferViewName())); - map.put("TemporarilyRemovedBuffers", new QVariant<>(data.temporarilyRemovedBuffers())); - map.put("hideInactiveNetworks", new QVariant<>(data.hideInactiveBuffers())); - map.put("BufferList", new QVariant<>(data.bufferList())); - map.put("allowedBufferTypes", new QVariant<>(data.allowedBufferTypes())); - map.put("sortAlphabetically", new QVariant<>(data.sortAlphabetically())); - map.put("disableDecoration", new QVariant<>(data.disableDecoration())); - map.put("addNewBuffersAutomatically", new QVariant<>(data.addNewBuffersAutomatically())); - map.put("networkId", new QVariant<>("NetworkId", data.networkId())); - map.put("minimumActivity", new QVariant<>(data.minimumActivity().id)); - map.put("hideInactiveBuffers", new QVariant<>(data.hideInactiveBuffers())); - map.put("RemovedBuffers", new QVariant<>(data.removedBuffers())); - return map; - } - - @NonNull - @Override - public BufferViewConfig fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public BufferViewConfig fromLegacy(@NonNull Map<String, QVariant> map) { - return new BufferViewConfig( - (String) map.get("bufferViewName").data, - (List<Integer>) map.get("TemporarilyRemovedBuffers").data, - (boolean) map.get("hideInactiveNetworks").data, - (List<Integer>) map.get("BufferList").data, - (int) map.get("allowedBufferTypes").data, - (boolean) map.get("sortAlphabetically").data, - (boolean) map.get("disableDecoration").data, - (boolean) map.get("addNewBuffersAutomatically").data, - (int) map.get("networkId").data, - QBufferViewConfig.MinimumActivity.fromId((int) map.get("minimumActivity").data), - (boolean) map.get("hideInactiveBuffers").data, - (List<Integer>) map.get("RemovedBuffers").data - ); - } - - @Override - public BufferViewConfig from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferViewManagerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferViewManagerSerializer.java deleted file mode 100644 index fa938c6f8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/BufferViewManagerSerializer.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.BufferViewManager; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class BufferViewManagerSerializer implements ObjectSerializer<QBufferViewManager> { - @NonNull - private static final BufferViewManagerSerializer serializer = new BufferViewManagerSerializer(); - - private BufferViewManagerSerializer() { - } - - @NonNull - public static BufferViewManagerSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull QBufferViewManager data) { - HashMap<String, QVariant<Object>> map = new HashMap<>(); - map.put("BufferViewIds", new QVariant(getBufferViewIds(data))); - return map; - } - - @NonNull - private List<Integer> getBufferViewIds(@NonNull QBufferViewManager data) { - List<Integer> bufferViewIds = new ArrayList<>(data.bufferViewConfigs().size()); - for (QBufferViewConfig config : data.bufferViewConfigs()) - bufferViewIds.add(config.bufferViewId()); - return bufferViewIds; - } - - @NonNull - @Override - public QBufferViewManager fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public QBufferViewManager fromLegacy(@NonNull Map<String, QVariant> map) { - return new BufferViewManager( - (List<Integer>) map.get("BufferViewIds").data - ); - } - - @Override - public QBufferViewManager from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/CoreInfoSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/CoreInfoSerializer.java deleted file mode 100644 index 7adba85fb..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/CoreInfoSerializer.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.CoreInfo; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@SuppressWarnings("unchecked") -public class CoreInfoSerializer implements ObjectSerializer<CoreInfo> { - @NonNull - private static final CoreInfoSerializer serializer = new CoreInfoSerializer(); - - private CoreInfoSerializer() { - - } - - @NonNull - public static CoreInfoSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull CoreInfo data) { - Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("coreData", (QVariant<Object>) data.coreData()); - return map; - } - - @NonNull - @Override - public CoreInfo fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public CoreInfo fromLegacy(@NonNull Map<String, QVariant> map) { - QVariant<Map<String, QVariant>> data = map.get("coreData"); - assertNotNull(data); - return new CoreInfo( - data.data - ); - } - - @Nullable - @Override - public CoreInfo from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IdentitySerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IdentitySerializer.java deleted file mode 100644 index 1deebc220..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IdentitySerializer.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.Identity; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class IdentitySerializer implements ObjectSerializer<Identity> { - @NonNull - private static final IdentitySerializer serializer = new IdentitySerializer(); - - private IdentitySerializer() { - } - - @NonNull - public static IdentitySerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull Identity data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("identityName", new QVariant(data.identityName())); - map.put("nicks", new QVariant(data.nicks())); - map.put("ident", new QVariant(data.ident())); - map.put("realName", new QVariant(data.realName())); - map.put("identityId", new QVariant(data.id())); - map.put("autoAwayEnabled", new QVariant(data.autoAwayEnabled())); - map.put("autoAwayReasonEnabled", new QVariant(data.autoAwayReasonEnabled())); - map.put("autoAwayTime", new QVariant(data.autoAwayTime())); - map.put("awayNickEnabled", new QVariant(data.awayNickEnabled())); - map.put("awayReasonEnabled", new QVariant(data.awayReasonEnabled())); - map.put("detachAwayEnabled", new QVariant(data.detachAwayEnabled())); - map.put("detachAwayReasonEnabled", new QVariant(data.detachAwayReasonEnabled())); - map.put("awayReason", new QVariant(data.awayReason())); - map.put("autoAwayReason", new QVariant(data.autoAwayReason())); - map.put("detachAwayReason", new QVariant(data.detachAwayReason())); - map.put("partReason", new QVariant(data.partReason())); - map.put("quitReason", new QVariant(data.quitReason())); - map.put("awayNick", new QVariant(data.awayNick())); - map.put("kickReason", new QVariant(data.kickReason())); - return map; - } - - @NonNull - @Override - public Identity fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public Identity fromLegacy(@NonNull Map<String, QVariant> map) { - return new Identity( - (int) map.get("identityId").data, - (String) map.get("identityName").data, - (String) map.get("realName").data, - (List<String>) map.get("nicks").data, - (String) map.get("awayNick").data, - (boolean) map.get("awayNickEnabled").data, - (String) map.get("awayReason").data, - (boolean) map.get("awayReasonEnabled").data, - (boolean) map.get("autoAwayEnabled").data, - (int) map.get("autoAwayTime").data, - (String) map.get("autoAwayReason").data, - (boolean) map.get("autoAwayReasonEnabled").data, - (boolean) map.get("detachAwayEnabled").data, - (String) map.get("detachAwayReason").data, - (boolean) map.get("detachAwayReasonEnabled").data, - (String) map.get("ident").data, - (String) map.get("kickReason").data, - (String) map.get("partReason").data, - (String) map.get("quitReason").data - ); - } - - @Override - public Identity from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java deleted file mode 100644 index 0b737f8a8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IgnoreListManagerSerializer.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.IgnoreListManager; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@SuppressWarnings("unchecked") -public class IgnoreListManagerSerializer implements ObjectSerializer<IgnoreListManager> { - @NonNull - private static final IgnoreListManagerSerializer serializer = new IgnoreListManagerSerializer(); - - private IgnoreListManagerSerializer() { - - } - - @NonNull - public static IgnoreListManagerSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull IgnoreListManager data) { - HashMap<String, QVariant<Object>> map = new HashMap<>(); - List<Integer> scope = new ArrayList<>(data.ignoreList().size()); - List<Integer> ignoreType = new ArrayList<>(data.ignoreList().size()); - List<Boolean> isActive = new ArrayList<>(data.ignoreList().size()); - List<String> scopeRule = new ArrayList<>(data.ignoreList().size()); - List<Boolean> isRegEx = new ArrayList<>(data.ignoreList().size()); - List<Integer> strictness = new ArrayList<>(data.ignoreList().size()); - List<String> ignoreRule = new ArrayList<>(data.ignoreList().size()); - for (IgnoreListManager.IgnoreListItem item : data.ignoreList()) { - scope.add(item.getScope().value); - ignoreType.add(item.getType().value); - isActive.add(item.isActive()); - scopeRule.add(item.getScopeRule()); - isRegEx.add(item.isRegEx()); - strictness.add(item.getStrictness().value); - ignoreRule.add(item.getIgnoreRule().rule()); - } - - map.put("scope", new QVariant(scope)); - map.put("ignoreType", new QVariant(ignoreType)); - map.put("isActive", new QVariant(isActive)); - map.put("scopeRule", new QVariant(scopeRule)); - map.put("isRegEx", new QVariant(isRegEx)); - map.put("strictness", new QVariant(strictness)); - map.put("ignoreRule", new QVariant(ignoreRule)); - - - return Collections.singletonMap("IgnoreList", new QVariant<>(QMetaType.Type.QVariantMap, map)); - } - - @NonNull - @Override - public IgnoreListManager fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public IgnoreListManager fromLegacy(@NonNull Map<String, QVariant> map) { - if (map.containsKey("IgnoreList")) - map = (Map<String, QVariant>) map.get("IgnoreList").data; - assertNotNull(map); - return new IgnoreListManager( - (List<Integer>) map.get("scope").data, - (List<Integer>) map.get("ignoreType").data, - (List<Boolean>) map.get("isActive").data, - (List<String>) map.get("scopeRule").data, - (List<Boolean>) map.get("isRegEx").data, - (List<Integer>) map.get("strictness").data, - (List<String>) map.get("ignoreRule").data - ); - } - - @Nullable - @Override - public IgnoreListManager from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java deleted file mode 100644 index 664358fab..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.objects.serializers.StringObjectMapSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.IrcChannel; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class IrcChannelSerializer implements ObjectSerializer<IrcChannel> { - @NonNull - private static final IrcChannelSerializer serializer = new IrcChannelSerializer(); - - private IrcChannelSerializer() { - } - - @NonNull - public static IrcChannelSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull IrcChannel data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("name", new QVariant(data.name())); - map.put("topic", new QVariant<>(data.topic())); - map.put("password", new QVariant<>(data.password())); - map.put("UserModes", new QVariant<>(StringObjectMapSerializer.<String>get().toVariantMap(data.userModes()))); - map.put("ChanModes", new QVariant<>(data.chanModes())); - map.put("encrypted", new QVariant<>(data.encrypted())); - return map; - } - - @NonNull - @Override - public IrcChannel fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public IrcChannel fromLegacy(@NonNull Map<String, QVariant> map) { - return new IrcChannel( - (String) map.get("name").data, - (String) map.get("topic").data, - (String) map.get("password").data, - StringObjectMapSerializer.<String>get().fromLegacy(((QVariant<Map<String, QVariant>>) map.get("UserModes")).data), - StringObjectMapSerializer.get().fromLegacy((Map<String, QVariant>) map.get("ChanModes").data), - (boolean) map.get("encrypted").data - ); - } - - @Override - public IrcChannel from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java deleted file mode 100644 index d65982b04..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.IrcUser; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class IrcUserSerializer implements ObjectSerializer<IrcUser> { - @NonNull - private static final IrcUserSerializer serializer = new IrcUserSerializer(); - - private IrcUserSerializer() { - } - - @NonNull - public static IrcUserSerializer get() { - return serializer; - } - - @NonNull - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull IrcUser data) { - final Map<String, QVariant<Object>> map = new HashMap<>(); - - map.put("server", new QVariant<>(data.server())); - map.put("ircOperator", new QVariant<>(data.ircOperator())); - map.put("away", new QVariant<>(data.isAway())); - map.put("lastAwayMessage", new QVariant<>(data.lastAwayMessage())); - map.put("idleTime", new QVariant<>(data.idleTime())); - map.put("whoisServiceReply", new QVariant<>(data.whoisServiceReply())); - map.put("suserHost", new QVariant<>(data.suserHost())); - map.put("nick", new QVariant<>(data.nick())); - map.put("realName", new QVariant<>(data.realName())); - map.put("account", new QVariant<>(data.account())); - map.put("awayMessage", new QVariant<>(data.awayMessage())); - map.put("loginTime", new QVariant<>(data.loginTime())); - map.put("encrypted", new QVariant<>(data.encrypted())); - map.put("channels", new QVariant<>(data.channels())); - map.put("host", new QVariant<>(data.host())); - map.put("userModes", new QVariant<>(data.userModes())); - map.put("user", new QVariant<>(data.user())); - return map; - } - - @NonNull - @Override - public IrcUser fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public IrcUser fromLegacy(@NonNull Map<String, QVariant> map) { - return new IrcUser( - (String) map.get("server").data, - (String) map.get("ircOperator").data, - (boolean) map.get("away").data, - (int) map.get("lastAwayMessage").data, - (DateTime) map.get("idleTime").data, - (String) map.get("whoisServiceReply").data, - (String) map.get("suserHost").data, - (String) map.get("nick").data, - (String) map.get("realName").data, - (map.get("account") == null) ? "" : (String) map.get("account").data, - (String) map.get("awayMessage").data, - (DateTime) map.get("loginTime").data, - (boolean) map.get("encrypted").data, - (List<String>) map.get("channels").data, - (String) map.get("host").data, - (String) map.get("userModes").data, - (String) map.get("user").data - ); - } - - @Override - public IrcUser from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java deleted file mode 100644 index ce39ca35a..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkConfigSerializer.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.NetworkConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QNetworkConfig; - -public class NetworkConfigSerializer implements ObjectSerializer<QNetworkConfig> { - @NonNull - private static final NetworkConfigSerializer serializer = new NetworkConfigSerializer(); - - private NetworkConfigSerializer() { - - } - - @NonNull - public static NetworkConfigSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull QNetworkConfig data) { - HashMap<String, QVariant<Object>> map = new HashMap<>(); - map.put("standardCtcp", new QVariant<>(data.standardCtcp())); - map.put("autoWhoEnabled", new QVariant<>(data.autoWhoEnabled())); - map.put("autoWhoDelay", new QVariant<>(data.autoWhoDelay())); - map.put("autoWhoNickLimit", new QVariant<>(data.autoWhoNickLimit())); - map.put("autoWhoInterval", new QVariant<>(data.autoWhoInterval())); - map.put("pingTimeoutEnabled", new QVariant<>(data.pingTimeoutEnabled())); - map.put("pingInterval", new QVariant<>(data.pingInterval())); - map.put("maxPingCount", new QVariant<>(data.maxPingCount())); - return map; - } - - @NonNull - @Override - public QNetworkConfig fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public QNetworkConfig fromLegacy(@NonNull Map<String, QVariant> map) { - return new NetworkConfig( - (boolean) map.get("standardCtcp").data, - (boolean) map.get("autoWhoEnabled").data, - (int) map.get("autoWhoDelay").data, - (int) map.get("autoWhoNickLimit").data, - (int) map.get("autoWhoInterval").data, - (boolean) map.get("pingTimeoutEnabled").data, - (int) map.get("pingInterval").data, - (int) map.get("maxPingCount").data - ); - } - - @Nullable - @Override - public QNetworkConfig from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkInfoSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkInfoSerializer.java deleted file mode 100644 index 144899f32..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkInfoSerializer.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class NetworkInfoSerializer implements ObjectSerializer<NetworkInfo> { - @NonNull - private static final NetworkInfoSerializer serializer = new NetworkInfoSerializer(); - - private NetworkInfoSerializer() { - - } - - @NonNull - public static NetworkInfoSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull NetworkInfo data) { - Map<String, QVariant<Object>> map = new HashMap<>(); - map.put("NetworkId", new QVariant<>("NetworkId", data.networkId())); - map.put("NetworkName", new QVariant<>(QMetaType.Type.QString, data.networkName())); - map.put("Identity", new QVariant<>("IdentityId", data.identity())); - - map.put("CodecForServer", new QVariant<>(QMetaType.Type.QByteArray, data.codecForServer())); - map.put("CodecForEncoding", new QVariant<>(QMetaType.Type.QByteArray, data.codecForEncoding())); - map.put("CodecForDecoding", new QVariant<>(QMetaType.Type.QByteArray, data.codecForDecoding())); - - map.put("ServerList", new QVariant<>(QMetaType.Type.QVariantList, data.serverList())); - map.put("UseRandomServer", new QVariant<>(QMetaType.Type.Bool, data.useRandomServer())); - - map.put("Perform", new QVariant<>(QMetaType.Type.QStringList, data.perform())); - - map.put("UseAutoIdentify", new QVariant<>(QMetaType.Type.Bool, data.useAutoIdentify())); - map.put("AutoIdentifyService", new QVariant<>(QMetaType.Type.QString, data.autoIdentifyService())); - map.put("AutoIdentifyPassword", new QVariant<>(QMetaType.Type.QString, data.autoIdentifyPassword())); - - map.put("UseSasl", new QVariant<>(QMetaType.Type.Bool, data.useSasl())); - map.put("SaslAccount", new QVariant<>(QMetaType.Type.QString, data.saslAccount())); - map.put("SaslPassword", new QVariant<>(QMetaType.Type.QString, data.saslPassword())); - - map.put("UseAutoReconnect", new QVariant<>(QMetaType.Type.Bool, data.useAutoReconnect())); - map.put("AutoReconnectInterval", new QVariant<>(QMetaType.Type.UInt, data.autoReconnectInterval())); - map.put("AutoReconnectRetries", new QVariant<>(QMetaType.Type.UShort, data.autoReconnectRetries())); - map.put("UnlimitedReconnectRetries", new QVariant<>(QMetaType.Type.Bool, data.unlimitedReconnectRetries())); - map.put("RejoinChannels", new QVariant<>(QMetaType.Type.Bool, data.rejoinChannels())); - return map; - } - - @NonNull - @Override - public NetworkInfo fromDatastream(@NonNull Map<String, QVariant> map) { - return fromLegacy(map); - } - - @NonNull - @Override - public NetworkInfo fromLegacy(@NonNull Map<String, QVariant> map) { - return new NetworkInfo( - -1, - (String) map.get("networkName").data, - (int) map.get("identityId").data, - - (String) map.get("codecForServer").data, - (String) map.get("codecForEncoding").data, - (String) map.get("codecForDecoding").data, - - (List<NetworkServer>) map.get("ServerList").data, - (boolean) map.get("useRandomServer").data, - - (List<String>) map.get("perform").data, - - (boolean) map.get("useAutoIdentify").data, - (String) map.get("autoIdentifyService").data, - (String) map.get("autoIdentifyPassword").data, - - (boolean) map.get("useSasl").data, - (String) map.get("saslAccount").data, - (String) map.get("saslPassword").data, - - (boolean) map.get("useAutoReconnect").data, - (int) map.get("autoReconnectInterval").data, - (short) map.get("autoReconnectRetries").data, - (boolean) map.get("unlimitedReconnectRetries").data, - (boolean) map.get("rejoinChannels").data - ); - } - - @Nullable - @Override - public NetworkInfo from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java deleted file mode 100644 index ed67d9c89..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.serializers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import org.joda.time.DateTime; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.functions.types.PackedFunction; -import de.kuschku.libquassel.functions.types.SerializedFunction; -import de.kuschku.libquassel.functions.types.UnpackedFunction; -import de.kuschku.libquassel.objects.serializers.ObjectSerializer; -import de.kuschku.libquassel.objects.serializers.StringObjectMapSerializer; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.impl.IrcChannel; -import de.kuschku.libquassel.syncables.types.impl.IrcUser; -import de.kuschku.libquassel.syncables.types.impl.Network; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; - -@SuppressWarnings({"unchecked", "ConstantConditions"}) -public class NetworkSerializer implements ObjectSerializer<Network> { - public static final DateTime UNIX_EPOCH = new DateTime(0L); - @NonNull - private static final NetworkSerializer serializer = new NetworkSerializer(); - - private NetworkSerializer() { - } - - @NonNull - public static NetworkSerializer get() { - return serializer; - } - - @Nullable - @Override - public Map<String, QVariant<Object>> toVariantMap(@NonNull Network data) { - // FIXME: IMPLEMENT - throw new IllegalArgumentException(); - } - - @NonNull - @Override - public Network fromDatastream(@NonNull Map<String, QVariant> map) { - final Map<String, QVariant<Map<String, QVariant<List>>>> usersAndChannels = ((Map<String, QVariant<Map<String, QVariant<List>>>>) map.get("IrcUsersAndChannels").data); - - return new Network( - extractChannels(QVariant.orNull(usersAndChannels.get("Channels"))), - extractUsers(QVariant.orNull(usersAndChannels.get("Users"))), - (List<NetworkServer>) map.get("ServerList").data, - StringObjectMapSerializer.<String>get().fromLegacy((Map<String, QVariant>) map.get("Supports").data), - (int) map.get("connectionState").data, - (String) map.get("currentServer").data, - (boolean) map.get("isConnected").data, - (int) map.get("latency").data, - (String) map.get("myNick").data, - NetworkInfoSerializer.get().fromLegacy(map) - ); - } - - @NonNull - private List<QIrcUser> extractUsers(@Nullable Map<String, QVariant<List>> users) { - final List<QIrcUser> ircUsers; - if (users == null) - ircUsers = new ArrayList<>(); - else { - final int max = users.get("server").data.size(); - ircUsers = new ArrayList<>(max); - for (int i = 0; i < max; i++) { - ircUsers.add(new IrcUser( - getAtPosition(users, "server", i, ""), - getAtPosition(users, "ircOperator", i, ""), - getAtPosition(users, "away", i, false), - getAtPosition(users, "lastAwayMessage", i, 0), - getAtPosition(users, "idleTime", i, UNIX_EPOCH), - getAtPosition(users, "whoisServiceReply", i, ""), - getAtPosition(users, "suserHost", i, ""), - getAtPosition(users, "nick", i, ""), - getAtPosition(users, "realName", i, ""), - getAtPosition(users, "account", i, ""), - getAtPosition(users, "awayMessage", i, ""), - getAtPosition(users, "loginTime", i, UNIX_EPOCH), - getAtPosition(users, "encrypted", i, false), - getAtPosition(users, "channels", i, Collections.emptyList()), - getAtPosition(users, "host", i, ""), - getAtPosition(users, "userModes", i, ""), - getAtPosition(users, "user", i, "") - )); - } - } - return ircUsers; - } - - private <T> T getAtPosition(@NonNull Map<String, QVariant<List>> users, String field, int index, T or) { - if (users.containsKey(field) && users.get(field) != null && users.get(field).data != null && users.get(field).data.size() > index) - return (T) users.get(field).data.get(index); - else - return or; - } - - @NonNull - private List<QIrcChannel> extractChannels(@Nullable Map<String, QVariant<List>> channels) { - final List<QIrcChannel> ircChannels; - if (channels == null) - ircChannels = new ArrayList<>(); - else { - final int max = channels.get("name").data.size(); - ircChannels = new ArrayList<>(max); - for (int i = 0; i < max; i++) { - ircChannels.add(new IrcChannel( - (String) channels.get("name").data.get(i), - (String) channels.get("topic").data.get(i), - (String) channels.get("password").data.get(i), - StringObjectMapSerializer.<String>get().fromLegacy((Map<String, QVariant>) channels.get("UserModes").data.get(i)), - StringObjectMapSerializer.get().fromLegacy((Map<String, QVariant>) channels.get("ChanModes").data.get(i)), - (boolean) channels.get("encrypted").data.get(i) - )); - } - } - return ircChannels; - } - - @NonNull - @Override - public Network fromLegacy(@NonNull Map<String, QVariant> map) { - final Map<String, QVariant<Map<String, QVariant<Map<String, QVariant>>>>> usersAndChannels = ((QVariant<Map<String, QVariant<Map<String, QVariant<Map<String, QVariant>>>>>>) map.get("IrcUsersAndChannels")).data; - final Map<String, QVariant<Map<String, QVariant>>> wrappedChannels = usersAndChannels.get("channels").data; - final Map<String, QVariant<Map<String, QVariant>>> wrappedUsers = usersAndChannels.get("users").data; - final List<QIrcChannel> channels = new ArrayList<>(wrappedChannels.size()); - for (Map.Entry<String, QVariant<Map<String, QVariant>>> entry : wrappedChannels.entrySet()) { - final QIrcChannel ircChannel = IrcChannelSerializer.get().fromLegacy(entry.getValue().data); - channels.add(ircChannel); - } - final List<QIrcUser> users = new ArrayList<>(wrappedUsers.size()); - for (Map.Entry<String, QVariant<Map<String, QVariant>>> entry : wrappedUsers.entrySet()) { - final QIrcUser ircUser = IrcUserSerializer.get().fromLegacy(entry.getValue().data); - users.add(ircUser); - } - final Map<String, String> supports = StringObjectMapSerializer.<String>get().fromLegacy((Map<String, QVariant>) map.get("Supports").data); - return new Network( - channels, - users, - supports, - (int) map.get("connectionState").data, - (String) map.get("currentServer").data, - (boolean) map.get("isConnected").data, - (int) map.get("latency").data, - (String) map.get("myNick").data, - NetworkInfoSerializer.get().fromLegacy(map) - ); - } - - @Override - public Network from(@NonNull SerializedFunction function) { - if (function instanceof PackedFunction) - return fromLegacy(((PackedFunction) function).getData()); - else if (function instanceof UnpackedFunction) - return fromDatastream(((UnpackedFunction) function).getData()); - else throw new IllegalArgumentException(); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java deleted file mode 100644 index 1f3b3f625..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types; - -import android.support.annotation.CallSuper; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.interfaces.QSyncableObject; -import de.kuschku.util.backports.Objects; -import de.kuschku.util.observables.callbacks.GeneralObservable; - -import static de.kuschku.util.AndroidAssert.assertNotNull; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertTrue; - -public abstract class SyncableObject<T> extends GeneralObservable<T> implements QSyncableObject<T> { - @Nullable - protected BusProvider provider; - protected Client client; - protected boolean initialized = false; - @Nullable - private String objectName; - - public void syncVar(@NonNull String methodName, @NonNull Object... params) { - sync(methodName, params); - } - - public void sync(@NonNull String methodName, @NonNull Object[] params) { - assertTrue(initialized); - assertNotNull(provider); - - provider.dispatch(new SyncFunction<>(getClassName(), getObjectName(), methodName, toVariantList(params))); - } - - public void sync(@NonNull String methodName, @NonNull String[] strings, @NonNull Object[] objects) { - assertTrue(initialized); - assertNotNull(provider); - assertEquals(strings.length, objects.length); - - List<QVariant> params = new ArrayList<>(); - for (int i = 0; i < strings.length; i++) { - params.add(new QVariant<>(strings[i], objects[i])); - } - - provider.dispatch(new SyncFunction<>(getClassName(), getObjectName(), methodName, params)); - } - - @NonNull - public String getClassName() { - return getClass().getSimpleName(); - } - - @Nullable - public String getObjectName() { - return objectName; - } - - public void setObjectName(@Nullable String objectName) { - this.objectName = objectName; - } - - public boolean initialized() { - return initialized; - } - - public void renameObject(@Nullable String objectName) { - if (!Objects.equals(this.objectName, (objectName))) - setObjectName(objectName); - } - - public void smartRpcTyped(@NonNull String procedureName, @NonNull QVariant... params) { - rpcTyped("2" + procedureName, Arrays.asList(params)); - } - - public void smartRpc(@NonNull String procedureName, @NonNull Object... params) { - rpc("2" + procedureName, params); - } - - public void rpcVar(@NonNull String procedureName, @NonNull Object... params) { - rpc(procedureName, params); - } - - public void rpcTyped(@NonNull String procedureName, @NonNull List<QVariant> params) { - assertTrue(initialized); - assertNotNull(provider); - - RpcCallFunction function = new RpcCallFunction(procedureName, params); - provider.dispatch(function); - } - - public void rpc(@NonNull String procedureName, @NonNull Object[] params) { - rpcTyped(procedureName, toVariantList(params)); - } - - @NonNull - private List<QVariant> toVariantList(@NonNull Object[] params) { - List<QVariant> list = new ArrayList<>(params.length); - for (Object element : params) { - list.add(new QVariant<>(element)); - } - return list; - } - - @CallSuper - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - this.provider = provider; - this.objectName = objectName; - this.client = client; - this.initialized = true; - } - - @SuppressWarnings("unchecked") - public void _update() { - notifyChanged((T) this); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AAliasManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AAliasManager.java deleted file mode 100644 index 06fb6a67b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AAliasManager.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QAliasManager; - -public abstract class AAliasManager extends SyncableObject<QAliasManager> implements QAliasManager { - @Override - public void addAlias(String name, String expansion) { - _addAlias(name, expansion); - syncVar("addAlias", name, expansion); - } - - @Override - public void requestUpdate(Map<String, QVariant<Object>> variantMap) { - syncVar("requestUpdate", variantMap); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java deleted file mode 100644 index 5a7e91dc0..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABacklogManager.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; - -public abstract class ABacklogManager extends SyncableObject<QBacklogManager> implements QBacklogManager { - static final String intName = QMetaType.Type.Int.getSerializableName(); - - @Override - public void requestBacklog(int id, int first, int last, int limit, int additional) { - _requestBacklog(id, first, last, limit, additional); - sync("requestBacklog", new String[]{"BufferId", "MsgId", "MsgId", intName, intName}, new Object[]{id, first, last, limit, additional}); - } - - @Override - public void receiveBacklog(int id, int first, int last, int limit, int additional, @NonNull List<Message> messages) { - _receiveBacklog(id, first, last, limit, additional, messages); - sync("receiveBacklog", new String[]{"BufferId", "MsgId", "MsgId", intName, intName}, new Object[]{id, first, last, limit, additional, messages}); - } - - @Override - public void requestBacklogAll(int first, int last, int limit, int additional) { - _requestBacklogAll(first, last, limit, additional); - sync("requestBacklogAll", new String[]{"MsgId", "MsgId", intName, intName}, new Object[]{first, last, limit, additional}); - } - - @Override - public void receiveBacklogAll(int first, int last, int limit, int additional, @NonNull List<Message> messages) { - _receiveBacklogAll(first, last, limit, additional, messages); - sync("receiveBacklogAll", new String[]{"MsgId", "MsgId", intName, intName}, new Object[]{first, last, limit, additional, messages}); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferSyncer.java deleted file mode 100644 index e2f2206d4..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferSyncer.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferSyncer; - -public abstract class ABufferSyncer extends SyncableObject<QBufferSyncer> implements QBufferSyncer { - @Override - public void requestSetLastSeenMsg(int buffer, int msgId) { - _requestSetLastSeenMsg(buffer, msgId); - sync("requestSetLastSeenMsg", new String[]{"BufferId", "MsgId"}, new Object[]{buffer, msgId}); - } - - @Override - public void requestSetMarkerLine(int buffer, int msgId) { - _requestSetMarkerLine(buffer, msgId); - sync("requestSetMarkerLine", new String[]{"BufferId", "MsgId"}, new Object[]{buffer, msgId}); - } - - @Override - public void requestRemoveBuffer(int buffer) { - _requestRemoveBuffer(buffer); - sync("requestRemoveBuffer", new String[]{"BufferId"}, new Object[]{buffer}); - } - - @Override - public void removeBuffer(int buffer) { - _removeBuffer(buffer); - requestRemoveBuffer(buffer); - } - - @Override - public void requestRenameBuffer(int buffer, String newName) { - _requestRenameBuffer(buffer, newName); - sync("requestRenameBuffer", new String[]{"BufferId", "QString"}, new Object[]{buffer, newName}); - } - - @Override - public void renameBuffer(int buffer, String newName) { - _renameBuffer(buffer, newName); - requestRenameBuffer(buffer, newName); - } - - @Override - public void requestMergeBuffersPermanently(int buffer1, int buffer2) { - _requestMergeBuffersPermanently(buffer1, buffer2); - sync("requestMergeBuffersPermanently", new String[]{"BufferId", "BufferId"}, new Object[]{buffer1, buffer2}); - } - - @Override - public void mergeBuffersPermanently(int buffer1, int buffer2) { - _mergeBuffersPermanently(buffer1, buffer2); - requestMergeBuffersPermanently(buffer1, buffer2); - } - - @Override - public void requestPurgeBufferIds() { - _requestPurgeBufferIds(); - syncVar("requestPurgeBufferIds"); - } - - @Override - public void requestMarkBufferAsRead(int buffer) { - _requestMarkBufferAsRead(buffer); - sync("requestMarkBufferAsRead", new String[]{"BufferId"}, new Object[]{buffer}); - } - - @Override - public void markBufferAsRead(int buffer) { - _markBufferAsRead(buffer); - sync("markBufferAsRead", new String[]{"BufferId"}, new Object[]{buffer}); - } - - @Override - public void setMarkerLine(int buffer, int msgId) { - _setMarkerLine(buffer, msgId); - sync("setMarkerLine", new String[]{"BufferId", "MsgId"}, new Object[]{buffer, msgId}); - } - - @Override - public void setLastSeenMsg(int buffer, int msgId) { - _setLastSeenMsg(buffer, msgId); - sync("setLastSeenMsg", new String[]{"BufferId", "MsgId"}, new Object[]{buffer, msgId}); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewConfig.java deleted file mode 100644 index 0eff25fce..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewConfig.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; - -public abstract class ABufferViewConfig extends SyncableObject<QBufferViewConfig> implements QBufferViewConfig { - static final String intName = QMetaType.Type.Int.getSerializableName(); - - @Override - public void setNetworkId(int networkId) { - _setNetworkId(networkId); - syncVar("setNetworkId", networkId); - } - - @Override - public void setAddNewBuffersAutomatically(boolean addNewBuffersAutomatically) { - _setAddNewBuffersAutomatically(addNewBuffersAutomatically); - syncVar("setAddNewBuffersAutomatically", addNewBuffersAutomatically); - } - - @Override - public void setSortAlphabetically(boolean sortAlphabetically) { - _setSortAlphabetically(sortAlphabetically); - syncVar("setSortAlphabetically", sortAlphabetically); - } - - @Override - public void setDisableDecoration(boolean disableDecoration) { - _setDisableDecoration(disableDecoration); - syncVar("setDisableDecoration", disableDecoration); - } - - @Override - public void setAllowedBufferTypes(int bufferTypes) { - _setAllowedBufferTypes(bufferTypes); - syncVar("setAllowedBufferTypes", bufferTypes); - } - - @Override - public void setMinimumActivity(MinimumActivity activity) { - _setMinimumActivity(activity); - syncVar("setMinimumActivity", activity.id); - } - - @Override - public void setHideInactiveBuffers(boolean hideInactiveBuffers) { - _setHideInactiveBuffers(hideInactiveBuffers); - syncVar("setHideInactiveBuffers", hideInactiveBuffers); - } - - @Override - public void setHideInactiveNetworks(boolean hideInactiveNetworks) { - _setHideInactiveNetworks(hideInactiveNetworks); - syncVar("setHideInactiveNetworks", hideInactiveNetworks); - } - - @Override - public void setBufferViewName(String bufferViewName) { - _setBufferViewName(bufferViewName); - requestSetBufferViewName(bufferViewName); - } - - @Override - public void requestSetBufferViewName(String bufferViewName) { - _requestSetBufferViewName(bufferViewName); - syncVar("requestSetBufferViewName", bufferViewName); - - } - - @Override - public void addBuffer(int bufferId, int pos) { - _addBuffer(bufferId, pos); - requestAddBuffer(bufferId, pos); - } - - @Override - public void requestAddBuffer(int bufferId, int pos) { - _requestAddBuffer(bufferId, pos); - sync("requestAddBuffer", new String[]{"BufferId", intName}, new Object[]{bufferId, pos}); - } - - @Override - public void moveBuffer(int bufferId, int pos) { - _moveBuffer(bufferId, pos); - requestMoveBuffer(bufferId, pos); - } - - @Override - public void requestMoveBuffer(int bufferId, int pos) { - _requestMoveBuffer(bufferId, pos); - sync("requestMoveBuffer", new String[]{"BufferId", intName}, new Object[]{bufferId, pos}); - } - - @Override - public void removeBuffer(int bufferId) { - _removeBuffer(bufferId); - requestRemoveBuffer(bufferId); - } - - @Override - public void requestRemoveBuffer(int bufferId) { - _requestRemoveBuffer(bufferId); - sync("requestRemoveBuffer", new String[]{"BufferId"}, new Object[]{bufferId}); - } - - @Override - public void removeBufferPermanently(int bufferId) { - _removeBufferPermanently(bufferId); - sync("removeBufferPermanently", new String[]{"BufferId"}, new Object[]{bufferId}); - } - - @Override - public void requestRemoveBufferPermanently(int bufferId) { - _requestRemoveBufferPermanently(bufferId); - sync("requestRemoveBufferPermanently", new String[]{"BufferId"}, new Object[]{bufferId}); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewManager.java deleted file mode 100644 index e21c23048..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ABufferViewManager.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import java.util.List; - -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; - -public abstract class ABufferViewManager extends SyncableObject<QBufferViewManager> implements QBufferViewManager { - @Override - public void createBufferView(QBufferViewConfig bufferView) { - //_addBufferViewConfig(bufferView); - syncVar("requestCreateBufferView", bufferView); - } - - @Override - public void createBufferViews(List<QBufferViewConfig> bufferViews) { - //for (QBufferViewConfig config : bufferViews) -// _addBufferViewConfig(config); - syncVar("requestCreateBufferViews", bufferViews); - } - - @Override - public void deleteBufferView(int bufferViewId) { -// _deleteBufferViewConfig(bufferViewId); - syncVar("requestDeleteBufferView", bufferViewId); - } - - @Override - public void deleteBufferViews(List<Integer> bufferViews) { -// for (int config : bufferViews) -// _deleteBufferViewConfig(config); - syncVar("requestDeleteBufferViews", bufferViews); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ACoreInfo.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ACoreInfo.java deleted file mode 100644 index d662d515f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ACoreInfo.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QCoreInfo; - -public abstract class ACoreInfo extends SyncableObject<QCoreInfo> implements QCoreInfo { - @Override - public void setCoreData(Map<String, QVariant> coreData) { - _setCoreData(coreData); - syncVar("setCoreData", coreData); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIdentity.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIdentity.java deleted file mode 100644 index 2a2897279..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIdentity.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import java.util.List; - -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.IdentitySerializer; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.impl.Identity; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; - -public abstract class AIdentity extends SyncableObject<QIdentity> implements QIdentity { - @Override - public void setId(int id) { - _setId(id); - syncVar("setId", id); - } - - @Override - public void setIdentityName(String name) { - _setIdentityName(name); - syncVar("setIdentityName", name); - } - - @Override - public void setRealName(String realName) { - _setRealName(realName); - syncVar("setRealName", realName); - } - - @Override - public void setNicks(List<String> nicks) { - _setNicks(nicks); - syncVar("setNicks", nicks); - } - - @Override - public void setAwayNick(String awayNick) { - _setAwayNick(awayNick); - syncVar("setAwayNick", awayNick); - } - - @Override - public void setAwayNickEnabled(boolean enabled) { - _setAwayNickEnabled(enabled); - syncVar("setAwayNickEnabled", enabled); - } - - @Override - public void setAwayReason(String awayReason) { - _setAwayReason(awayReason); - syncVar("setAwayReason", awayReason); - - } - - @Override - public void setAwayReasonEnabled(boolean enabled) { - _setAwayReasonEnabled(enabled); - syncVar("setAwayReasonEnabled", enabled); - } - - @Override - public void setAutoAwayEnabled(boolean enabled) { - _setAutoAwayEnabled(enabled); - syncVar("setAutoAwayEnabled", enabled); - } - - @Override - public void setAutoAwayTime(int time) { - _setAutoAwayTime(time); - syncVar("setAutoAwayTime", time); - } - - @Override - public void setAutoAwayReason(String reason) { - _setAutoAwayReason(reason); - syncVar("setAutoAwayReason", reason); - } - - @Override - public void setAutoAwayReasonEnabled(boolean enabled) { - _setAutoAwayReasonEnabled(enabled); - syncVar("setAutoAwayReasonEnabled", enabled); - } - - @Override - public void setDetachAwayEnabled(boolean enabled) { - _setDetachAwayEnabled(enabled); - syncVar("setDetachAwayEnabled", enabled); - } - - @Override - public void setDetachAwayReason(String reason) { - _setDetachAwayReason(reason); - syncVar("setDetachAwayReason", reason); - } - - @Override - public void setDetachAwayReasonEnabled(boolean enabled) { - _setDetachAwayReasonEnabled(enabled); - syncVar("setDetachAwayReasonEnabled", enabled); - } - - @Override - public void setIdent(String ident) { - _setIdent(ident); - syncVar("setIdent", ident); - } - - @Override - public void setKickReason(String reason) { - _setKickReason(reason); - syncVar("setKickReason", reason); - } - - @Override - public void setPartReason(String reason) { - _setPartReason(reason); - syncVar("setPartReason", reason); - } - - @Override - public void setQuitReason(String reason) { - _setQuitReason(reason); - syncVar("setQuitReason", reason); - - } - - @Override - public void copyFrom(QIdentity other) { - _copyFrom(other); - syncVar("copyFrom", other); - } - - @Override - public void setSslKey(String encoded) { - _setSslKey(encoded); - syncVar("setSslKey", encoded); - } - - @Override - public void setSslCert(String encoded) { - _setSslCert(encoded); - syncVar("setSslCert", encoded); - } - - @Override - public void update(Identity identity) { - _copyFrom(identity); - syncVar("update", new QVariant<>("Identity", IdentitySerializer.get().toVariantMap(identity))); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIgnoreListManager.java deleted file mode 100644 index 0219ca647..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIgnoreListManager.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public abstract class AIgnoreListManager extends SyncableObject<QIgnoreListManager> implements QIgnoreListManager { - @Override - public void removeIgnoreListItem(String ignoreRule) { - _removeIgnoreListItem(ignoreRule); - syncVar("requestRemoveIgnoreListItem", ignoreRule); - } - - @Override - public void toggleIgnoreRule(String ignoreRule) { - _toggleIgnoreRule(ignoreRule); - syncVar("requestToggleIgnoreRule", ignoreRule); - } - - @Override - public void addIgnoreListItem(int type, String ignoreRule, boolean isRegEx, int strictness, int scope, String scopeRule, boolean isActive) { - _addIgnoreListItem(type, ignoreRule, isRegEx, strictness, scope, scopeRule, isActive); - syncVar("requestAddIgnoreListItem", type, ignoreRule, isRegEx, strictness, scope, scopeRule, isActive); - } - - @Override - public void addIgnoreListItem(@NonNull IgnoreType type, String ignoreRule, boolean isRegEx, @NonNull StrictnessType strictness, @NonNull ScopeType scope, String scopeRule, boolean isActive) { - addIgnoreListItem(type.value, ignoreRule, isRegEx, strictness.value, scope.value, scopeRule, isActive); - } - - @Override - public boolean matches(Message message, QNetwork network) { - assertNotNull(network); - return match(message.content, message.sender, message.type, network.networkName(), message.bufferInfo.name) != StrictnessType.UnmatchedStrictness; - } - - @Override - public void requestUpdate(Map<String, QVariant<Object>> variantMap) { - syncVar("requestUpdate", variantMap); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java deleted file mode 100644 index 80d87586c..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcChannel.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; - -public abstract class AIrcChannel extends SyncableObject<QIrcChannel> implements QIrcChannel { - @Override - public void setTopic(String topic) { - _setTopic(topic); - syncVar("setTopic", topic); - } - - @Override - public void setPassword(String password) { - _setPassword(password); - syncVar("setPassword", password); - } - - @Override - public void setEncrypted(boolean encrypted) { - _setEncrypted(encrypted); - syncVar("setEncrypted", encrypted); - } - - @Override - public void joinIrcUsers(List<String> nicks, List<String> modes) { - _joinIrcUsers(nicks, modes); - syncVar("joinIrcUsers", nicks, modes); - } - - @Override - public void joinIrcUser(@NonNull QIrcUser ircuser) { - _joinIrcUser(ircuser); - syncVar("joinIrcUser", ircuser.nick()); - } - - @Override - public void part(@NonNull QIrcUser ircuser) { - _part(ircuser); - syncVar("part", ircuser.nick()); - } - - @Override - public void part(String nick) { - _part(nick); - syncVar("part", nick); - } - - @Override - public void setUserModes(@NonNull QIrcUser ircuser, String modes) { - _setUserModes(ircuser, modes); - syncVar("setUserModes", ircuser.nick(), modes); - } - - @Override - public void setUserModes(String nick, String modes) { - _setUserModes(nick, modes); - syncVar("setUserModes", nick, modes); - } - - @Override - public void addUserMode(@NonNull QIrcUser ircuser, String mode) { - _addUserMode(ircuser, mode); - syncVar("addUserMode", ircuser.nick(), mode); - } - - @Override - public void addUserMode(String nick, String mode) { - _addUserMode(nick, mode); - syncVar("addUserMode", nick, mode); - } - - @Override - public void removeUserMode(@NonNull QIrcUser ircuser, String mode) { - _removeUserMode(ircuser, mode); - syncVar("removeUserMode", ircuser.nick(), mode); - } - - @Override - public void removeUserMode(String nick, String mode) { - _removeUserMode(nick, mode); - syncVar("removeUserMode", nick, mode); - - } - - @Override - public void addChannelMode(char mode, String value) { - _addChannelMode(mode, value); - syncVar("addChannelMode", mode, value); - } - - @Override - public void removeChannelMode(char mode, String value) { - _removeChannelMode(mode, value); - syncVar("removeChannelMode", mode, value); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java deleted file mode 100644 index 67cef0859..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/AIrcUser.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; - -public abstract class AIrcUser extends SyncableObject<QIrcUser> implements QIrcUser { - @Override - public void setUser(String user) { - _setUser(user); - syncVar("setUser", user); - } - - @Override - public void setHost(String host) { - _setHost(host); - syncVar("setHost", host); - } - - @Override - public void setNick(String nick) { - _setNick(nick); - syncVar("setNick", nick); - } - - @Override - public void setRealName(String realName) { - _setRealName(realName); - syncVar("setRealName", realName); - } - - @Override - public void setAccount(String account) { - _setAccount(account); - syncVar("setAccount", account); - } - - @Override - public void setAway(boolean away) { - _setAway(away); - syncVar("setAway", away); - } - - @Override - public void setAwayMessage(String awayMessage) { - _setAwayMessage(awayMessage); - syncVar("setAwayMessage", awayMessage); - } - - @Override - public void setIdleTime(DateTime idleTime) { - _setIdleTime(idleTime); - syncVar("setIdleTime", idleTime); - } - - @Override - public void setLoginTime(DateTime loginTime) { - _setLoginTime(loginTime); - syncVar("setLoginTime", loginTime); - } - - @Override - public void setServer(String server) { - _setServer(server); - syncVar("setServer", server); - } - - @Override - public void setIrcOperator(String ircOperator) { - _setIrcOperator(ircOperator); - syncVar("setIrcOperator", ircOperator); - } - - @Override - public void setLastAwayMessage(int lastAwayMessage) { - _setLastAwayMessage(lastAwayMessage); - syncVar("setLastAwayMessage", lastAwayMessage); - } - - @Override - public void setWhoisServiceReply(String whoisServiceReply) { - _setWhoisServiceReply(whoisServiceReply); - syncVar("setWhoisServiceReply", whoisServiceReply); - } - - @Override - public void setSuserHost(String suserHost) { - _setSuserHost(suserHost); - syncVar("setSuserHost", suserHost); - } - - @Override - public void setEncrypted(boolean encrypted) { - _setEncrypted(encrypted); - syncVar("setEncrypted", encrypted); - } - - @Override - public void updateHostmask(String mask) { - _updateHostmask(mask); - syncVar("updateHostmask", mask); - } - - @Override - public void setUserModes(String modes) { - _setUserModes(modes); - syncVar("setUserModes", modes); - } - - @Override - public void joinChannel(@NonNull QIrcChannel channel) { - _joinChannel(channel); - syncVar("joinChannel", channel.name()); - } - - @Override - public void joinChannel(@NonNull QIrcChannel channel, boolean skip_channel_join) { - _joinChannel(channel, skip_channel_join); - syncVar("joinChannel", channel.name(), skip_channel_join); - } - - @Override - public void joinChannel(String channelname) { - _joinChannel(channelname); - syncVar("joinChannel", channelname); - } - - @Override - public void partChannel(@NonNull QIrcChannel channel) { - _partChannel(channel); - syncVar("partChannel", channel.name()); - } - - @Override - public void partChannel(String channelname) { - _partChannel(channelname); - syncVar("partChannel", channelname); - } - - @Override - public void quit() { - _quit(); - syncVar("quit"); - } - - @Override - public void addUserModes(String modes) { - _addUserModes(modes); - syncVar("addUserModes", modes); - } - - @Override - public void removeUserModes(String modes) { - _removeUserModes(modes); - syncVar("removeUserModes", modes); - } - - @Override - public void partChannel(@NonNull QIrcChannel channel, boolean skip_channel_part) { - _partChannel(channel, skip_channel_part); - syncVar("partChannel", channel.name(), skip_channel_part); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java deleted file mode 100644 index 0e75c5e03..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; - -public abstract class ANetwork extends SyncableObject<QNetwork> implements QNetwork { - @Override - public void setNetworkName(String networkName) { - _setNetworkName(networkName); - syncVar("setNetworkName", networkName); - } - - @Override - public void setCurrentServer(String currentServer) { - _setCurrentServer(currentServer); - syncVar("setCurrentServer", currentServer); - } - - @Override - public void setConnected(boolean isConnected) { - _setConnected(isConnected); - syncVar("setConnected", isConnected); - } - - @Override - public void setConnectionState(int state) { - _setConnectionState(state); - syncVar("setConnectionState", state); - } - - @Override - public void setMyNick(String mynick) { - _setMyNick(mynick); - syncVar("setMyNick", mynick); - } - - @Override - public void setLatency(int latency) { - _setLatency(latency); - syncVar("setLatency", latency); - } - - @Override - public void setIdentity(int identityId) { - _setIdentity(identityId); - syncVar("setIdentity", identityId); - } - - @Override - public void setServerList(List<NetworkServer> serverList) { - _setServerList(serverList); - syncVar("setServerList", serverList); - } - - @Override - public void setUseRandomServer(boolean useRandomServer) { - _setUseRandomServer(useRandomServer); - syncVar("setUseRandomServer", useRandomServer); - } - - @Override - public void setPerform(List<String> performs) { - _setPerform(performs); - syncVar("setPerform", performs); - } - - @Override - public void setUseAutoIdentify(boolean useAutoIdentify) { - _setUseAutoIdentify(useAutoIdentify); - syncVar("setUseAutoIdentify", useAutoIdentify); - } - - @Override - public void setAutoIdentifyService(String autoIdentifyService) { - _setAutoIdentifyService(autoIdentifyService); - syncVar("setAutoIdentifyService", autoIdentifyService); - } - - @Override - public void setAutoIdentifyPassword(String autoIdentifyPassword) { - _setAutoIdentifyPassword(autoIdentifyPassword); - syncVar("setAutoIdentifyPassword", autoIdentifyPassword); - } - - @Override - public void setUseSasl(boolean useSasl) { - _setUseSasl(useSasl); - syncVar("setUseSasl", useSasl); - } - - @Override - public void setSaslAccount(String saslAccount) { - _setSaslAccount(saslAccount); - syncVar("setSaslAccount", saslAccount); - } - - @Override - public void setSaslPassword(String saslPassword) { - _setSaslPassword(saslPassword); - syncVar("setSaslPassword", saslPassword); - } - - @Override - public void setUseAutoReconnect(boolean useAutoReconnect) { - _setUseAutoReconnect(useAutoReconnect); - syncVar("setUseAutoReconnect", useAutoReconnect); - } - - @Override - public void setAutoReconnectInterval(int autoReconnectInterval) { - _setAutoReconnectInterval(autoReconnectInterval); - syncVar("setAutoReconnectInterval", autoReconnectInterval); - } - - @Override - public void setAutoReconnectRetries(short autoReconnectRetries) { - _setAutoReconnectRetries(autoReconnectRetries); - syncVar("setAutoReconnectRetries", autoReconnectRetries); - } - - @Override - public void setUnlimitedReconnectRetries(boolean unlimitedReconnectRetries) { - _setUnlimitedReconnectRetries(unlimitedReconnectRetries); - syncVar("setUnlimitedReconnectRetries", unlimitedReconnectRetries); - } - - @Override - public void setRejoinChannels(boolean rejoinChannels) { - _setRejoinChannels(rejoinChannels); - syncVar("setRejoinChannels", rejoinChannels); - } - - @Override - public void setCodecForServer(String codecName) { - _setCodecForServer(codecName); - syncVar("setCodecForServer", codecName); - } - - @Override - public void setCodecForEncoding(String codecName) { - _setCodecForEncoding(codecName); - syncVar("setCodecForEncoding", codecName); - } - - @Override - public void setCodecForDecoding(String codecName) { - _setCodecForDecoding(codecName); - syncVar("setCodecForDecoding", codecName); - } - - @Override - public void addSupport(String param) { - _addSupport(param); - syncVar("addSupport", param); - } - - @Override - public void addSupport(String param, String value) { - _addSupport(value); - syncVar("addSupport", value); - } - - @Override - public void removeSupport(String param) { - _removeSupport(param); - syncVar("removeSupport", param); - } - - @Override - public void addIrcUser(String hostmask) { - _addIrcUser(hostmask); - syncVar("addIrcUser", hostmask); - } - - @Override - public void addIrcChannel(String channel) { - _addIrcChannel(channel); - syncVar("addIrcChannel", channel); - } - - @Override - public void connect() { - _connect(); - syncVar("connect"); - } - - @Override - public void disconnect() { - _disconnect(); - syncVar("disconnect"); - } - - @Override - public void setNetworkInfo(NetworkInfo info) { - syncVar("requestSetNetworkInfo", info); - } - - @Override - public QIrcUser updateNickFromMask(String mask) { - QIrcUser result = _updateNickFromMask(mask); - syncVar("updateNickFromMask", mask); - return result; - } - - @Override - public void setAutoAwayActive(boolean active) { - _setAutoAwayActive(active); - syncVar("setAutoAwayActive", active); - } - - @Override - public void removeChansAndUsers() { - _removeChansAndUsers(); - syncVar("removeChansAndUsers"); - } - - @Override - public void removeIrcChannel(@NonNull QIrcChannel ircChannel) { - _removeIrcChannel(ircChannel); - syncVar("removeIrcChannel", ircChannel.name()); - } - - @Override - public void removeIrcUser(@NonNull QIrcUser ircuser) { - _removeIrcUser(ircuser); - syncVar("removeIrcUser", ircuser.nick()); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetworkConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetworkConfig.java deleted file mode 100644 index a42d4723a..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetworkConfig.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.abstracts; - -import de.kuschku.libquassel.syncables.types.SyncableObject; -import de.kuschku.libquassel.syncables.types.interfaces.QNetworkConfig; - -public abstract class ANetworkConfig extends SyncableObject<QNetworkConfig> implements QNetworkConfig { - @Override - public void setPingTimeoutEnabled(boolean pingTimeoutEnabled) { - _setPingTimeoutEnabled(pingTimeoutEnabled); - requestSetPingTimeoutEnabled(pingTimeoutEnabled); - } - - @Override - public void requestSetPingTimeoutEnabled(boolean pingTimeoutEnabled) { - _requestSetPingTimeoutEnabled(pingTimeoutEnabled); - syncVar("requestSetPingTimeoutEnabled", pingTimeoutEnabled); - } - - @Override - public void setPingInterval(int pingInterval) { - _setPingInterval(pingInterval); - requestSetPingInterval(pingInterval); - } - - @Override - public void requestSetPingInterval(int pingInterval) { - _requestSetPingInterval(pingInterval); - syncVar("requestSetPingInterval", pingInterval); - } - - @Override - public void setMaxPingCount(int maxPingCount) { - _setMaxPingCount(maxPingCount); - requestSetMaxPingCount(maxPingCount); - } - - @Override - public void requestSetMaxPingCount(int maxPingCount) { - _requestSetMaxPingCount(maxPingCount); - syncVar("requestSetMaxPingCount", maxPingCount); - } - - @Override - public void setAutoWhoEnabled(boolean autoWhoEnabled) { - _setAutoWhoEnabled(autoWhoEnabled); - requestSetAutoWhoEnabled(autoWhoEnabled); - } - - @Override - public void requestSetAutoWhoEnabled(boolean autoWhoEnabled) { - _requestSetAutoWhoEnabled(autoWhoEnabled); - syncVar("requestSetAutoWhoEnabled", autoWhoEnabled); - } - - @Override - public void setAutoWhoInterval(int autoWhoInterval) { - _setAutoWhoInterval(autoWhoInterval); - requestSetAutoWhoInterval(autoWhoInterval); - } - - @Override - public void requestSetAutoWhoInterval(int autoWhoInterval) { - _requestSetAutoWhoInterval(autoWhoInterval); - syncVar("requestSetAutoWhoInterval", autoWhoInterval); - } - - @Override - public void setAutoWhoNickLimit(int autoWhoNickLimit) { - _setAutoWhoNickLimit(autoWhoNickLimit); - requestSetAutoWhoNickLimit(autoWhoNickLimit); - } - - @Override - public void requestSetAutoWhoNickLimit(int autoWhoNickLimit) { - _requestSetAutoWhoNickLimit(autoWhoNickLimit); - syncVar("requestSetAutoWhoNickLimit", autoWhoNickLimit); - } - - @Override - public void setAutoWhoDelay(int autoWhoDelay) { - _setAutoWhoDelay(autoWhoDelay); - requestSetAutoWhoDelay(autoWhoDelay); - } - - @Override - public void requestSetAutoWhoDelay(int autoWhoDelay) { - _requestSetAutoWhoDelay(autoWhoDelay); - syncVar("requestSetAutoWhoDelay", autoWhoDelay); - } - - @Override - public void setStandardCtcp(boolean standardCtcp) { - _setStandardCtcp(standardCtcp); - requestSetStandardCtcp(standardCtcp); - } - - @Override - public void requestSetStandardCtcp(boolean standardCtcp) { - _requestSetStandardCtcp(standardCtcp); - syncVar("requestSetStandardCtcp", standardCtcp); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/AliasManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/AliasManager.java deleted file mode 100644 index e5a4443ed..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/AliasManager.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; - -import com.google.common.base.Joiner; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.objects.types.Command; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.AliasManagerSerializer; -import de.kuschku.libquassel.syncables.types.abstracts.AAliasManager; -import de.kuschku.libquassel.syncables.types.interfaces.QAliasManager; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.backports.Objects; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -public class AliasManager extends AAliasManager { - @NonNull - private static final Alias[] DEFAULTS = new Alias[]{ - new Alias("j", "/join $0"), - new Alias("ns", "/msg nickserv $0"), - new Alias("nickserv", "/msg nickserv $0"), - new Alias("cs", "/msg chanserv $0"), - new Alias("chanserv", "/msg chanserv $0"), - new Alias("hs", "/msg hostserv $0"), - new Alias("hostserv", "/msg hostserv $0"), - new Alias("wii", "/whois $0 $0"), - new Alias("back", "/quote away") - }; - - private Map<String, Alias> map = new HashMap<>(); - private AndroidObservableSortedList<Alias> aliases = new AndroidObservableSortedList<>(Alias.class, new AndroidObservableSortedList.ItemComparator<Alias>() { - @Override - public int compare(Alias o1, Alias o2) { - return o1.name.compareTo(o2.name); - } - - @Override - public boolean areContentsTheSame(Alias oldItem, Alias newItem) { - return Objects.equals(oldItem.name, newItem.name); - } - - @Override - public boolean areItemsTheSame(Alias item1, Alias item2) { - return Objects.equals(item1.expansion, item2.expansion); - } - }); - - private Client client; - - public AliasManager(@NonNull List<String> names, @NonNull List<String> extensions) { - for (int i = 0; i < names.size(); i++) { - _addAlias(names.get(i), extensions.get(i)); - } - } - - @NonNull - private static List<Command> expand(@NonNull String expansion, @NonNull BufferInfo info, @NonNull QNetwork network, @NonNull String args) { - List<Command> results = new LinkedList<>(); - - Pattern paramRange = Pattern.compile("\\$(\\d+)\\.\\.(\\d*)"); - List<String> commands = Arrays.asList(expansion.split("; ?")); - List<String> params = Arrays.asList(args.split(" ")); - List<String> expandedCommands = new LinkedList<>(); - - for (int i = 0; i < commands.size(); i++) { - String command = commands.get(i); - - if (params.size() != 0) { - Matcher m = paramRange.matcher(command); - while (m.find()) { - int start = Integer.valueOf(m.group(1)); - String replacement; - // $1.. would be "arg1 and all following" - if (m.group(2).isEmpty()) { - replacement = Joiner.on(" ").join(params.subList(start, params.size())); - } else { - int end = Integer.valueOf(m.group(2)); - if (end < start) { - replacement = ""; - } else { - replacement = Joiner.on(" ").join(params.subList(start, end)); - } - } - command = command.substring(0, m.start()) + replacement + command.substring(m.end()); - } - } - - for (int j = params.size(); j > 0; j--) { - QIrcUser user = network.ircUser(params.get(j - 1)); - String host = user == null ? "*" : user.host(); - command = command.replaceAll(String.format(Locale.US, "$%d:hostname", j), host); - command = command.replaceAll(String.format(Locale.US, "$%d", j), params.get(j - 1)); - } - command = command.replace("$0", args); - command = command.replace("$channelname", info.name != null ? info.name : ""); - command = command.replace("$channel", info.name != null ? info.name : ""); - command = command.replace("$currentnick", network.myNick()); - command = command.replace("$nick", network.myNick()); - command = command.replace("$network", network.networkName()); - expandedCommands.add(command); - } - while (!expandedCommands.isEmpty()) { - String command; - if (expandedCommands.get(0).trim().toLowerCase(Locale.US).startsWith("/wait ")) { - command = Joiner.on("; ").join(expandedCommands); - expandedCommands.clear(); - } else { - command = expandedCommands.get(0); - } - results.add(new Command(info, command)); - } - return results; - } - - @Override - public boolean contains(String name) { - return map.containsKey(name.toLowerCase(Locale.US)); - } - - @Override - public boolean isEmpty() { - return aliases.isEmpty(); - } - - @Override - public int count() { - return aliases.size(); - } - - @Override - public AndroidObservableSortedList<Alias> aliases() { - return aliases; - } - - @Override - public AndroidObservableSortedList<Alias> defaults() { - map.clear(); - aliases.clear(); - for (Alias alias : DEFAULTS) { - _addAlias(alias.name, alias.expansion); - } - return aliases; - } - - @NonNull - @Override - public List<Command> processInput(@NonNull BufferInfo info, @NonNull String message) { - List<Command> list = new LinkedList<>(); - - // Escaped slash - if (message.startsWith("//")) { - // Unescape slash - list.add(new Command(info, message.substring(1))); - } else if ( - // Not a command - !message.startsWith("/") || - // Or path - (message.startsWith("/") && message.substring(1).split(" ")[0].contains("/"))) { - list.add(new Command(info, message)); - } else { - int space = message.indexOf(" "); - String command; - String args; - if (space == -1) { - command = message; - args = ""; - } else { - command = message.substring(1, space); - args = message.substring(space + 1); - } - Alias alias = map.get(command.toLowerCase(Locale.US)); - QNetwork network = client.networkManager().network(info.networkId); - if (alias != null && network != null) { - list.addAll(expand(alias.expansion, info, network, args)); - } else { - list.add(new Command(info, message)); - } - } - return list; - } - - @Override - public void _addAlias(String name, String expansion) { - Alias alias = new Alias(name, expansion); - _addAlias(alias); - _update(); - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - this.client = client; - super.init(objectName, provider, client); - client.setAliasManager(this); - _update(); - } - - @Override - public void _update(@NonNull Map<String, QVariant> from) { - _update(AliasManagerSerializer.get().fromLegacy(from)); - } - - @Override - public void _update(@NonNull QAliasManager from) { - List<Alias> toRemove = new ArrayList<>(); - for (Alias alias : aliases) { - if (!from.aliases().contains(alias)) - toRemove.add(alias); - } - for (Alias alias : toRemove) { - _removeAlias(alias); - } - for (Alias alias : from.aliases()) { - if (!aliases.contains(alias)) { - _addAlias(alias); - } - } - _update(); - } - - @Override - public void _removeAlias(Alias alias) { - aliases.remove(alias); - map.remove(alias.name); - } - - @Override - public Alias alias(String name) { - return map.get(name); - } - - - @Override - public void requestUpdate() { - requestUpdate(AliasManagerSerializer.get().toVariantMap(this)); - } - - @Override - public void _addAlias(Alias alias) { - aliases.add(alias); - map.put(alias.name, alias); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java deleted file mode 100644 index c8b713ae3..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BacklogManager.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; - -import com.raizlabs.android.dbflow.sql.language.SQLite; - -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.events.BacklogInitEvent; -import de.kuschku.libquassel.events.BacklogReceivedEvent; -import de.kuschku.libquassel.events.BufferChangeEvent; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.localtypes.BacklogFilter; -import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.message.Message_Table; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.abstracts.ABacklogManager; -import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; -import de.kuschku.util.observables.lists.AndroidObservableComparableSortedList; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class BacklogManager extends ABacklogManager { - private final Client client; - private final BacklogStorage storage; - private final Set<Integer> initialized = new HashSet<>(); - @NonNull - private final Set<Integer> waiting = new HashSet<>(); - private int waitingMax = 0; - @IntRange(from = -1) - private int openBuffer = -1; - - public BacklogManager(Client client, BacklogStorage storage) { - this.client = client; - this.storage = storage; - } - - @Override - public void requestMoreBacklog(int bufferId, int amount) { - Message last; - if (!initialized.contains(bufferId) || null == (last = storage.getUnfiltered(bufferId).last())) - requestBacklogInitial(bufferId, amount); - else { - requestBacklog(bufferId, -1, last.id, amount, 0); - } - } - - @Override - public void requestBacklogInitial(int id, int amount) { - if (waiting.contains(id) || initialized.contains(id)) - return; - - waiting.add(id); - waitingMax++; - Message lastMessageForBuffer = SQLite.select().from(Message.class).where(Message_Table.bufferInfo_id.eq(id)).orderBy(Message_Table.id, false).limit(1).querySingle(); - if (lastMessageForBuffer != null) - requestBacklog(id, lastMessageForBuffer.id, -1, amount, 1); - else - requestBacklog(id, -1, -1, amount, 1); - } - - @Override - public void _requestBacklog(int id, int first, int last, int limit, int additional) { - // Do nothing, we are on the client - } - - @Override - public void _receiveBacklog(int id, int first, int last, int limit, int additional, @NonNull List<Message> messages) { - assertNotNull(provider); - - Message lastMessageForBuffer = SQLite.select().from(Message.class).where(Message_Table.bufferInfo_id.eq(id)).orderBy(Message_Table.id, false).limit(1).querySingle(); - if (lastMessageForBuffer != null && messages.size() > 0 && messages.get(0).id > lastMessageForBuffer.id) - storage.clear(id); - storage.insertMessages(id, messages); - if (messages.size() > 0 && !client.bufferManager().exists(messages.get(0).bufferInfo)) - client.bufferManager().createBuffer(messages.get(0).bufferInfo); - provider.sendEvent(new BacklogReceivedEvent(id)); - if (id == openBuffer && openBuffer != -1) - client.bufferSyncer().requestMarkBufferAsRead(openBuffer); - removeWaiting(id); - } - - private void removeWaiting(int id) { - waiting.remove(id); - initialized.add(id); - checkWaiting(); - } - - public void checkWaiting() { - assertNotNull(provider); - - if (client.connectionStatus() == ConnectionChangeEvent.Status.LOADING_BACKLOG) { - provider.event.postSticky(new BacklogInitEvent(waitingMax - waiting.size(), waitingMax)); - if (waiting.isEmpty()) { - client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED); - } - } - } - - @Override - public void _requestBacklogAll(int first, int last, int limit, int additional) { - // Do nothing, we are on the client - } - - @Override - public void _receiveBacklogAll(int first, int last, int limit, int additional, @NonNull List<Message> messages) { - assertNotNull(provider); - - Set<Integer> buffers = new HashSet<>(); - storage.insertMessages(messages); - for (Message message : messages) { - buffers.add(message.bufferInfo.id); - } - for (int id : buffers) { - provider.sendEvent(new BacklogReceivedEvent(id)); - if (id == openBuffer && openBuffer != -1) - client.bufferSyncer().requestMarkBufferAsRead(openBuffer); - removeWaiting(id); - initialized.add(id); - } - checkWaiting(); - } - - @NonNull - @Override - public BacklogFilter filter(int id) { - return storage.getFilter(id); - } - - @NonNull - @Override - public AndroidObservableComparableSortedList<Message> unfiltered(int id) { - return storage.getUnfiltered(id); - } - - @NonNull - @Override - public AndroidObservableComparableSortedList<Message> filtered(int id) { - return storage.getFiltered(id); - } - - @Override - public void setOpen(int openBuffer) { - assertNotNull(provider); - - this.openBuffer = openBuffer; - } - - @Override - public void open(int bufferId) { - assertNotNull(provider); - - int oldBuffer = open(); - if (oldBuffer != bufferId) { - setOpen(bufferId); - if (bufferId != -1 && client.bufferSyncer() != null) - client.bufferSyncer().requestMarkBufferAsRead(bufferId); - provider.sendEvent(new BufferChangeEvent()); - client.backlogStorage().markBufferUnused(oldBuffer); - } - } - - @Override - public int open() { - return openBuffer; - } - - @Override - public void receiveBacklog(@NonNull Message msg) { - storage.insertMessages(msg); - if (msg.bufferInfo.id == openBuffer && openBuffer != -1) - client.bufferSyncer().requestMarkBufferAsRead(openBuffer); - } - - @Override - public int waitingMax() { - return waitingMax; - } - - @NonNull - @Override - public Set<Integer> waiting() { - return waiting; - } - - @Override - public void _update(Map<String, QVariant> from) { - - } - - @Override - public void _update(QBacklogManager from) { - - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java deleted file mode 100644 index 5ec3da31c..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferSyncer.java +++ /dev/null @@ -1,296 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; -import android.util.SparseArray; -import android.util.SparseIntArray; - -import java.util.HashMap; -import java.util.Map; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.BufferSyncerSerializer; -import de.kuschku.libquassel.syncables.types.abstracts.ABufferSyncer; -import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferSyncer; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.util.observables.lists.AndroidObservableComparableSortedList; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; -import de.kuschku.util.observables.lists.ObservableElement; -import de.kuschku.util.observables.lists.ObservableSet; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class BufferSyncer extends ABufferSyncer { - - @NonNull - private final SparseArray<ObservableElement<Integer>> activities = new SparseArray<>(); - @NonNull - private SparseIntArray lastSeenMsgs = new SparseIntArray(); - @NonNull - private SparseIntArray markerLines = new SparseIntArray(); - @NonNull - private Map<Integer, ObservableSet<Message.Type>> filters = new HashMap<>(); - - public BufferSyncer(@NonNull Map<Integer, Integer> lastSeenMsgs, @NonNull Map<Integer, Integer> markerLines) { - assertNotNull(lastSeenMsgs); - assertNotNull(markerLines); - - for (int bufferId : lastSeenMsgs.keySet()) { - this.lastSeenMsgs.put(bufferId, lastSeenMsgs.get(bufferId)); - } - for (int bufferId : markerLines.keySet()) { - this.markerLines.put(bufferId, markerLines.get(bufferId)); - } - } - - @Override - public int lastSeenMsg(int buffer) { - return lastSeenMsgs.get(buffer, -1); - } - - @Override - public int markerLine(int buffer) { - return markerLines.get(buffer, -1); - } - - @Override - public void _setLastSeenMsg(int buffer, int msgId) { - assertNotNull(client); - QBacklogManager backlogManager = client.backlogManager(); - assertNotNull(backlogManager); - - if (msgId < 0) - return; - - int oldLastSeenMsg = lastSeenMsg(buffer); - if (oldLastSeenMsg < msgId) { - lastSeenMsgs.put(buffer, msgId); - } - setActivity(buffer, 0); - AndroidObservableComparableSortedList<Message> filtered = backlogManager.filtered(buffer); - for (Message m : filtered) { - addActivity(m); - } - client.bufferManager().bufferIds().notifyItemChanged(buffer); - _update(); - } - - @Override - public void _setMarkerLine(int buffer, int msgId) { - if (msgId < 0) - return; - - int oldMarkerline = markerLine(buffer); - if (oldMarkerline < msgId) { - markerLines.put(buffer, msgId); - client.backlogStorage().setMarkerLine(buffer, msgId); - } - client.bufferManager().bufferIds().notifyItemChanged(buffer); - _update(); - } - - @Override - public void _requestSetLastSeenMsg(int buffer, int msgId) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _requestSetMarkerLine(int buffer, int msgId) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _requestRemoveBuffer(int buffer) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _removeBuffer(int buffer) { - assertNotNull(client); - - for (QBufferViewConfig config : client.bufferViewManager().bufferViewConfigs()) { - config.deleteBuffer(buffer); - } - this.filters.remove(buffer); - markerLines.delete(buffer); - lastSeenMsgs.delete(buffer); - client.bufferManager().removeBuffer(buffer); - _update(); - } - - @Override - public void _requestRenameBuffer(int buffer, String newName) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _renameBuffer(int bufferId, @NonNull String newName) { - assertNotNull(client); - - client.bufferManager().renameBuffer(bufferId, newName); - _update(); - } - - @Override - public void _requestMergeBuffersPermanently(int buffer1, int buffer2) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _mergeBuffersPermanently(int buffer1, int buffer2) { - client.backlogStorage().merge(buffer1, buffer2); - _removeBuffer(buffer2); - } - - @Override - public void _requestPurgeBufferIds() { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _requestMarkBufferAsRead(int buffer) { - assertNotNull(client); - - int lastMessage = client.backlogStorage().getLatest(buffer); - if (lastMessage != -1) { - requestSetLastSeenMsg(buffer, lastMessage); - } - } - - @Override - public void _markBufferAsRead(int buffer) { - assertNotNull(client); - - AndroidObservableSortedList<Message> messages = client.backlogStorage().getUnfiltered(buffer); - Message lastMessage = messages.last(); - if (messages.isEmpty() || lastMessage == null) { - _setLastSeenMsg(buffer, -1); - _setMarkerLine(buffer, -1); - } else { - _setLastSeenMsg(buffer, lastMessage.id); - _setMarkerLine(buffer, lastMessage.id); - } - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - client.setBufferSyncer(this); - } - - @Override - public void _update(@NonNull Map<String, QVariant> from) { - _update(BufferSyncerSerializer.get().fromLegacy(from)); - } - - @Override - public void _update(@NonNull QBufferSyncer from) { - lastSeenMsgs = from.lastSeenMsgs(); - markerLines = from.markerLines(); - _update(); - } - - public ObservableElement<Integer> activity(int bufferid) { - assertNotNull(activities); - ensureExistingActivity(bufferid); - - return activities.get(bufferid); - } - - public void setActivity(int bufferid, int activity) { - assertNotNull(activities); - ensureExistingActivity(bufferid); - - activities.get(bufferid).set(activity); - } - - private void ensureExistingActivity(int bufferid) { - if (activities.get(bufferid) == null) - activities.put(bufferid, new ObservableElement<>(0)); - } - - public void addActivity(int bufferid, int activity) { - assertNotNull(activities); - ensureExistingActivity(bufferid); - - activities.get(bufferid).set(activities.get(bufferid).get() | activity); - } - - public void addActivity(int bufferid, @NonNull Message.Type type) { - ensureExistingActivity(bufferid); - addActivity(bufferid, type.value); - } - - public void addActivity(@NonNull Message message) { - int bufferId = message.bufferInfo.id; - int lastSeenMsg = lastSeenMsg(bufferId); - boolean filtered = getFilteredTypes(bufferId).contains(message.type); - if (!filtered && message.id > lastSeenMsg) { - addActivity(bufferId, message.type); - } - } - - @Override - public SparseIntArray lastSeenMsgs() { - return lastSeenMsgs; - } - - @Override - public SparseIntArray markerLines() { - return markerLines; - } - - @Override - public ObservableSet<Message.Type> getFilteredTypes(int bufferId) { - if (!this.filters.containsKey(bufferId)) { - this.filters.put(bufferId, new ObservableSet<>()); - setFilters(bufferId, client.metaDataManager().hiddendata(client.coreId(), bufferId)); - } - return this.filters.get(bufferId); - } - - @Override - public int getFilters(int bufferId) { - int filters = 0x00000000; - for (Message.Type type : getFilteredTypes(bufferId)) { - filters |= type.value; - } - return filters; - } - - @Override - public void setFilters(int bufferId, int filters) { - client.metaDataManager().setHiddendata(client.coreId(), bufferId, filters); - for (Message.Type type : Message.Type.values()) { - if ((filters & type.value) != 0) { - getFilteredTypes(bufferId).add(type); - } else { - getFilteredTypes(bufferId).remove(type); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java deleted file mode 100644 index 66b05394f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java +++ /dev/null @@ -1,499 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; -import android.util.Log; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.BufferViewConfigSerializer; -import de.kuschku.libquassel.syncables.types.abstracts.ABufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.observables.lists.ObservableList; -import de.kuschku.util.observables.lists.ObservableSet; - -import static de.kuschku.libquassel.primitives.types.BufferInfo.Type; - -public class BufferViewConfig extends ABufferViewConfig { - @NonNull - private final ObservableList<Integer> buffers; - @NonNull - private final ObservableSet<Integer> visibleBufferIds; - @NonNull - private final ObservableSet<Integer> allBufferIds; - @NonNull - private final ObservableSet<Integer> removedBuffers; - @NonNull - private final ObservableSet<Integer> temporarilyRemovedBuffers; - private final ObservableSet<QNetwork> networkList = new ObservableSet<>(); - private int bufferViewId; - private String bufferViewName; - private int networkId; - private boolean addNewBuffersAutomatically; - private boolean sortAlphabetically; - private boolean disableDecoration; - private int allowedBufferTypes; - private MinimumActivity minimumActivity; - private boolean hideInactiveBuffers; - private boolean hideInactiveNetworks; - - public BufferViewConfig(String bufferViewName, @NonNull List<Integer> temporarilyRemovedBuffers, boolean hideInactiveNetworks, @NonNull List<Integer> buffers, int allowedBufferTypes, boolean sortAlphabetically, boolean disableDecoration, boolean addNewBuffersAutomatically, int networkId, MinimumActivity minimumActivity, boolean hideInactiveBuffers, @NonNull List<Integer> removedBuffers) { - this.bufferViewName = bufferViewName; - this.temporarilyRemovedBuffers = new ObservableSet<>(temporarilyRemovedBuffers); - this.hideInactiveNetworks = hideInactiveNetworks; - this.buffers = new ObservableList<>(buffers); - buffers.removeAll(removedBuffers); - buffers.removeAll(temporarilyRemovedBuffers); - this.visibleBufferIds = new ObservableSet<>(); - visibleBufferIds.addAll(buffers); - this.allBufferIds = new ObservableSet<>(); - allBufferIds.addAll(buffers); - allBufferIds.addAll(removedBuffers); - allBufferIds.addAll(temporarilyRemovedBuffers); - this.allowedBufferTypes = allowedBufferTypes; - this.sortAlphabetically = sortAlphabetically; - this.disableDecoration = disableDecoration; - this.addNewBuffersAutomatically = addNewBuffersAutomatically; - this.networkId = networkId; - this.minimumActivity = minimumActivity; - this.hideInactiveBuffers = hideInactiveBuffers; - this.removedBuffers = new ObservableSet<>(removedBuffers); - } - - @NonNull - public static BufferViewConfig create(int bufferViewConfigId) { - BufferViewConfig bufferViewConfig = new BufferViewConfig( - "", - Collections.emptyList(), - false, - Collections.emptyList(), - Type.STATUS.id | Type.QUERY.id | Type.CHANNEL.id | Type.GROUP.id, - true, - false, - true, - -1, - MinimumActivity.NONE, - false, - Collections.emptyList() - ); - bufferViewConfig.init(bufferViewConfigId); - return bufferViewConfig; - } - - @Override - public int bufferViewId() { - return bufferViewId; - } - - @Override - public String bufferViewName() { - return bufferViewName; - } - - @Override - public void _setBufferViewName(String bufferViewName) { - this.bufferViewName = bufferViewName; - _update(); - } - - @Override - public int networkId() { - return networkId; - } - - @Override - public void _setNetworkId(int networkId) { - this.networkId = networkId; - if (initialized) - updateNetworks(); - _update(); - } - - @Override - public void updateNetworks() { - if (this.networkId == 0 || this.networkId == -1) { - networkList.retainAll(client.networkManager().networks()); - networkList.addAll(client.networkManager().networks()); - } else { - networkList.retainAll(Collections.singleton(client.networkManager().network(this.networkId))); - networkList.add(client.networkManager().network(this.networkId)); - } - } - - @Override - public void checkAddBuffer(int id) { - if (!allBufferIds.contains(id)) { - Buffer buffer1 = client.bufferManager().buffer(id); - if (addNewBuffersAutomatically && buffer1 != null) { - BufferInfo info = buffer1.getInfo(); - int pos; - if (!sortAlphabetically) { - pos = visibleBufferIds.size(); - } else { - List<String> infos = new ArrayList<>(); - for (int bufferId : bufferList()) { - Buffer buffer = client.bufferManager().buffer(bufferId); - if (buffer == null) { - Log.w("libquassel", "Buffer is null: " + bufferId + " while adding buffer " + info); - } else { - BufferInfo info1 = buffer.getInfo(); - if (info1.networkId == info.networkId) - infos.add(info1.name); - } - } - infos.add(info.name); - Collections.sort(infos); - pos = infos.indexOf(info.name); - } - requestAddBuffer(info.id, pos); - } else { - requestRemoveBufferPermanently(id); - } - } - } - - @Override - public DisplayType mayDisplay(Buffer buffer) { - if (buffer != null && - (allowedBufferTypes == 0 || (0 != (buffer.getInfo().type.id & allowedBufferTypes()))) && - (networkId == 0 || (networkId == buffer.getInfo().networkId)) - ) { - int bufferid = buffer.getInfo().id; - if (visibleBufferIds.contains(bufferid) && !temporarilyRemovedBuffers.contains(bufferid) && !removedBuffers.contains(bufferid)) - return DisplayType.ALWAYS; - else if (temporarilyRemovedBuffers.contains(bufferid) && !removedBuffers.contains(bufferid)) - return DisplayType.TEMP_HIDDEN; - else - return DisplayType.PERM_HIDDEN; - } else { - return DisplayType.NONE; - } - } - - @Override - public boolean addNewBuffersAutomatically() { - return addNewBuffersAutomatically; - } - - @Override - public void _setAddNewBuffersAutomatically(boolean addNewBuffersAutomatically) { - this.addNewBuffersAutomatically = addNewBuffersAutomatically; - _update(); - } - - @Override - public boolean sortAlphabetically() { - return sortAlphabetically; - } - - @Override - public void _setSortAlphabetically(boolean sortAlphabetically) { - this.sortAlphabetically = sortAlphabetically; - _update(); - } - - @Override - public boolean disableDecoration() { - return disableDecoration; - } - - @Override - public void _setDisableDecoration(boolean disableDecoration) { - this.disableDecoration = disableDecoration; - _update(); - } - - @Override - public int allowedBufferTypes() { - return allowedBufferTypes; - } - - @Override - public boolean isBufferTypeAllowed(Type type) { - return (allowedBufferTypes & type.id) != 0; - } - - @Override - public void setBufferTypeAllowed(Type type, boolean allowed) { - int masked = allowedBufferTypes & ~type.id; - _setAllowedBufferTypes(masked | (allowed ? type.id : 0)); - } - - @Override - public void _setAllowedBufferTypes(int bufferTypes) { - this.allowedBufferTypes = bufferTypes; - _update(); - } - - @Override - public MinimumActivity minimumActivity() { - return minimumActivity; - } - - @Override - public void _setMinimumActivity(MinimumActivity activity) { - this.minimumActivity = activity; - _update(); - } - - @Override - public void _setMinimumActivity(int activity) { - _setMinimumActivity(MinimumActivity.fromId(activity)); - } - - @Override - public boolean hideInactiveBuffers() { - return hideInactiveBuffers; - } - - @Override - public void _setHideInactiveBuffers(boolean hideInactiveBuffers) { - this.hideInactiveBuffers = hideInactiveBuffers; - _update(); - } - - @Override - public boolean hideInactiveNetworks() { - return hideInactiveNetworks; - } - - @Override - public void _setHideInactiveNetworks(boolean hideInactiveNetworks) { - this.hideInactiveNetworks = hideInactiveNetworks; - _update(); - } - - @Override - public void _requestSetBufferViewName(String bufferViewName) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @NonNull - @Override - public ObservableList<Integer> bufferList() { - return buffers; - } - - @NonNull - @Override - public ObservableSet<Integer> bufferIds() { - return visibleBufferIds; - } - - @NonNull - @Override - public ObservableSet<Integer> allBufferIds() { - return allBufferIds; - } - - @Override - public void checkAddBuffers() { - for (int bufferId : client.bufferManager().bufferIds()) { - checkAddBuffer(bufferId); - } - } - - @NonNull - @Override - public ObservableSet<Integer> removedBuffers() { - return removedBuffers; - } - - @NonNull - @Override - public ObservableSet<Integer> temporarilyRemovedBuffers() { - return temporarilyRemovedBuffers; - } - - @Override - public void _addBuffer(int bufferId, int pos) { - if (client.bufferManager().buffer(bufferId) == null) { - client.bufferBuffer(this, bufferId, pos); - return; - } - - if (buffers.contains(bufferId)) - return; - - if (pos < 0) - pos = 0; - else if (pos > buffers.size()) - pos = buffers.size(); - - if (removedBuffers.contains(bufferId)) - removedBuffers.remove(bufferId); - - if (temporarilyRemovedBuffers.contains(bufferId)) - temporarilyRemovedBuffers.remove(bufferId); - - buffers.add(pos, bufferId); - visibleBufferIds.add(bufferId); - allBufferIds.add(bufferId); - } - - @Override - public void _requestAddBuffer(int bufferId, int pos) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _moveBuffer(int bufferId, int pos) { - if (!buffers.contains(bufferId)) - return; - - if (pos < 0) - pos = 0; - else if (pos >= buffers.size()) - pos = buffers.size() - 1; - - // If we want to add the buffer after the position it was before, we have to decrement the - // position by one. - // Example: Before [a, b, c, d, e] - // Now we move c to the last spot (nullindex: 4) - // First we remove c from the current position: - // [a, b, d, e] - // Now, we want to add c at the end, right? But 4 is now out of bounds. - // So we decrement pos by one to make up for the loss of the element in the beginning - if (pos > buffers.indexOf(bufferId)) - pos -= 1; - - buffers.remove(buffers.indexOf(bufferId)); - buffers.add(bufferId, pos); - _update(); - } - - @Override - public void _requestMoveBuffer(int bufferId, int pos) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _removeBuffer(int bufferId) { - visibleBufferIds.remove(bufferId); - if (buffers.contains(bufferId)) - buffers.remove((Integer) bufferId); - - if (removedBuffers.contains(bufferId)) - removedBuffers.remove(bufferId); - - temporarilyRemovedBuffers.add(bufferId); - _update(); - } - - @Override - public void _requestRemoveBuffer(int bufferId) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void _removeBufferPermanently(int bufferId) { - visibleBufferIds.remove(bufferId); - if (buffers.contains(bufferId)) - buffers.remove((Integer) bufferId); - - if (temporarilyRemovedBuffers.contains(bufferId)) - temporarilyRemovedBuffers.remove(bufferId); - - removedBuffers.add(bufferId); - _update(); - } - - @Override - public void _requestRemoveBufferPermanently(int bufferId) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - bufferViewId = Integer.parseInt(objectName); - super.init(objectName, provider, client); - client.bufferViewManager()._addBufferViewConfig(this); - updateNetworks(); - checkAddBuffers(); - _update(); - } - - @Override - public void init(int bufferViewConfigId) { - bufferViewId = bufferViewConfigId; - } - - @Override - public ObservableSet<QNetwork> networkList() { - return networkList; - } - - @Override - public void deleteBuffer(int bufferId) { - visibleBufferIds.remove(bufferId); - allBufferIds.remove(bufferId); - buffers.remove((Integer) bufferId); - temporarilyRemovedBuffers.remove(bufferId); - removedBuffers.remove(bufferId); - } - - @Override - public void _update(@NonNull Map<String, QVariant> from) { - _update(BufferViewConfigSerializer.get().fromLegacy(from)); - } - - @Override - public void _update(@NonNull QBufferViewConfig from) { - this.bufferViewId = from.bufferViewId(); - this.bufferViewName = from.bufferViewName(); - this.networkId = from.networkId(); - this.addNewBuffersAutomatically = from.addNewBuffersAutomatically(); - this.sortAlphabetically = from.sortAlphabetically(); - this.disableDecoration = from.disableDecoration(); - this.allowedBufferTypes = from.allowedBufferTypes(); - this.minimumActivity = from.minimumActivity(); - this.hideInactiveBuffers = from.hideInactiveBuffers(); - this.hideInactiveNetworks = from.hideInactiveNetworks(); - this.buffers.clear(); - this.buffers.addAll(from.bufferList()); - this.visibleBufferIds.retainAll(from.bufferIds()); - this.visibleBufferIds.addAll(from.bufferIds()); - this.removedBuffers.retainAll(from.removedBuffers()); - this.removedBuffers.addAll(from.removedBuffers()); - this.temporarilyRemovedBuffers.retainAll(from.temporarilyRemovedBuffers()); - this.temporarilyRemovedBuffers.addAll(from.temporarilyRemovedBuffers()); - _update(); - } - - @Override - public String toString() { - return "BufferViewConfig{" + - "bufferViewId=" + bufferViewId + - ", bufferViewName='" + bufferViewName + '\'' + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java deleted file mode 100644 index 5cf8fe429..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewManager.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.abstracts.ABufferViewManager; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; -import de.kuschku.util.observables.callbacks.GeneralCallback; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -public class BufferViewManager extends ABufferViewManager { - @NonNull - final - Set<Integer> cachedIds = new HashSet<>(); - final AndroidObservableSortedList<QBufferViewConfig> list = new AndroidObservableSortedList<>(QBufferViewConfig.class, new AndroidObservableSortedList.ItemComparator<QBufferViewConfig>() { - @Override - public int compare(QBufferViewConfig o1, QBufferViewConfig o2) { - return o1.bufferViewName().compareToIgnoreCase(o2.bufferViewName()); - } - - @Override - public boolean areContentsTheSame(QBufferViewConfig oldItem, QBufferViewConfig newItem) { - return oldItem.bufferViewName().equals(newItem.bufferViewName()); - } - - @Override - public boolean areItemsTheSame(QBufferViewConfig item1, QBufferViewConfig item2) { - return item1.bufferViewId() == item2.bufferViewId(); - } - }); - private final GeneralCallback<QBufferViewConfig> observer = config -> list.notifyItemChanged(list.indexOf(config)); - Map<Integer, QBufferViewConfig> bufferViewConfigs = new HashMap<>(); - - public BufferViewManager(@NonNull List<Integer> bufferViewIds) { - cachedIds.addAll(bufferViewIds); - } - - @NonNull - @Override - public AndroidObservableSortedList<QBufferViewConfig> bufferViewConfigs() { - return list; - } - - @Override - public QBufferViewConfig bufferViewConfig(int bufferViewId) { - return bufferViewConfigs.get(bufferViewId); - } - - public void _addBufferViewConfig(@NonNull QBufferViewConfig config) { - if (!bufferViewConfigs.containsValue(config)) { - QBufferViewConfig before = bufferViewConfigs.get(config.bufferViewId()); - if (before != null) - list.remove(before); - - bufferViewConfigs.put(config.bufferViewId(), config); - config.init(String.valueOf(config.bufferViewId()), provider, client); - list.add(config); - config.addObserver(observer); - _update(); - } - } - - @Override - public void _addBufferViewConfig(int bufferViewConfigId) { - if (bufferViewConfigs.containsKey(bufferViewConfigId)) - return; - - BufferViewConfig config = BufferViewConfig.create(bufferViewConfigId); - _addBufferViewConfig(config); - client.requestInitObject("BufferViewConfig", String.valueOf(bufferViewConfigId)); - _update(); - } - - @Override - public void _deleteBufferViewConfig(int bufferViewConfigId) { - if (!bufferViewConfigs.containsKey(bufferViewConfigId)) - return; - - QBufferViewConfig config = bufferViewConfigs.remove(bufferViewConfigId); - config.deleteObserver(observer); - list.remove(config); - _update(); - } - - @Override - public void checkForNewBuffers(int bufferId) { - for (QBufferViewConfig config : bufferViewConfigs()) { - config.checkAddBuffer(bufferId); - } - } - - @Override - public Map<Integer, QBufferViewConfig> bufferViewConfigMap() { - return bufferViewConfigs; - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - for (int id : cachedIds) { - client.requestInitObject("BufferViewConfig", String.valueOf(id)); - } - client.setBufferViewManager(this); - } - - @Override - public void _update(Map<String, QVariant> from) { - - } - - @Override - public void _update(@NonNull QBufferViewManager from) { - this.bufferViewConfigs = from.bufferViewConfigMap(); - this.list.retainAll(from.bufferViewConfigs()); - this.list.addAll(from.bufferViewConfigs()); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/CoreInfo.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/CoreInfo.java deleted file mode 100644 index 97160a8e3..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/CoreInfo.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -import java.util.Map; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.abstracts.ACoreInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QCoreInfo; - -public class CoreInfo extends ACoreInfo { - private Map<String, QVariant> coreData; - - private int sessionConnectedClients; - - private String quasselVersion; - - private String quasselBuildDate; - - private DateTime startTime; - - public CoreInfo(Map<String, QVariant> coreData) { - _setCoreData(coreData); - } - - @Override - public Map<String, QVariant> coreData() { - return coreData; - } - - @Override - public void _setCoreData(Map<String, QVariant> coreData) { - this.coreData = coreData; - - QVariant sessionConnectedClients1 = coreData.remove("sessionConnectedClients"); - this.sessionConnectedClients = sessionConnectedClients1 != null ? (int) sessionConnectedClients1.data : -1; - - QVariant quasselVersion1 = coreData.remove("quasselVersion"); - this.quasselVersion = quasselVersion1 != null ? (String) quasselVersion1.data : null; - - QVariant quasselBuildDate1 = coreData.remove("quasselBuildDate"); - this.quasselBuildDate = quasselBuildDate1 != null ? (String) quasselBuildDate1.data : null; - - QVariant startTime1 = coreData.remove("startTime"); - this.startTime = startTime1 != null ? (DateTime) startTime1.data : null; - - _update(); - } - - @Override - public void _update(Map<String, QVariant> from) { - - } - - @Override - public void _update(QCoreInfo from) { - - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - client.setCoreInfo(this); - } - - public int sessionConnectedClients() { - return sessionConnectedClients; - } - - public String quasselVersion() { - return quasselVersion; - } - - public String quasselBuildDate() { - return quasselBuildDate; - } - - public DateTime startTime() { - return startTime; - } - - @Override - public String toString() { - return "CoreInfo{" + - "sessionConnectedClients=" + sessionConnectedClients + - ", quasselVersion='" + quasselVersion + '\'' + - ", quasselBuildDate='" + quasselBuildDate + '\'' + - ", startTime=" + startTime + - ", coreData=" + coreData + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java deleted file mode 100644 index e09ce649c..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Identity.java +++ /dev/null @@ -1,484 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.IdentitySerializer; -import de.kuschku.libquassel.syncables.types.abstracts.AIdentity; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; - -public class Identity extends AIdentity { - private int id; - private String name; - private String realName; - private List<String> nicks; - private String awayNick; - private boolean awayNickEnabled; - private String awayReason; - private boolean awayReasonEnabled; - private boolean autoAwayEnabled; - private int autoAwayTime; - private String autoAwayReason; - private boolean autoAwayReasonEnabled; - private boolean detachAwayEnabled; - private String detachAwayReason; - private boolean detachAwayReasonEnabled; - private String ident; - private String kickReason; - private String partReason; - private String quitReason; - private String sslKey; - private String sslCert; - - public Identity(int id, String name, String realName, List<String> nicks, String awayNick, boolean awayNickEnabled, String awayReason, boolean awayReasonEnabled, boolean autoAwayEnabled, int autoAwayTime, String autoAwayReason, boolean autoAwayReasonEnabled, boolean detachAwayEnabled, String detachAwayReason, boolean detachAwayReasonEnabled, String ident, String kickReason, String partReason, String quitReason) { - this.id = id; - this.name = name; - this.realName = realName; - this.nicks = nicks; - this.awayNick = awayNick; - this.awayNickEnabled = awayNickEnabled; - this.awayReason = awayReason; - this.awayReasonEnabled = awayReasonEnabled; - this.autoAwayEnabled = autoAwayEnabled; - this.autoAwayTime = autoAwayTime; - this.autoAwayReason = autoAwayReason; - this.autoAwayReasonEnabled = autoAwayReasonEnabled; - this.detachAwayEnabled = detachAwayEnabled; - this.detachAwayReason = detachAwayReason; - this.detachAwayReasonEnabled = detachAwayReasonEnabled; - this.ident = ident; - this.kickReason = kickReason; - this.partReason = partReason; - this.quitReason = quitReason; - } - - public static Identity createDefault() { - return new Identity( - -1, - "Standardidentity", - "Quassel IRC User", - Collections.singletonList("quassel"), - "", - false, - "Gone fishing.", - true, - false, - 10, - "Not here. No, really. not here!", - false, - false, - "All Quassel clients vanished from the face of the earth...", - false, - "quassel", - "Kindergarten is elsewhere!", - "http://quassel-irc.org - Chat comfortably. Anywhere.", - "http://quassel-irc.org - Chat comfortably. Anywhere." - ); - } - - @Override - public void setToDefaults() { - setIdentityName(""); - setRealName("Quassel IRC User"); - setNicks(Collections.singletonList("quassel")); - setAwayNick(""); - setAwayNickEnabled(false); - setAwayReason("Gone fishing."); - setAwayReasonEnabled(true); - setAutoAwayEnabled(false); - setAutoAwayTime(10); - setAutoAwayReason("Not here. No, really. not here!"); - setAutoAwayReasonEnabled(false); - setDetachAwayEnabled(false); - setDetachAwayReason("All Quassel clients vanished from the face of the earth..."); - setDetachAwayReasonEnabled(false); - setIdent("quassel"); - setKickReason("Kindergarten is elsewhere!"); - setPartReason("http://quassel-irc.org - Chat comfortably. Anywhere."); - setQuitReason("http://quassel-irc.org - Chat comfortably. Anywhere."); - } - - @Override - public boolean isValid() { - return false; - } - - @Override - public int id() { - return id; - } - - @Override - public String identityName() { - return name; - } - - @Override - public String realName() { - return realName; - } - - @Override - public List<String> nicks() { - return nicks; - } - - @Override - public String awayNick() { - return awayNick; - } - - @Override - public boolean awayNickEnabled() { - return awayNickEnabled; - } - - @Override - public String awayReason() { - return awayReason; - } - - @Override - public boolean awayReasonEnabled() { - return awayReasonEnabled; - } - - @Override - public boolean autoAwayEnabled() { - return autoAwayEnabled; - } - - @Override - public int autoAwayTime() { - return autoAwayTime; - } - - @Override - public String autoAwayReason() { - return autoAwayReason; - } - - @Override - public boolean autoAwayReasonEnabled() { - return autoAwayReasonEnabled; - } - - @Override - public boolean detachAwayEnabled() { - return detachAwayEnabled; - } - - @Override - public String detachAwayReason() { - return detachAwayReason; - } - - @Override - public boolean detachAwayReasonEnabled() { - return detachAwayReasonEnabled; - } - - @Override - public String ident() { - return ident; - } - - @Override - public String kickReason() { - return kickReason; - } - - @Override - public String partReason() { - return partReason; - } - - @Override - public String quitReason() { - return quitReason; - } - - @Override - public void _setId(int id) { - this.id = id; - _update(); - } - - @Override - public void _setIdentityName(String name) { - this.name = name; - _update(); - } - - @Override - public void _setRealName(String realName) { - this.realName = realName; - _update(); - } - - @Override - public void _setNicks(List<String> nicks) { - this.nicks = nicks; - _update(); - } - - @Override - public void _setAwayNick(String awayNick) { - this.awayNick = awayNick; - _update(); - } - - @Override - public void _setAwayNickEnabled(boolean enabled) { - this.awayNickEnabled = enabled; - _update(); - } - - @Override - public void _setAwayReason(String awayReason) { - this.awayReason = awayReason; - _update(); - } - - @Override - public void _setAwayReasonEnabled(boolean enabled) { - this.awayReasonEnabled = enabled; - _update(); - } - - @Override - public void _setAutoAwayEnabled(boolean enabled) { - this.autoAwayEnabled = enabled; - _update(); - } - - @Override - public void _setAutoAwayTime(int time) { - this.autoAwayTime = time; - _update(); - } - - @Override - public void _setAutoAwayReason(String reason) { - this.autoAwayReason = reason; - _update(); - } - - @Override - public void _setAutoAwayReasonEnabled(boolean enabled) { - this.autoAwayReasonEnabled = enabled; - _update(); - } - - @Override - public void _setDetachAwayEnabled(boolean enabled) { - this.detachAwayEnabled = enabled; - _update(); - } - - @Override - public void _setDetachAwayReason(String reason) { - this.detachAwayReason = reason; - _update(); - } - - @Override - public void _setDetachAwayReasonEnabled(boolean enabled) { - this.detachAwayReasonEnabled = enabled; - _update(); - } - - @Override - public void _setIdent(String ident) { - this.ident = ident; - _update(); - } - - @Override - public void _setKickReason(String reason) { - this.kickReason = reason; - _update(); - } - - @Override - public void _setPartReason(String reason) { - this.partReason = reason; - _update(); - } - - @Override - public void _setQuitReason(String reason) { - this.quitReason = reason; - _update(); - } - - @Override - public void _copyFrom(@NonNull QIdentity other) { - this.id = other.id(); - this.name = other.identityName(); - this.realName = other.realName(); - this.nicks = other.nicks(); - this.awayNick = other.awayNick(); - this.awayNickEnabled = other.awayNickEnabled(); - this.awayReason = other.awayReason(); - this.awayReasonEnabled = other.awayReasonEnabled(); - this.autoAwayEnabled = other.autoAwayEnabled(); - this.autoAwayTime = other.autoAwayTime(); - this.autoAwayReason = other.autoAwayReason(); - this.autoAwayReasonEnabled = other.autoAwayReasonEnabled(); - this.detachAwayEnabled = other.detachAwayEnabled(); - this.detachAwayReason = other.detachAwayReason(); - this.detachAwayReasonEnabled = other.detachAwayReasonEnabled(); - this.ident = other.ident(); - this.kickReason = other.kickReason(); - this.partReason = other.partReason(); - this.quitReason = other.quitReason(); - this.sslKey = other.sslKey(); - this.sslCert = other.sslCert(); - _update(); - } - - @Override - public String sslKey() { - return sslKey; - } - - @Nullable - @Override - public String sslKeyPem() { - return null; - } - - @Override - public String sslCert() { - return sslCert; - } - - @Nullable - @Override - public String sslCertPem() { - return null; - } - - @Override - public void _setSslKey(String encoded) { - this.sslKey = encoded; - _update(); - } - - @Override - public void _setSslCert(String encoded) { - this.sslCert = encoded; - _update(); - } - - @Override - public void _update(Map<String, QVariant> from) { - _copyFrom(IdentitySerializer.get().fromDatastream(from)); - } - - @Override - public void _update(QIdentity from) { - _copyFrom(from); - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - client.identityManager().createIdentity(this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Identity)) return false; - - Identity identity = (Identity) o; - - if (id != identity.id) return false; - if (awayNickEnabled != identity.awayNickEnabled) return false; - if (awayReasonEnabled != identity.awayReasonEnabled) return false; - if (autoAwayEnabled != identity.autoAwayEnabled) return false; - if (autoAwayTime != identity.autoAwayTime) return false; - if (autoAwayReasonEnabled != identity.autoAwayReasonEnabled) return false; - if (detachAwayEnabled != identity.detachAwayEnabled) return false; - if (detachAwayReasonEnabled != identity.detachAwayReasonEnabled) return false; - if (name != null ? !name.equals(identity.name) : identity.name != null) return false; - if (realName != null ? !realName.equals(identity.realName) : identity.realName != null) - return false; - if (nicks != null ? !nicks.equals(identity.nicks) : identity.nicks != null) return false; - if (awayNick != null ? !awayNick.equals(identity.awayNick) : identity.awayNick != null) - return false; - if (awayReason != null ? !awayReason.equals(identity.awayReason) : identity.awayReason != null) - return false; - if (autoAwayReason != null ? !autoAwayReason.equals(identity.autoAwayReason) : identity.autoAwayReason != null) - return false; - if (detachAwayReason != null ? !detachAwayReason.equals(identity.detachAwayReason) : identity.detachAwayReason != null) - return false; - if (ident != null ? !ident.equals(identity.ident) : identity.ident != null) return false; - if (kickReason != null ? !kickReason.equals(identity.kickReason) : identity.kickReason != null) - return false; - if (partReason != null ? !partReason.equals(identity.partReason) : identity.partReason != null) - return false; - if (quitReason != null ? !quitReason.equals(identity.quitReason) : identity.quitReason != null) - return false; - if (sslKey != null ? !sslKey.equals(identity.sslKey) : identity.sslKey != null) - return false; - return sslCert != null ? sslCert.equals(identity.sslCert) : identity.sslCert == null; - - } - - @Override - public int hashCode() { - int result = id; - result = 31 * result + (name != null ? name.hashCode() : 0); - result = 31 * result + (realName != null ? realName.hashCode() : 0); - result = 31 * result + (nicks != null ? nicks.hashCode() : 0); - result = 31 * result + (awayNick != null ? awayNick.hashCode() : 0); - result = 31 * result + (awayNickEnabled ? 1 : 0); - result = 31 * result + (awayReason != null ? awayReason.hashCode() : 0); - result = 31 * result + (awayReasonEnabled ? 1 : 0); - result = 31 * result + (autoAwayEnabled ? 1 : 0); - result = 31 * result + autoAwayTime; - result = 31 * result + (autoAwayReason != null ? autoAwayReason.hashCode() : 0); - result = 31 * result + (autoAwayReasonEnabled ? 1 : 0); - result = 31 * result + (detachAwayEnabled ? 1 : 0); - result = 31 * result + (detachAwayReason != null ? detachAwayReason.hashCode() : 0); - result = 31 * result + (detachAwayReasonEnabled ? 1 : 0); - result = 31 * result + (ident != null ? ident.hashCode() : 0); - result = 31 * result + (kickReason != null ? kickReason.hashCode() : 0); - result = 31 * result + (partReason != null ? partReason.hashCode() : 0); - result = 31 * result + (quitReason != null ? quitReason.hashCode() : 0); - result = 31 * result + (sslKey != null ? sslKey.hashCode() : 0); - result = 31 * result + (sslCert != null ? sslCert.hashCode() : 0); - return result; - } -} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java deleted file mode 100644 index fe1274855..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java +++ /dev/null @@ -1,332 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.localtypes.BacklogFilter; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.IgnoreListManagerSerializer; -import de.kuschku.libquassel.syncables.types.abstracts.AIgnoreListManager; -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; -import de.kuschku.util.regex.SmartRegEx; - -import static de.kuschku.util.AndroidAssert.assertEquals; - -public class IgnoreListManager extends AIgnoreListManager { - @NonNull - private final AndroidObservableSortedList<IgnoreListItem> ignoreList = new AndroidObservableSortedList<>(IgnoreListItem.class, new AndroidObservableSortedList.ItemComparator<IgnoreListItem>() { - @Override - public int compare(IgnoreListItem o1, IgnoreListItem o2) { - return o1.ignoreRule.rule().compareTo(o2.ignoreRule.rule()); - } - - @Override - public boolean areContentsTheSame(IgnoreListItem oldItem, IgnoreListItem newItem) { - return oldItem.equals(newItem); - } - - @Override - public boolean areItemsTheSame(IgnoreListItem item1, IgnoreListItem item2) { - return item1.ignoreRule.rule().equals(item2.ignoreRule.rule()); - } - }); - - - public IgnoreListManager(@NonNull List<Integer> scope, @NonNull List<Integer> ignoreType, - @NonNull List<Boolean> isActive, @NonNull List<String> scopeRule, @NonNull List<Boolean> isRegEx, - @NonNull List<Integer> strictness, @NonNull List<String> ignoreRule) { - assertEquals(scope.size(), ignoreType.size(), isActive.size(), scopeRule.size(), isRegEx.size(), strictness.size(), ignoreRule.size()); - - for (int i = 0; i < scope.size(); i++) { - ignoreList.add(new IgnoreListItem( - ignoreType.get(i), - ignoreRule.get(i), - isRegEx.get(i), - strictness.get(i), - scope.get(i), - scopeRule.get(i), - isActive.get(i) - )); - } - } - - @Override - public void _removeIgnoreListItem(String ignoreRule) { - ignoreList.remove(indexOf(ignoreRule)); - _update(); - } - - private int indexOf(String ignoreRule) { - for (int i = 0; i < ignoreList.size(); i++) { - if (ignoreList.get(i).ignoreRule.rule().equals(ignoreRule)) - return i; - } - return -1; - } - - @Override - public void _toggleIgnoreRule(String ignoreRule) { - IgnoreListItem item = ignoreList.get(indexOf(ignoreRule)); - item.isActive = !item.isActive; - _update(); - } - - @Override - public void _addIgnoreListItem(int type, @NonNull String ignoreRule, boolean isRegEx, int strictness, int scope, @NonNull String scopeRule, boolean isActive) { - if (contains(ignoreRule)) - return; - - ignoreList.add(new IgnoreListItem(type, ignoreRule, isRegEx, strictness, scope, scopeRule, isActive)); - _update(); - } - - @Override - public void _addIgnoreListItem(IgnoreListItem item) { - if (contains(item.ignoreRule.rule())) - return; - - ignoreList.add(item); - _update(); - } - - private boolean contains(String ignoreRule) { - return indexOf(ignoreRule) != -1; - } - - @Override - public StrictnessType match(String msgContents, String msgSender, Message.Type msgType, @NonNull String network, @NonNull String bufferName) { - if (msgType == Message.Type.Plain || msgType == Message.Type.Notice || msgType == Message.Type.Action) { - for (IgnoreListItem item : ignoreList) { - if (!item.isActive || item.type == IgnoreType.CtcpIgnore) - continue; - - if (item.scopeMatch(network, bufferName)) { - String str; - if (item.type == IgnoreType.MessageIgnore) - str = msgContents; - else - str = msgSender; - - if (item.matches(str)) - return item.strictness; - } - } - } - return StrictnessType.UnmatchedStrictness; - } - - @Override - public void _update(@NonNull Map<String, QVariant> from) { - _update(IgnoreListManagerSerializer.get().fromDatastream(from)); - } - - @Override - public void _update(QIgnoreListManager from) { - this.ignoreList.retainAll(from.ignoreList()); - this.ignoreList.addAll(from.ignoreList()); - this._update(); - } - - @Override - public void _update() { - super._update(); - synchronized (client.backlogStorage().getFilters()) { - for (BacklogFilter filter : client.backlogStorage().getFilters()) { - filter.update(); - } - } - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - client.setIgnoreListManager(this); - } - - @Override - public String toString() { - return String.valueOf(ignoreList); - } - - @Override - public void requestUpdate() { - requestUpdate(IgnoreListManagerSerializer.get().toVariantMap(this)); - } - - @Override - public AndroidObservableSortedList<? extends IgnoreListItem> ignoreList() { - return ignoreList; - } - - @Override - public void _toggleIgnoreRule(IgnoreListItem ignoreRule, boolean active) { - ignoreRule.isActive = active; - } - - public static class IgnoreListItem { - private final IgnoreType type; - @NonNull - private final SmartRegEx ignoreRule; - private final boolean isRegEx; - private final StrictnessType strictness; - private final ScopeType scope; - @NonNull - private final SmartRegEx[] scopeRules; - private final String scopeRule; - private boolean isActive; - - public IgnoreListItem(int type, @Nullable String ignoreRule, boolean isRegEx, int strictness, int scope, @Nullable String scopeRule, boolean isActive) { - this(IgnoreType.of(type), ignoreRule, isRegEx, StrictnessType.of(strictness), ScopeType.of(scope), scopeRule, isActive); - } - - public IgnoreListItem(IgnoreType type, @Nullable String ignoreRule, boolean isRegEx, StrictnessType strictness, ScopeType scope, @Nullable String scopeRule, boolean isActive) { - if (scopeRule == null) - scopeRule = ""; - if (ignoreRule == null) - ignoreRule = ""; - - this.type = type; - this.ignoreRule = new SmartRegEx(ignoreRule, Pattern.CASE_INSENSITIVE, SmartRegEx.Syntax.WILDCARD); - this.isRegEx = isRegEx; - this.strictness = strictness; - this.scope = scope; - this.isActive = isActive; - - String[] scopeRules = scopeRule.split(";"); - this.scopeRule = scopeRule; - this.scopeRules = new SmartRegEx[scopeRules.length]; - for (int i = 0; i < scopeRules.length; i++) { - this.scopeRules[i] = new SmartRegEx(scopeRules[i].trim(), Pattern.CASE_INSENSITIVE, SmartRegEx.Syntax.WILDCARD); - } - } - - public IgnoreType getType() { - return type; - } - - @NonNull - public SmartRegEx getIgnoreRule() { - return ignoreRule; - } - - public boolean isRegEx() { - return isRegEx; - } - - public StrictnessType getStrictness() { - return strictness; - } - - public ScopeType getScope() { - return scope; - } - - @NonNull - public String getScopeRule() { - return scopeRule; - } - - public boolean isActive() { - return isActive; - } - - public boolean matches(@NonNull String text) { - return ignoreRule.matches(text, !isRegEx); - } - - private boolean scopeMatch(@NonNull String network, @NonNull String bufferName) { - switch (scope) { - case NetworkScope: - return scopeMatch(network); - case ChannelScope: - return scopeMatch(bufferName); - default: - case GlobalScope: - return true; - } - } - - private boolean scopeMatch(@NonNull String scope) { - for (SmartRegEx scopeRule : scopeRules) { - if (scopeRule.matches(scope, !isRegEx)) - return true; - } - return false; - } - - @Override - public String toString() { - return "IgnoreListItem{" + - "type=" + type + - ", ignoreRule=" + ignoreRule + - ", isRegEx=" + isRegEx + - ", strictness=" + strictness + - ", scope=" + scope + - ", scopeRules=" + Arrays.toString(scopeRules) + - ", isActive=" + isActive + - '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof IgnoreListItem)) return false; - - IgnoreListItem item = (IgnoreListItem) o; - - if (isRegEx() != item.isRegEx()) return false; - if (isActive() != item.isActive()) return false; - if (getType() != item.getType()) return false; - if (!getIgnoreRule().equals(item.getIgnoreRule())) return false; - if (getStrictness() != item.getStrictness()) return false; - if (getScope() != item.getScope()) return false; - // Probably incorrect - comparing Object[] arrays with Arrays.equals - if (!Arrays.equals(scopeRules, item.scopeRules)) return false; - return getScopeRule() != null ? getScopeRule().equals(item.getScopeRule()) : item.getScopeRule() == null; - - } - - @Override - public int hashCode() { - int result = getType() != null ? getType().hashCode() : 0; - result = 31 * result + getIgnoreRule().hashCode(); - result = 31 * result + (isRegEx() ? 1 : 0); - result = 31 * result + (getStrictness() != null ? getStrictness().hashCode() : 0); - result = 31 * result + (getScope() != null ? getScope().hashCode() : 0); - result = 31 * result + Arrays.hashCode(scopeRules); - result = 31 * result + (getScopeRule() != null ? getScopeRule().hashCode() : 0); - result = 31 * result + (isActive() ? 1 : 0); - return result; - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java deleted file mode 100644 index aea9713ec..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java +++ /dev/null @@ -1,561 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.google.common.base.Joiner; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.serializers.IrcChannelSerializer; -import de.kuschku.libquassel.syncables.types.abstracts.AIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.irc.ModeUtils; -import de.kuschku.util.observables.lists.ObservableSortedList; - -import static de.kuschku.util.AndroidAssert.assertEquals; - -public class IrcChannel extends AIrcChannel { - @NonNull - public final Map<Character, List<String>> A_channelModes = new HashMap<>(); - @NonNull - public final Map<Character, String> B_channelModes = new HashMap<>(); - @NonNull - public final Map<Character, String> C_channelModes = new HashMap<>(); - private final String name; - @NonNull - private final Map<String, Set<Character>> userModes = new HashMap<>(); - @NonNull - public Set<Character> D_channelModes = new HashSet<>(); - private String topic; - private String password; - private boolean encrypted; - private WeakReference<QNetwork> network = new WeakReference<>(null); - private final ObservableSortedList<String> users = new ObservableSortedList<>((o1, o2) -> { - if (userModes(o1).equals(userModes(o2))) { - return o1.compareToIgnoreCase(o2); - } else { - return network().lowestModeIndex(userModes(o1)) - network().lowestModeIndex(userModes(o2)); - } - }); - private String codecForEncoding; - private String codecForDecoding; - // Because we don’t have networks at the beginning yet - @Nullable - private Map<String, String> cachedUserModes; - @Nullable - private Map<String, Object> cachedChanModes; - - public IrcChannel(String name, String topic, String password, @Nullable Map<String, String> userModes, - @NonNull Map<String, Object> chanModes, boolean encrypted) { - this.name = name; - this.topic = topic; - this.password = password; - this.encrypted = encrypted; - this.cachedUserModes = userModes; - this.cachedChanModes = chanModes; - } - - @NonNull - public static IrcChannel create(@NonNull String channelName) { - return new IrcChannel( - channelName, - "", - "", - new HashMap<>(), - new HashMap<>(), - false - ); - } - - @Override - public boolean isKnownUser(@Nullable QIrcUser ircuser) { - return ircuser != null && userModes.containsKey(ircuser.nick()); - } - - @Override - public boolean isValidChannelUserMode(@Nullable String mode) { - return mode != null && mode.length() == 1; - } - - @Override - public String name() { - return name; - } - - @Override - public String topic() { - return topic; - } - - @Override - public String password() { - return password; - } - - @Override - public boolean encrypted() { - return encrypted; - } - - @Override - public QNetwork network() { - return network.get(); - } - - @NonNull - @Override - public List<String> ircUsers() { - return new ArrayList<>(userModes.keySet()); - } - - @Override - public String userModes(String nick) { - if (userModes.get(nick) != null) - return Joiner.on("").join(userModes.get(nick)); - else - return ""; - } - - @Override - public String userModes(@NonNull QIrcUser ircuser) { - return userModes(ircuser.nick()); - } - - @Override - public boolean hasMode(char mode) { - Network.ChannelModeType modeType = network().channelModeType(mode); - - switch (modeType) { - case NOT_A_CHANMODE: - return false; - case A_CHANMODE: - return A_channelModes.containsKey(mode); - case B_CHANMODE: - return B_channelModes.containsKey(mode); - case C_CHANMODE: - return C_channelModes.containsKey(mode); - case D_CHANMODE: - return D_channelModes.contains(mode); - default: - return false; - } - } - - @Override - public String modeValue(char mode) { - QNetwork.ChannelModeType modeType = network().channelModeType(mode); - - switch (modeType) { - case B_CHANMODE: - if (B_channelModes.containsKey(mode)) - return B_channelModes.get(mode); - else - return ""; - case C_CHANMODE: - if (C_channelModes.containsKey(mode)) - return C_channelModes.get(mode); - else - return ""; - default: - return ""; - } - } - - @Override - public List<String> modeValueList(char mode) { - QNetwork.ChannelModeType modeType = network().channelModeType(mode); - switch (modeType) { - case A_CHANMODE: - if (A_channelModes.containsKey(mode)) - return A_channelModes.get(mode); - default: - return Collections.emptyList(); - } - } - - @Override - public String channelModeString() { - List<String> params = new LinkedList<>(); - StringBuilder modeString = new StringBuilder(""); - for (Character mode : D_channelModes) { - modeString.append(mode); - } - for (Map.Entry<Character, String> entry : C_channelModes.entrySet()) { - modeString.append(entry.getKey()); - params.add(entry.getValue()); - } - for (Map.Entry<Character, String> entry : B_channelModes.entrySet()) { - modeString.append(entry.getKey()); - params.add(entry.getValue()); - } - String result = modeString.toString(); - if (result.isEmpty()) - return result; - else - return String.format("+%s %s", result, Joiner.on(" ").join(params)); - } - - public String channelModeShort() { - StringBuilder modeString = new StringBuilder(""); - for (Character mode : D_channelModes) { - modeString.append(mode); - } - String result = modeString.toString(); - if (result.isEmpty()) - return result; - else - return String.format("+%s", result); - } - - @Override - public String codecForEncoding() { - return codecForEncoding; - } - - @Override - public String codecForDecoding() { - return codecForDecoding; - } - - @Override - public void setCodecForEncoding(String codecName) { - this.codecForEncoding = codecName; - } - - @Override - public void setCodecForDecoding(String codecName) { - this.codecForDecoding = codecName; - } - - @Override - public void _setTopic(String topic) { - this.topic = topic; - _update(); - updateDisplay(); - } - - @Override - public void _setPassword(String password) { - this.password = password; - } - - @Override - public void _setEncrypted(boolean encrypted) { - this.encrypted = encrypted; - } - - @Override - public void _joinIrcUsers(@NonNull List<String> nicks, @NonNull List<String> modes) { - assertEquals(nicks.size(), modes.size()); - for (int i = 0; i < nicks.size(); i++) { - _joinIrcUser(network().ircUser(nicks.get(i)), modes.get(i)); - } - } - - @Override - public void _joinIrcUser(QIrcUser ircuser) { - _joinIrcUser(ircuser, null); - } - - public void _joinIrcUser(@Nullable QIrcUser ircuser, @NonNull String mode) { - if (ircuser == null || userModes.containsKey(ircuser.nick())) { - _addUserMode(ircuser, mode); - } else { - userModes.put(ircuser.nick(), ModeUtils.toModes(mode)); - users.add(ircuser.nick()); - ircuser._joinChannel(this, true); - _update(); - } - } - - @Override - public void _part(@NonNull QIrcUser ircuser) { - if (isKnownUser(ircuser)) { - userModes.remove(ircuser.nick()); - users.remove(ircuser.nick()); - ircuser._partChannel(this); - - if (network().isMe(ircuser) || userModes.isEmpty()) { - Set<String> users = userModes.keySet(); - userModes.clear(); - users.clear(); - for (String user : users) { - network().ircUser(user)._partChannel(this, true); - } - network()._removeIrcChannel(this); - } - _update(); - } - } - - @Override - public void _part(String nick) { - part(network().ircUser(nick)); - } - - @Override - public void _setUserModes(@NonNull QIrcUser ircuser, String modes) { - if (!isKnownUser(ircuser)) - return; - - String nick = ircuser.nick(); - userModes.put(nick, ModeUtils.toModes(modes)); - users.add(nick); - users.notifyItemChanged(nick); - _update(); - } - - @Override - public void _setUserModes(String nick, String modes) { - _setUserModes(network().ircUser(nick), modes); - } - - @Override - public void _addUserMode(@NonNull QIrcUser ircuser, @NonNull String mode) { - if (!isKnownUser(ircuser) || !isValidChannelUserMode(mode)) - return; - - String nick = ircuser.nick(); - if (!userModes.get(nick).contains(ModeUtils.toMode(mode))) { - userModes.get(nick).add(ModeUtils.toMode(mode)); - users.notifyItemChanged(nick); - _update(); - } - } - - @Override - public void _addUserMode(String nick, @NonNull String mode) { - _addUserMode(network().ircUser(nick), mode); - } - - @Override - public void _removeUserMode(@NonNull QIrcUser ircuser, @NonNull String mode) { - if (!isKnownUser(ircuser) || !isValidChannelUserMode(mode)) - return; - - String nick = ircuser.nick(); - if (userModes.get(nick).contains(ModeUtils.toMode(mode))) { - userModes.get(nick).remove(ModeUtils.toMode(mode)); - users.notifyItemChanged(nick); - _update(); - } - } - - @Override - public void _removeUserMode(String nick, @NonNull String mode) { - _removeUserMode(network().ircUser(nick), mode); - } - - @Override - public void _addChannelMode(char mode, String value) { - QNetwork.ChannelModeType modeType = network().channelModeType(mode); - - switch (modeType) { - case NOT_A_CHANMODE: - return; - case A_CHANMODE: - if (!A_channelModes.containsKey(mode)) - A_channelModes.put(mode, new ArrayList<>(Collections.singletonList(value))); - else if (!A_channelModes.get(mode).contains(value)) - A_channelModes.get(mode).add(value); - break; - - case B_CHANMODE: - B_channelModes.put(mode, value); - break; - - case C_CHANMODE: - C_channelModes.put(mode, value); - break; - - case D_CHANMODE: - D_channelModes.add(mode); - break; - } - _update(); - } - - @Override - public void _removeChannelMode(char mode, String value) { - QNetwork.ChannelModeType modeType = network().channelModeType(mode); - switch (modeType) { - case NOT_A_CHANMODE: - return; - case A_CHANMODE: - if (A_channelModes.containsKey(mode)) - A_channelModes.get(mode).remove(value); - break; - - case B_CHANMODE: - B_channelModes.remove(mode); - break; - - case C_CHANMODE: - C_channelModes.remove(mode); - break; - - case D_CHANMODE: - D_channelModes.remove(mode); - break; - } - _update(); - } - - @SuppressWarnings("unchecked") - @Override - public void init(QNetwork network, Client client) { - this.client = client; - this.network = new WeakReference<>(network); - - - /* TODO: Use just the nick in userModes and users instead – that should make sync things a lot easier */ - if (cachedUserModes != null) { - for (String username : cachedUserModes.keySet()) { - userModes.put(username, ModeUtils.toModes(cachedUserModes.get(username))); - users.add(username); - } - } - if (cachedChanModes != null) { - if (cachedChanModes.get("A") != null) { - for (Map.Entry<String, QVariant<List<String>>> entry : ((Map<String, QVariant<List<String>>>) cachedChanModes.get("A")).entrySet()) { - A_channelModes.put(entry.getKey().charAt(0), entry.getValue().data); - } - } - - if (cachedChanModes.get("B") != null) - for (Map.Entry<String, QVariant<String>> entry : ((Map<String, QVariant<String>>) cachedChanModes.get("B")).entrySet()) { - B_channelModes.put(entry.getKey().charAt(0), entry.getValue().data); - } - - if (cachedChanModes.get("C") != null) - for (Map.Entry<String, QVariant<String>> entry : ((Map<String, QVariant<String>>) cachedChanModes.get("C")).entrySet()) { - C_channelModes.put(entry.getKey().charAt(0), entry.getValue().data); - } - - if (cachedChanModes.get("D") != null) - D_channelModes = ModeUtils.toModes((String) cachedChanModes.get("D")); - } - - cachedUserModes = null; - cachedChanModes = null; - - - QNetwork qNetwork = this.network.get(); - if (qNetwork != null) - qNetwork._addIrcChannel(this); - _update(); - } - - @Override - public void _update(@NonNull Map<String, QVariant> from) { - _update(IrcChannelSerializer.get().fromDatastream(from)); - } - - @Override - public void _update(QIrcChannel from) { - - } - - @NonNull - public Map<String, String> userModes() { - Map<String, String> result = new HashMap<>(); - for (String nick : userModes.keySet()) { - result.put(nick, userModes(nick)); - } - return result; - } - - @NonNull - public Map<String, Object> chanModes() { - Map<String, Object> result = new HashMap<>(); - result.put("A", A_channelModes); - result.put("B", B_channelModes); - result.put("C", C_channelModes); - result.put("D", ModeUtils.fromModes(D_channelModes)); - return result; - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - String[] split = objectName.split("/", 2); - assertEquals(split.length, 2); - init(client.networkManager().network(Integer.parseInt(split[0])), client); - } - - @NonNull - public ObservableSortedList<String> users() { - return users; - } - - @Override - public void _ircUserNickChanged(String oldNick, String newNick) { - users.remove(oldNick); - users.add(newNick); - userModes.put(newNick, userModes.get(oldNick)); - } - - @Override - public List<Character> modeList() { - List<Character> modes = new ArrayList<>(); - modes.addAll(D_channelModes); - modes.addAll(C_channelModes.keySet()); - modes.addAll(B_channelModes.keySet()); - modes.addAll(A_channelModes.keySet()); - return modes; - } - - @Override - public void _update() { - super._update(); - } - - private void updateDisplay() { - if (client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA) { - ChannelBuffer buffer = client.bufferManager().channel(this); - if (buffer != null) { - for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) { - qBufferViewConfig.bufferIds().notifyItemChanged(buffer.getInfo().id); - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java deleted file mode 100644 index 2999b8483..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java +++ /dev/null @@ -1,507 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.SparseArray; - -import org.joda.time.DateTime; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Set; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.localtypes.buffers.QueryBuffer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.abstracts.AIrcUser; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.backports.Objects; -import de.kuschku.util.irc.IrcUserUtils; -import de.kuschku.util.irc.ModeUtils; - -import static de.kuschku.util.AndroidAssert.assertEquals; - -public class IrcUser extends AIrcUser { - @NonNull - private final SparseArray<DateTime> lastActivity = new SparseArray<>(); - @NonNull - private final SparseArray<DateTime> lastSpokenTo = new SparseArray<>(); - private final List<String> cachedChannels; - private final Set<String> channels = new HashSet<>(); - private String user; - private String host; - private String nick; - private String realName; - private String account; - private boolean away; - private String awayMessage; - private DateTime idleTime; - private DateTime loginTime; - private String server; - private String ircOperator; - private int lastAwayMessage; - private String whoisServiceReply; - private String suserHost; - private boolean encrypted; - private WeakReference<QNetwork> network = new WeakReference<>(null); - private Set<Character> userModes; - - public IrcUser(String server, String ircOperator, boolean away, int lastAwayMessage, DateTime idleTime, String whoisServiceReply, String suserHost, String nick, String realName, String account, String awayMessage, DateTime loginTime, boolean encrypted, List<String> channels, String host, String userModes, String user) { - this.server = server; - this.ircOperator = ircOperator; - this.away = away; - this.lastAwayMessage = lastAwayMessage; - this.idleTime = idleTime; - this.whoisServiceReply = whoisServiceReply; - this.suserHost = suserHost; - this.nick = nick; - this.realName = realName; - this.account = account; - this.awayMessage = awayMessage; - this.loginTime = loginTime; - this.encrypted = encrypted; - this.cachedChannels = channels; - this.host = host; - this.userModes = ModeUtils.toModes(userModes); - this.user = user; - } - - @NonNull - public static IrcUser create(@NonNull String mask) { - String nick; - String host; - String user; - - // Sometimes this is invoked with a nick instead, so we check - if (mask.contains("@")) { - nick = IrcUserUtils.getNick(mask); - host = IrcUserUtils.getHost(mask); - user = IrcUserUtils.getUser(mask); - } else { - nick = mask; - host = null; - user = null; - } - - return new IrcUser( - null, - null, - false, - -1, - null, - null, - null, - nick, - null, - null, - null, - null, - false, - null, - host, - null, - user - ); - } - - @Override - public String user() { - return user; - } - - @Override - public String host() { - return host; - } - - @Override - public String nick() { - return nick; - } - - @Override - public String realName() { - return realName; - } - - @Override - public String account() { - return account; - } - - @Override - public String hostmask() { - return String.format("%s!%s@%s", nick(), user(), host()); - } - - @Override - public boolean isAway() { - return away; - } - - @Override - public String awayMessage() { - return awayMessage; - } - - @Override - public DateTime idleTime() { - return idleTime; - } - - @Override - public DateTime loginTime() { - return loginTime; - } - - @Override - public String server() { - return server; - } - - @Override - public String ircOperator() { - return ircOperator; - } - - @Override - public int lastAwayMessage() { - return lastAwayMessage; - } - - @Override - public String whoisServiceReply() { - return whoisServiceReply; - } - - @Override - public String suserHost() { - return suserHost; - } - - @Override - public boolean encrypted() { - return encrypted; - } - - @Override - public QNetwork network() { - return network.get(); - } - - @NonNull - @Override - public String userModes() { - return ModeUtils.fromModes(userModes); - } - - @NonNull - @Override - public List<String> channels() { - List<String> chanList = new ArrayList<>(channels.size()); - for (String channel : channels) { - chanList.add(channel); - } - return chanList; - } - - @Override - public DateTime lastChannelActivity(int id) { - return lastActivity.get(id); - } - - @Override - public void setLastChannelActivity(int id, DateTime time) { - lastActivity.put(id, time); - _update(); - } - - @Override - public DateTime lastSpokenTo(int id) { - return lastSpokenTo.get(id); - } - - @Override - public void setLastSpokenTo(int id, DateTime time) { - lastSpokenTo.put(id, time); - _update(); - } - - @Override - public void _setUser(String user) { - this.user = user; - _update(); - } - - @Override - public void _setHost(String host) { - this.host = host; - _update(); - } - - @Override - public void _setNick(String nick) { - this.nick = nick; - _update(); - } - - @Nullable - @Override - public String getObjectName() { - return String.format(Locale.US, "%d/%s", network().networkId(), nick()); - } - - @Override - public void setObjectName(@Nullable String objectName) { - network().ircUserNickChanged(nick, objectName.split("/")[1]); - super.setObjectName(objectName); - } - - @Override - public void _setRealName(String realName) { - this.realName = realName; - _update(); - } - - @Override - public void _setAccount(String account) { - this.account = account; - _update(); - } - - @Override - public void _setAway(boolean away) { - this.away = away; - _update(); - } - - @Override - public void _setAwayMessage(String awayMessage) { - this.awayMessage = awayMessage; - _update(); - } - - @Override - public void _setIdleTime(DateTime idleTime) { - this.idleTime = idleTime; - _update(); - } - - @Override - public void _setLoginTime(DateTime loginTime) { - this.loginTime = loginTime; - _update(); - } - - @Override - public void _setServer(String server) { - this.server = server; - _update(); - } - - @Override - public void _setIrcOperator(String ircOperator) { - this.ircOperator = ircOperator; - _update(); - } - - @Override - public void _setLastAwayMessage(int lastAwayMessage) { - this.lastAwayMessage = lastAwayMessage; - _update(); - } - - @Override - public void _setWhoisServiceReply(String whoisServiceReply) { - this.whoisServiceReply = whoisServiceReply; - _update(); - } - - @Override - public void _setSuserHost(String suserHost) { - this.suserHost = suserHost; - _update(); - } - - @Override - public void _setEncrypted(boolean encrypted) { - this.encrypted = encrypted; - _update(); - } - - @Override - public void _updateHostmask(@NonNull String mask) { - if (Objects.equals(mask, hostmask())) - return; - - setUser(IrcUserUtils.getUser(mask)); - setHost(IrcUserUtils.getHost(mask)); - _update(); - } - - @Override - public void _setUserModes(String modes) { - this.userModes = ModeUtils.toModes(modes); - _update(); - } - - @Override - public void _joinChannel(@NonNull QIrcChannel channel) { - _joinChannel(channel, false); - _update(); - } - - @Override - public void _joinChannel(@NonNull QIrcChannel channel, boolean skip_channel_join) { - if (!channels.contains(channel.name())) { - channels.add(channel.name()); - if (!skip_channel_join) - channel._joinIrcUser(this); - } - _update(); - } - - @Override - public void _joinChannel(String channelname) { - _joinChannel(network().newIrcChannel(channelname)); - _update(); - } - - @Override - public void _partChannel(@NonNull QIrcChannel channel) { - _partChannel(channel, false); - _update(); - } - - @Override - public void _partChannel(@NonNull QIrcChannel channel, boolean skip_channel_part) { - if (channels.contains(channel)) { - channels.remove(channel); - if (!skip_channel_part) - channel._part(this); - /* - if (channels.isEmpty() && !network().isMe(this)) - _quit(); - */ - } - _update(); - } - - @Override - public void _partChannel(String channelname) { - _partChannel(network().ircChannel(channelname)); - _update(); - } - - @Override - public void _quit() { - List<String> channels = new ArrayList<>(this.channels); - this.channels.clear(); - QNetwork network = network(); - if (network != null) { - for (String channel : channels) { - network.ircChannel(channel)._part(this); - } - network._removeIrcUser(this); - } - _update(); - } - - @Override - public void _addUserModes(@Nullable String modes) { - if (modes == null || modes.isEmpty()) - return; - - userModes.addAll(ModeUtils.toModes(modes)); - _update(); - } - - @Override - public void _removeUserModes(@Nullable String modes) { - if (modes == null || modes.isEmpty()) - return; - - userModes.removeAll(ModeUtils.toModes(modes)); - _update(); - } - - @Override - public void init(QNetwork network, Client client) { - this.network = new WeakReference<>(network); - this.client = client; - - if (cachedChannels != null) - for (String channelName : cachedChannels) { - network().newIrcChannel(channelName); - channels.add(channelName); - } - _update(); - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - String[] split = objectName.split("/", 2); - assertEquals(split.length, 2); - init(client.networkManager().network(Integer.parseInt(split[0])), client); - } - - @Override - public void _update(Map<String, QVariant> from) { - } - - @Override - public void _update(QIrcUser from) { - } - - @Override - public void _update() { - super._update(); - for (String channel : this.channels) { - QNetwork network = this.network(); - if (network != null) { - QIrcChannel channel1 = network.ircChannel(channel); - if (channel1 != null) { - channel1.users().notifyItemChanged(nick); - } - } - } - QueryBuffer user = client.bufferManager().user(this); - if (user != null) - client.bufferManager().bufferIds().notifyItemChanged(user.getInfo().id); - } - - @NonNull - @Override - public String toString() { - return "IrcUser{" + hostmask() + '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java deleted file mode 100644 index e21263dca..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java +++ /dev/null @@ -1,909 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.localtypes.buffers.StatusBuffer; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.abstracts.ANetwork; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.CompatibilityUtils; -import de.kuschku.util.irc.IrcCaseMappers; -import de.kuschku.util.irc.IrcUserUtils; -import de.kuschku.util.irc.ModeUtils; -import de.kuschku.util.irc.chanmodes.IrcModeProvider; -import de.kuschku.util.irc.chanmodes.IrcModeProviderFactory; - -public class Network extends ANetwork implements Observer { - private final Map<String, QIrcChannel> channels; - @NonNull - private final Map<String, QIrcUser> nicks; - private final Map<String, String> supports; - private ConnectionState connectionState; - private boolean autoAwayActive; - private String currentServer; - private boolean isConnected; - private int latency; - private String myNick; - - private NetworkInfo networkInfo; - - private String defaultCodecForServer = "UTF-8"; - private String defaultCodecForEncoding = "UTF-8"; - private String defaultCodecForDecoding = "UTF-8"; - - private List<String> prefixes; - private List<String> prefixModes; - private IrcModeProvider modeProvider; - private IrcCaseMappers.IrcCaseMapper caseMapper; - - public Network(Collection<QIrcChannel> channels, - Collection<QIrcUser> nicks, - List<NetworkServer> serverList, Map<String, String> supports, - int connectionState, String currentServer, boolean isConnected, int latency, - String myNick, NetworkInfo networkInfo) { - this.supports = new HashMap<>(supports); - this.connectionState = ConnectionState.of(connectionState); - this.currentServer = currentServer; - this.isConnected = isConnected; - this.latency = latency; - this.myNick = myNick; - _setNetworkInfo(networkInfo); - this.networkInfo._setServerList(serverList); - - updateCaseMapper(); - - this.channels = new HashMap<>(); - for (QIrcChannel qIrcChannel : channels) { - this.channels.put(caseMapper.toLowerCase(qIrcChannel.name()), qIrcChannel); - } - this.nicks = new HashMap<>(); - for (QIrcUser qIrcUser : nicks) { - this.nicks.put(caseMapper.toLowerCase(qIrcUser.nick()), qIrcUser); - } - } - - public Network(Collection<QIrcChannel> channels, Collection<QIrcUser> users, Map<String, String> supports, int connectionState, String currentServer, boolean isConnected, int latency, String myNick, NetworkInfo networkInfo) { - this(channels, users, Collections.emptyList(), supports, connectionState, currentServer, isConnected, latency, myNick, networkInfo); - } - - public Network(Collection<QIrcChannel> channels, Collection<QIrcUser> nicks, List<NetworkServer> serverList, Map<String, String> supports, ConnectionState connectionState, String currentServer, boolean isConnected, int latency, String myNick, NetworkInfo networkInfo) { - this.supports = new HashMap<>(supports); - this.connectionState = connectionState; - this.currentServer = currentServer; - this.isConnected = isConnected; - this.latency = latency; - this.myNick = myNick; - _setNetworkInfo(networkInfo); - this.networkInfo._setServerList(serverList); - - updateCaseMapper(); - - this.channels = new HashMap<>(); - for (QIrcChannel qIrcChannel : channels) { - this.channels.put(caseMapper.toLowerCase(qIrcChannel.name()), qIrcChannel); - } - this.nicks = new HashMap<>(); - for (QIrcUser qIrcUser : nicks) { - this.nicks.put(caseMapper.toLowerCase(qIrcUser.nick()), qIrcUser); - } - } - - @NonNull - public static QNetwork create(int network) { - return new Network( - Collections.emptyList(), - Collections.emptyList(), - Collections.emptyList(), - Collections.emptyMap(), - ConnectionState.Disconnected, - "", - false, - 0, - "", - NetworkInfo.create(network) - ); - } - - @Override - public int networkId() { - return networkInfo.networkId(); - } - - @Override - public boolean isMyNick(String nick) { - return caseMapper.equalsIgnoreCase(myNick, nick); - } - - @Override - public boolean isMe(@NonNull QIrcUser ircuser) { - return caseMapper.equalsIgnoreCase(ircuser.nick(), myNick()); - } - - @Override - public boolean isChannelName(@NonNull String channelname) { - if (channelname.isEmpty()) - return false; - - if (supports("CHANTYPES")) - return support("CHANTYPES").contains(channelname.substring(0, 1)); - else - return "#&!+".contains(channelname.substring(0, 1)); - } - - @Override - public boolean isConnected() { - return isConnected; - } - - @Override - public ConnectionState connectionState() { - return connectionState; - } - - @Override - public String prefixToMode(char prefix) { - return prefixToMode(ModeUtils.fromMode(prefix)); - } - - @Override - public String prefixToMode(String prefix) { - if (prefixes().contains(prefix)) - return prefixModes().get(prefixes().indexOf(prefix)); - else - return ""; - } - - @Override - public String modeToPrefix(char ch) { - return modeToPrefix(ModeUtils.fromMode(ch)); - } - - @Override - public String modeToPrefix(String mode) { - if (prefixModes().contains(mode)) - return prefixes().get(prefixModes().indexOf(mode)); - else - return ""; - } - - @Override - public int modeToIndex(String mode) { - int index = prefixModes().indexOf(mode); - return index == -1 ? Integer.MAX_VALUE : index; - } - - @Override - public int lowestModeIndex(String mode) { - int lowestIndex = Integer.MAX_VALUE; - for (String m : CompatibilityUtils.partStringByChar(mode)) { - int index = modeToIndex(m); - if (index < lowestIndex) - lowestIndex = index; - } - return lowestIndex; - } - - @NonNull - @Override - public ChannelModeType channelModeType(char mode) { - return channelModeType(ModeUtils.fromMode(mode)); - } - - @NonNull - @Override - public ChannelModeType channelModeType(@NonNull String mode) { - String chanmodes = support("CHANMODES"); - if (chanmodes.isEmpty()) - return ChannelModeType.NOT_A_CHANMODE; - - String[] split = chanmodes.split(","); - for (int i = 0; i < split.length; i++) { - if (split[i].contains(mode)) { - return ChannelModeType.of(i); - } - } - return ChannelModeType.NOT_A_CHANMODE; - } - - @Override - public String networkName() { - return networkInfo.networkName(); - } - - @Override - public String currentServer() { - return currentServer; - } - - @Override - public String myNick() { - return myNick; - } - - @Override - public int latency() { - return latency; - } - - @Override - public QIrcUser me() { - return ircUser(myNick()); - } - - @Override - public int identity() { - return networkInfo.identity(); - } - - @NonNull - @Override - public List<String> nicks() { - List<String> nicks = new ArrayList<>(); - for (QIrcUser user : this.nicks.values()) { - nicks.add(user.nick()); - } - return nicks; - } - - @NonNull - @Override - public List<String> channels() { - return new ArrayList<>(channels.keySet()); - } - - @Override - public boolean useRandomServer() { - return networkInfo.useRandomServer(); - } - - @Override - public List<String> perform() { - return networkInfo.perform(); - } - - @Override - public boolean useAutoIdentify() { - return networkInfo.useAutoIdentify(); - } - - @Override - public String autoIdentifyService() { - return networkInfo.autoIdentifyService(); - } - - @Override - public String autoIdentifyPassword() { - return networkInfo.autoIdentifyPassword(); - } - - @Override - public boolean useSasl() { - return networkInfo.useSasl(); - } - - @Override - public String saslAccount() { - return networkInfo.saslAccount(); - } - - @Override - public String saslPassword() { - return networkInfo.saslPassword(); - } - - @Override - public boolean useAutoReconnect() { - return networkInfo.useAutoReconnect(); - } - - @Override - public int autoReconnectInterval() { - return networkInfo.autoReconnectInterval(); - } - - @Override - public short autoReconnectRetries() { - return networkInfo.autoReconnectRetries(); - } - - @Override - public boolean unlimitedReconnectRetries() { - return networkInfo.unlimitedReconnectRetries(); - } - - @Override - public boolean rejoinChannels() { - return networkInfo.rejoinChannels(); - } - - @Override - public NetworkInfo networkInfo() { - return networkInfo; - } - - @Override - public List<String> prefixes() { - if (prefixes == null) - determinePrefixes(); - return prefixes; - } - - @Override - public List<String> prefixModes() { - if (prefixModes == null) - determinePrefixes(); - return prefixModes; - } - - @Override - public IrcModeProvider modeProvider() { - if (modeProvider == null) - modeProvider = IrcModeProviderFactory.identifyServer(supports.get("CHANMODES")); - return modeProvider; - } - - @Override - public void determinePrefixes() { - // seems like we have to construct them first - String prefix = support("PREFIX"); - - if (prefix.startsWith("(") && prefix.contains(")")) { - String[] data = prefix.substring(1).split("\\)"); - prefixes = Arrays.asList(CompatibilityUtils.partStringByChar(data[1])); - prefixModes = Arrays.asList(CompatibilityUtils.partStringByChar(data[0])); - } else { - List<String> defaultPrefixes = Arrays.asList(CompatibilityUtils.partStringByChar("~&@%+")); - List<String> defaultPrefixModes = Arrays.asList(CompatibilityUtils.partStringByChar("qaohv")); - - if (prefix.isEmpty()) { - prefixes = defaultPrefixes; - prefixModes = defaultPrefixModes; - return; - } - - // clear the existing modes, just in case we're run multiple times - prefixes.clear(); - prefixModes.clear(); - - // we just assume that in PREFIX are only prefix chars stored - for (int i = 0; i < defaultPrefixes.size(); i++) { - if (prefix.contains(defaultPrefixes.get(i))) { - prefixes.add(defaultPrefixes.get(i)); - prefixModes.add(defaultPrefixModes.get(i)); - } - } - // check for success - if (!prefixes.isEmpty()) - return; - - // well... our assumption was obviously wrong... - // check if it's only prefix modes - for (int i = 0; i < defaultPrefixes.size(); i++) { - if (prefix.contains(defaultPrefixModes.get(i))) { - prefixes.add(defaultPrefixes.get(i)); - prefixModes.add(defaultPrefixModes.get(i)); - } - } - // now we've done all we've could... - } - } - - @Override - public boolean supports(String param) { - return supports.containsKey(param); - } - - @Override - public String support(@NonNull String param) { - String key = param.toUpperCase(Locale.US); - if (supports.containsKey(key)) - return supports.get(key); - else - return ""; - } - - @Override - public QIrcUser ircUser(String nickname) { - return nicks.get(caseMapper.toLowerCase(nickname)); - } - - @NonNull - @Override - public List<QIrcUser> ircUsers() { - return new ArrayList<>(nicks.values()); - } - - @Override - public int ircUserCount() { - return nicks.size(); - } - - @Override - public QIrcChannel newIrcChannel(@NonNull String channelname) { - if (!channels.containsKey(caseMapper.toLowerCase(channelname))) { - QIrcChannel channel = IrcChannel.create(channelname); - channels.put(caseMapper.toLowerCase(channelname), channel); - channel.init(this, client); - } - return channels.get(caseMapper.toLowerCase(channelname)); - } - - @Nullable - @Override - public QIrcChannel ircChannel(String channelname) { - channelname = caseMapper.toLowerCase(channelname); - if (channels.containsKey(channelname)) { - return channels.get(channelname); - } else { - return null; - } - } - - @NonNull - @Override - public List<QIrcChannel> ircChannels() { - return new ArrayList<>(channels.values()); - } - - @Override - public int ircChannelCount() { - return channels.size(); - } - - @Override - public String codecForServer() { - return networkInfo.codecForServer(); - } - - @Override - public String codecForEncoding() { - return networkInfo.codecForEncoding(); - } - - @Override - public String codecForDecoding() { - return networkInfo.codecForDecoding(); - } - - @Override - public String defaultCodecForServer() { - return defaultCodecForServer; - } - - @Override - public String defaultCodecForEncoding() { - return defaultCodecForEncoding; - } - - @Override - public String defaultCodecForDecoding() { - return defaultCodecForDecoding; - } - - @Override - public void setDefaultCodecForServer(String name) { - this.defaultCodecForServer = name; - } - - @Override - public void setDefaultCodecForEncoding(String name) { - this.defaultCodecForEncoding = name; - } - - @Override - public void setDefaultCodecForDecoding(String name) { - this.defaultCodecForDecoding = name; - } - - @Override - public boolean autoAwayActive() { - return autoAwayActive; - } - - @Override - public void _setAutoAwayActive(boolean active) { - this.autoAwayActive = active; - _update(); - } - - @Override - public void _setNetworkName(String networkName) { - this.networkInfo._setNetworkName(networkName); - } - - @Override - public void _setCurrentServer(String currentServer) { - this.currentServer = currentServer; - _update(); - } - - @Override - public void _setConnected(boolean isConnected) { - this.isConnected = isConnected; - _update(); - updateDisplay(); - } - - @Override - public void _setConnectionState(int state) { - this.connectionState = ConnectionState.of(state); - _update(); - } - - @Override - public void _setMyNick(String mynick) { - this.myNick = mynick; - _update(); - } - - @Override - public void _setLatency(int latency) { - this.latency = latency; - _update(); - } - - @Override - public void _setIdentity(int identityId) { - this.networkInfo._setIdentity(identityId); - } - - @Override - public void _setServerList(List<NetworkServer> serverList) { - this.networkInfo._setServerList(serverList); - } - - @Override - public void _setUseRandomServer(boolean useRandomServer) { - this.networkInfo._setUseRandomServer(useRandomServer); - } - - @Override - public void _setPerform(List<String> performs) { - this.networkInfo._setPerform(performs); - } - - @Override - public void _setUseAutoIdentify(boolean useAutoIdentify) { - this.networkInfo._setUseAutoIdentify(useAutoIdentify); - } - - @Override - public void _setAutoIdentifyService(String autoIdentifyService) { - this.networkInfo._setAutoIdentifyService(autoIdentifyService); - } - - @Override - public void _setAutoIdentifyPassword(String autoIdentifyPassword) { - this.networkInfo._setAutoIdentifyPassword(autoIdentifyPassword); - } - - @Override - public void _setUseSasl(boolean useSasl) { - this.networkInfo._setUseSasl(useSasl); - } - - @Override - public void _setSaslAccount(String saslAccount) { - this.networkInfo._setSaslAccount(saslAccount); - } - - @Override - public void _setSaslPassword(String saslPassword) { - this.networkInfo._setSaslPassword(saslPassword); - } - - @Override - public void _setUseAutoReconnect(boolean useAutoReconnect) { - this.networkInfo._setUseAutoReconnect(useAutoReconnect); - } - - @Override - public void _setAutoReconnectInterval(int autoReconnectInterval) { - this.networkInfo._setAutoReconnectInterval(autoReconnectInterval); - } - - @Override - public void _setAutoReconnectRetries(short autoReconnectRetries) { - this.networkInfo._setAutoReconnectRetries(autoReconnectRetries); - } - - @Override - public void _setUnlimitedReconnectRetries(boolean unlimitedReconnectRetries) { - this.networkInfo._setUnlimitedReconnectRetries(unlimitedReconnectRetries); - } - - @Override - public void _setRejoinChannels(boolean rejoinChannels) { - this.networkInfo._setRejoinChannels(rejoinChannels); - } - - @Override - public void _setCodecForServer(String codecName) { - this.networkInfo._setCodecForServer(codecName); - } - - @Override - public void _setCodecForEncoding(String codecName) { - this.networkInfo._setCodecForEncoding(codecName); - } - - @Override - public void _setCodecForDecoding(String codecName) { - this.networkInfo._setCodecForDecoding(codecName); - } - - @Override - public void _addSupport(String param) { - _addSupport(param, ""); - } - - @Override - public void _addSupport(String param, String value) { - supports.put(param, value); - _update(); - updateCaseMapper(); - } - - @Override - public IrcCaseMappers.IrcCaseMapper caseMapper() { - return caseMapper; - } - - private void updateCaseMapper() { - String mapping = support("CASEMAPPING"); - if (mapping == null) { - caseMapper = IrcCaseMappers.unicode; - } else { - switch (mapping.toLowerCase(Locale.US)) { - case "rfc1459": - case "strict-rfc1459": - caseMapper = IrcCaseMappers.irc; - case "ascii": - default: - caseMapper = IrcCaseMappers.unicode; - } - } - } - - @Override - public void _removeSupport(String param) { - supports.remove(param); - _update(); - updateCaseMapper(); - } - - @Override - public void _addIrcUser(@NonNull String hostmask) { - newIrcUser(hostmask); - } - - @Override - public void _addIrcChannel(@NonNull String channel) { - newIrcChannel(channel); - } - - @Override - public QIrcUser _updateNickFromMask(@NonNull String mask) { - String nick = caseMapper.toLowerCase(IrcUserUtils.getNick(mask)); - QIrcUser user; - - if (nicks.containsKey(nick)) { - user = nicks.get(nick); - user.updateHostmask(mask); - } else { - user = newIrcUser(mask); - } - _update(); - return user; - } - - @NonNull - private QIrcUser newIrcUser(@NonNull String mask) { - IrcUser user = IrcUser.create(mask); - user.init(this, client); - client.requestInitObject("IrcUser", user.getObjectName()); - nicks.put(caseMapper.toLowerCase(user.nick()), user); - _update(); - return user; - } - - @Override - public void ircUserNickChanged(@NonNull String oldNick, @NonNull String newNick) { - if (!caseMapper.equalsIgnoreCase(oldNick, newNick)) { - nicks.put(caseMapper.toLowerCase(newNick), nicks.remove(caseMapper.toLowerCase(oldNick))); - for (QIrcChannel channel : channels.values()) { - channel._ircUserNickChanged(oldNick, newNick); - } - _update(); - } - - if (caseMapper.equalsIgnoreCase(myNick(), oldNick)) - _setMyNick(newNick); - } - - @Override - public void _connect() { - // Do nothing - } - - @Override - public void _disconnect() { - // Do nothing - } - - @Override - public void _setNetworkInfo(NetworkInfo info) { - if (this.networkInfo != null) - this.networkInfo.deleteObserver(this); - this.networkInfo = info; - if (this.networkInfo != null) - this.networkInfo.addObserver(this); - _update(); - updateDisplay(); - } - - @Override - public void _removeIrcUser(QIrcUser ircuser) { - if (!nicks.containsValue(ircuser)) - return; - - for (Map.Entry<String, QIrcUser> entry : nicks.entrySet()) { - if (entry.getValue() == ircuser) { - nicks.remove(entry.getKey()); - break; - } - } - _update(); - } - - @Override - public void _removeIrcChannel(QIrcChannel ircChannel) { - if (!channels.containsValue(ircChannel)) - return; - - for (Map.Entry<String, QIrcChannel> entry : channels.entrySet()) { - if (entry.getValue() == ircChannel) { - channels.remove(entry.getKey()); - break; - } - } - _update(); - } - - @Override - public void _removeChansAndUsers() { - nicks.clear(); - channels.clear(); - _update(); - } - - @Override - public void _addIrcChannel(@NonNull IrcChannel ircChannel) { - channels.put(caseMapper.toLowerCase(ircChannel.name()), ircChannel); - } - - @Override - public void _update(Map<String, QVariant> from) { - - } - - @Override - public void _update(QNetwork from) { - - } - - - @Override - public void _update() { - super._update(); - if (client != null) { - int position = client.networkManager().networks().indexOf(this); - if (position != -1) - client.networkManager().networks().notifyItemChanged(position); - } - } - - private void updateDisplay() { - if (client != null && client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA && client.bufferViewManager() != null) { - StatusBuffer buffer = client.bufferManager().network(networkInfo.networkId()); - if (buffer != null) { - buffer.updateStatus(); - for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) { - qBufferViewConfig.bufferIds().notifyItemChanged(buffer.getInfo().id); - qBufferViewConfig.networkList().notifyItemChanged(this); - } - } else { - for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) { - qBufferViewConfig.networkList().notifyItemChanged(this); - } - } - } - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - networkInfo._setNetworkId(Integer.parseInt(objectName)); - client.networkManager().createNetwork(this); - for (QIrcChannel channel : channels.values()) { - ((IrcChannel) channel).init(networkId() + "/" + channel.name(), provider, client); - } - for (QIrcUser user : nicks.values()) { - ((IrcUser) user).init(networkId() + "/" + user.nick(), provider, client); - } - } - - public void update(Observable observable, Object data) { - _update(); - } - - @Override - public List<NetworkServer> serverList() { - return networkInfo.serverList(); - } - - @NonNull - @Override - public String toString() { - return "Network{" + - "name='" + networkInfo.networkName() + '\'' + - ", id='" + networkInfo.networkId() + '\'' + - '}'; - } - - @Override - public boolean equals(@Nullable Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Network network = (Network) o; - - return networkInfo != null ? networkInfo.equals(network.networkInfo) : network.networkInfo == null; - - } - - @Override - public int hashCode() { - return networkInfo != null ? networkInfo.hashCode() : 0; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkConfig.java deleted file mode 100644 index 632d85031..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkConfig.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.abstracts.ANetworkConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QNetworkConfig; - -public class NetworkConfig extends ANetworkConfig { - private boolean standardCtcp; - - private boolean autoWhoEnabled; - private int autoWhoDelay; - private int autoWhoNickLimit; - private int autoWhoInterval; - - private boolean pingTimeoutEnabled; - private int maxPingCount; - private int pingInterval; - - public NetworkConfig(boolean standardCtcp, boolean autoWhoEnabled, int autoWhoDelay, int autoWhoNickLimit, int autoWhoInterval, boolean pingTimeoutEnabled, int maxPingCount, int pingInterval) { - this.standardCtcp = standardCtcp; - this.autoWhoEnabled = autoWhoEnabled; - this.autoWhoDelay = autoWhoDelay; - this.autoWhoNickLimit = autoWhoNickLimit; - this.autoWhoInterval = autoWhoInterval; - this.pingTimeoutEnabled = pingTimeoutEnabled; - this.maxPingCount = maxPingCount; - this.pingInterval = pingInterval; - } - - @Override - public boolean pingTimeoutEnabled() { - return pingTimeoutEnabled; - } - - @Override - public void _setPingTimeoutEnabled(boolean pingTimeoutEnabled) { - this.pingTimeoutEnabled = pingTimeoutEnabled; - } - - @Override - public void _requestSetPingTimeoutEnabled(boolean pingTimeoutEnabled) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public int pingInterval() { - return pingInterval; - } - - @Override - public void _setPingInterval(int pingInterval) { - this.pingInterval = pingInterval; - } - - @Override - public void _requestSetPingInterval(int pingInterval) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public int maxPingCount() { - return maxPingCount; - } - - @Override - public void _setMaxPingCount(int maxPingCount) { - this.maxPingCount = maxPingCount; - } - - @Override - public void _requestSetMaxPingCount(int maxPingCount) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public boolean autoWhoEnabled() { - return autoWhoEnabled; - } - - @Override - public void _setAutoWhoEnabled(boolean autoWhoEnabled) { - this.autoWhoEnabled = autoWhoEnabled; - } - - @Override - public void _requestSetAutoWhoEnabled(boolean autoWhoEnabled) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public int autoWhoInterval() { - return autoWhoInterval; - } - - @Override - public void _setAutoWhoInterval(int autoWhoInterval) { - this.autoWhoInterval = autoWhoInterval; - } - - @Override - public void _requestSetAutoWhoInterval(int autoWhoInterval) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public int autoWhoNickLimit() { - return autoWhoNickLimit; - } - - @Override - public void _setAutoWhoNickLimit(int autoWhoNickLimit) { - this.autoWhoNickLimit = autoWhoNickLimit; - } - - @Override - public void _requestSetAutoWhoNickLimit(int autoWhoNickLimit) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public int autoWhoDelay() { - return autoWhoDelay; - } - - @Override - public void _setAutoWhoDelay(int autoWhoDelay) { - this.autoWhoDelay = autoWhoDelay; - } - - @Override - public void _requestSetAutoWhoDelay(int autoWhoDelay) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - } - - @Override - public boolean standardCtcp() { - return standardCtcp; - } - - @Override - public void _setStandardCtcp(boolean standardCtcp) { - this.standardCtcp = standardCtcp; - } - - @Override - public void _requestSetStandardCtcp(boolean standardCtcp) { - // Do nothing, we’re on the client – the server will receive the sync just as expected - - } - - @Override - public void _update(Map<String, QVariant> from) { - - } - - @Override - public void _update(QNetworkConfig from) { - - } - - @Override - public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) { - super.init(objectName, provider, client); - client.setGlobalNetworkConfig(this); - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java deleted file mode 100644 index bbfd54676..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/NetworkInfo.java +++ /dev/null @@ -1,376 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.impl; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.Collections; -import java.util.List; -import java.util.Observable; - -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.util.backports.Objects; - -public class NetworkInfo extends Observable { - private int networkId; - private String networkName; - private int identity; - - private String codecForServer; - private String codecForEncoding; - private String codecForDecoding; - - private List<NetworkServer> serverList; - private boolean useRandomServer; - - private List<String> perform; - - private boolean useAutoIdentify; - private String autoIdentifyService; - private String autoIdentifyPassword; - - private boolean useSasl; - private String saslAccount; - private String saslPassword; - - private boolean useAutoReconnect; - private int autoReconnectInterval; - private short autoReconnectRetries; - private boolean unlimitedReconnectRetries; - private boolean rejoinChannels; - - public NetworkInfo(int networkId, String networkName, int identity, String codecForServer, String codecForEncoding, String codecForDecoding, List<NetworkServer> serverList, boolean useRandomServer, List<String> perform, boolean useAutoIdentify, String autoIdentifyService, String autoIdentifyPassword, boolean useSasl, String saslAccount, String saslPassword, boolean useAutoReconnect, int autoReconnectInterval, short autoReconnectRetries, boolean unlimitedReconnectRetries, boolean rejoinChannels) { - this.networkId = networkId; - this.networkName = networkName; - this.identity = identity; - this.codecForServer = codecForServer; - this.codecForEncoding = codecForEncoding; - this.codecForDecoding = codecForDecoding; - this.serverList = serverList; - this.useRandomServer = useRandomServer; - this.perform = perform; - this.useAutoIdentify = useAutoIdentify; - this.autoIdentifyService = autoIdentifyService; - this.autoIdentifyPassword = autoIdentifyPassword; - this.useSasl = useSasl; - this.saslAccount = saslAccount; - this.saslPassword = saslPassword; - this.useAutoReconnect = useAutoReconnect; - this.autoReconnectInterval = autoReconnectInterval; - this.autoReconnectRetries = autoReconnectRetries; - this.unlimitedReconnectRetries = unlimitedReconnectRetries; - this.rejoinChannels = rejoinChannels; - } - - @NonNull - public static NetworkInfo create(int networkId) { - return new NetworkInfo( - networkId, - "<not initialized>", - 0, - null, - null, - null, - Collections.emptyList(), - false, - Collections.emptyList(), - false, - null, - null, - false, - null, - null, - false, - 60, - (short) 10, - false, - false - ); - } - - public boolean rejoinChannels() { - return rejoinChannels; - } - - public void _setRejoinChannels(boolean rejoinChannels) { - this.rejoinChannels = rejoinChannels; - } - - public int networkId() { - return networkId; - } - - public void _setNetworkId(int networkId) { - this.networkId = networkId; - _update(); - } - - public String networkName() { - return networkName; - } - - public void _setNetworkName(String networkName) { - this.networkName = networkName; - _update(); - } - - public int identity() { - return identity; - } - - public void _setIdentity(int identity) { - this.identity = identity; - _update(); - } - - public String codecForServer() { - return codecForServer; - } - - public void _setCodecForServer(String codecForServer) { - this.codecForServer = codecForServer; - _update(); - } - - public String codecForEncoding() { - return codecForEncoding; - } - - public void _setCodecForEncoding(String codecForEncoding) { - this.codecForEncoding = codecForEncoding; - _update(); - } - - public String codecForDecoding() { - return codecForDecoding; - } - - public void _setCodecForDecoding(String codecForDecoding) { - this.codecForDecoding = codecForDecoding; - _update(); - } - - public List<NetworkServer> serverList() { - return serverList; - } - - public void _setServerList(List<NetworkServer> serverList) { - this.serverList = serverList; - _update(); - } - - public boolean useRandomServer() { - return useRandomServer; - } - - public void _setUseRandomServer(boolean useRandomServer) { - this.useRandomServer = useRandomServer; - _update(); - } - - public List<String> perform() { - return perform; - } - - public void _setPerform(List<String> perform) { - this.perform = perform; - _update(); - } - - public boolean useAutoIdentify() { - return useAutoIdentify; - } - - public void _setUseAutoIdentify(boolean useAutoIdentify) { - this.useAutoIdentify = useAutoIdentify; - _update(); - } - - public String autoIdentifyService() { - return autoIdentifyService; - } - - public void _setAutoIdentifyService(String autoIdentifyService) { - this.autoIdentifyService = autoIdentifyService; - _update(); - } - - public String autoIdentifyPassword() { - return autoIdentifyPassword; - } - - public void _setAutoIdentifyPassword(String autoIdentifyPassword) { - this.autoIdentifyPassword = autoIdentifyPassword; - _update(); - } - - public boolean useSasl() { - return useSasl; - } - - public void _setUseSasl(boolean useSasl) { - this.useSasl = useSasl; - _update(); - } - - public String saslAccount() { - return saslAccount; - } - - public void _setSaslAccount(String saslAccount) { - this.saslAccount = saslAccount; - _update(); - } - - public String saslPassword() { - return saslPassword; - } - - public void _setSaslPassword(String saslPassword) { - this.saslPassword = saslPassword; - _update(); - } - - public boolean useAutoReconnect() { - return useAutoReconnect; - } - - public void _setUseAutoReconnect(boolean useAutoReconnect) { - this.useAutoReconnect = useAutoReconnect; - _update(); - } - - public int autoReconnectInterval() { - return autoReconnectInterval; - } - - public void _setAutoReconnectInterval(int autoReconnectInterval) { - this.autoReconnectInterval = autoReconnectInterval; - _update(); - } - - public short autoReconnectRetries() { - return autoReconnectRetries; - } - - public void _setAutoReconnectRetries(short autoReconnectRetries) { - this.autoReconnectRetries = autoReconnectRetries; - _update(); - } - - public boolean unlimitedReconnectRetries() { - return unlimitedReconnectRetries; - } - - public void _setUnlimitedReconnectRetries(boolean unlimitedReconnectRetries) { - this.unlimitedReconnectRetries = unlimitedReconnectRetries; - _update(); - } - - private void _update() { - setChanged(); - notifyObservers(); - } - - @Override - public boolean equals(@Nullable Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - NetworkInfo that = (NetworkInfo) o; - - return (networkId == that.networkId && - identity == that.identity && - useRandomServer == that.useRandomServer && - useAutoIdentify == that.useAutoIdentify && - useSasl == that.useSasl && - useAutoReconnect == that.useAutoReconnect && - autoReconnectInterval == that.autoReconnectInterval && - autoReconnectRetries == that.autoReconnectRetries && - unlimitedReconnectRetries == that.unlimitedReconnectRetries && - rejoinChannels == that.rejoinChannels && - Objects.equals(networkName, that.networkName) && - Objects.equals(codecForServer, that.codecForServer) && - Objects.equals(codecForEncoding, that.codecForEncoding) && - Objects.equals(codecForDecoding, that.codecForDecoding) && - Objects.equals(serverList, that.serverList) && - Objects.equals(perform, that.perform) && - Objects.equals(autoIdentifyService, that.autoIdentifyService) && - Objects.equals(autoIdentifyPassword, that.autoIdentifyPassword) && - Objects.equals(saslAccount, that.saslAccount) && - Objects.equals(saslPassword, that.saslPassword) - ); - - } - - @Override - public int hashCode() { - int result = networkId; - result = 31 * result + (networkName != null ? networkName.hashCode() : 0); - result = 31 * result + identity; - result = 31 * result + (codecForServer != null ? codecForServer.hashCode() : 0); - result = 31 * result + (codecForEncoding != null ? codecForEncoding.hashCode() : 0); - result = 31 * result + (codecForDecoding != null ? codecForDecoding.hashCode() : 0); - result = 31 * result + (serverList != null ? serverList.hashCode() : 0); - result = 31 * result + (useRandomServer ? 1 : 0); - result = 31 * result + (perform != null ? perform.hashCode() : 0); - result = 31 * result + (useAutoIdentify ? 1 : 0); - result = 31 * result + (autoIdentifyService != null ? autoIdentifyService.hashCode() : 0); - result = 31 * result + (autoIdentifyPassword != null ? autoIdentifyPassword.hashCode() : 0); - result = 31 * result + (useSasl ? 1 : 0); - result = 31 * result + (saslAccount != null ? saslAccount.hashCode() : 0); - result = 31 * result + (saslPassword != null ? saslPassword.hashCode() : 0); - result = 31 * result + (useAutoReconnect ? 1 : 0); - result = 31 * result + autoReconnectInterval; - result = 31 * result + (int) autoReconnectRetries; - result = 31 * result + (unlimitedReconnectRetries ? 1 : 0); - result = 31 * result + (rejoinChannels ? 1 : 0); - return result; - } - - @Override - public String toString() { - return "NetworkInfo{" + - "networkId=" + networkId + - ", networkName='" + networkName + '\'' + - ", identity=" + identity + - ", codecForServer='" + codecForServer + '\'' + - ", codecForEncoding='" + codecForEncoding + '\'' + - ", codecForDecoding='" + codecForDecoding + '\'' + - ", serverList=" + serverList + - ", useRandomServer=" + useRandomServer + - ", perform=" + perform + - ", useAutoIdentify=" + useAutoIdentify + - ", autoIdentifyService='" + autoIdentifyService + '\'' + - ", autoIdentifyPassword='" + autoIdentifyPassword + '\'' + - ", useSasl=" + useSasl + - ", saslAccount='" + saslAccount + '\'' + - ", saslPassword='" + saslPassword + '\'' + - ", useAutoReconnect=" + useAutoReconnect + - ", autoReconnectInterval=" + autoReconnectInterval + - ", autoReconnectRetries=" + autoReconnectRetries + - ", unlimitedReconnectRetries=" + unlimitedReconnectRetries + - ", rejoinChannels=" + rejoinChannels + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QAliasManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QAliasManager.java deleted file mode 100644 index 08588cf85..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QAliasManager.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; - -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.objects.types.Command; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -public interface QAliasManager extends QObservable<QAliasManager> { - boolean contains(final String name); - - boolean isEmpty(); - - int count(); - - AndroidObservableSortedList<Alias> aliases(); - - AndroidObservableSortedList<Alias> defaults(); - - // TODO: specify later on - @NonNull - List<Command> processInput(final BufferInfo info, final String message); - - void _update(Map<String, QVariant> from); - - void _update(QAliasManager from); - - @Synced - void addAlias(final String name, final String expansion); - - void _addAlias(final String name, final String expansion); - - void _addAlias(Alias alias); - - void _removeAlias(Alias alias); - - Alias alias(String name); - - void requestUpdate(Map<String, QVariant<Object>> variantMap); - - void requestUpdate(); - - class Alias { - public final String name; - public final String expansion; - - public Alias(String name, String expansion) { - this.name = name; - this.expansion = expansion; - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java deleted file mode 100644 index 3e7bc60e7..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBacklogManager.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; - -import java.util.List; -import java.util.Set; - -import de.kuschku.libquassel.localtypes.BacklogFilter; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.util.observables.lists.AndroidObservableComparableSortedList; - -public interface QBacklogManager extends QSyncableObject<QBacklogManager> { - void requestMoreBacklog(int bufferId, int amount); - - void requestBacklogInitial(int id, int amount); - - @Synced - void requestBacklog(int id, int first, int last, int limit, int additional); - - void _requestBacklog(int id, int first, int last, int limit, int additional); - - @Synced - void receiveBacklog(int id, int first, int last, int limit, int additional, @NonNull List<Message> messages); - - void _receiveBacklog(int id, int first, int last, int limit, int additional, @NonNull List<Message> messages); - - @Synced - void requestBacklogAll(int first, int last, int limit, int additional); - - void _requestBacklogAll(int first, int last, int limit, int additional); - - @Synced - void receiveBacklogAll(int first, int last, int limit, int additional, @NonNull List<Message> messages); - - void _receiveBacklogAll(int first, int last, int limit, int additional, @NonNull List<Message> messages); - - @NonNull - BacklogFilter filter(int id); - - @NonNull - AndroidObservableComparableSortedList<Message> unfiltered(int id); - - @NonNull - AndroidObservableComparableSortedList<Message> filtered(int id); - - void setOpen(int bufferId); - - void open(int bufferId); - - int open(); - - void receiveBacklog(Message msg); - - int waitingMax(); - - @NonNull - Set<Integer> waiting(); - - void checkWaiting(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java deleted file mode 100644 index e9874cfda..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferSyncer.java +++ /dev/null @@ -1,121 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.util.SparseIntArray; - -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.util.observables.lists.ObservableElement; -import de.kuschku.util.observables.lists.ObservableSet; - -public interface QBufferSyncer extends QObservable<QBufferSyncer> { - int lastSeenMsg(int buffer); - - int markerLine(int buffer); - - @Synced - void setLastSeenMsg(int buffer, final int msgId); - - void _setLastSeenMsg(int buffer, final int msgId); - - @Synced - void requestSetLastSeenMsg(int buffer, final int msgId); - - void _requestSetLastSeenMsg(int buffer, final int msgId); - - @Synced - void setMarkerLine(int buffer, final int msgId); - - void _setMarkerLine(int buffer, final int msgId); - - @Synced - void requestSetMarkerLine(int buffer, final int msgId); - - void _requestSetMarkerLine(int buffer, final int msgId); - - @Synced - void requestRemoveBuffer(int buffer); - - void _requestRemoveBuffer(int buffer); - - @Synced - void removeBuffer(int buffer); - - void _removeBuffer(int buffer); - - @Synced - void requestRenameBuffer(int buffer, String newName); - - void _requestRenameBuffer(int buffer, String newName); - - @Synced - void renameBuffer(int buffer, String newName); - - void _renameBuffer(int buffer, String newName); - - @Synced - void requestMergeBuffersPermanently(int buffer1, int buffer2); - - void _requestMergeBuffersPermanently(int buffer1, int buffer2); - - @Synced - void mergeBuffersPermanently(int buffer1, int buffer2); - - void _mergeBuffersPermanently(int buffer1, int buffer2); - - @Synced - void requestPurgeBufferIds(); - - void _requestPurgeBufferIds(); - - @Synced - void requestMarkBufferAsRead(int buffer); - - void _requestMarkBufferAsRead(int buffer); - - @Synced - void markBufferAsRead(int buffer); - - void _markBufferAsRead(int buffer); - - - ObservableElement<Integer> activity(int bufferid); - - void setActivity(int bufferid, int activity); - - void addActivity(int bufferid, int activity); - - void addActivity(int bufferid, Message.Type type); - - void addActivity(Message message); - - SparseIntArray lastSeenMsgs(); - - SparseIntArray markerLines(); - - ObservableSet<Message.Type> getFilteredTypes(int bufferId); - - void setFilters(int bufferId, int filters); - - int getFilters(int bufferId); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java deleted file mode 100644 index 434e55c02..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewConfig.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.util.observables.lists.ObservableList; -import de.kuschku.util.observables.lists.ObservableSet; - -public interface QBufferViewConfig extends QSyncableObject<QBufferViewConfig> { - - int bufferViewId(); - - String bufferViewName(); - - @Synced - void setBufferViewName(final String bufferViewName); - - void _setBufferViewName(final String bufferViewName); - - int networkId(); - - @Synced - void setNetworkId(final int networkId); - - void _setNetworkId(final int networkId); - - boolean addNewBuffersAutomatically(); - - @Synced - void setAddNewBuffersAutomatically(boolean addNewBuffersAutomatically); - - void _setAddNewBuffersAutomatically(boolean addNewBuffersAutomatically); - - boolean sortAlphabetically(); - - @Synced - void setSortAlphabetically(boolean sortAlphabetically); - - void _setSortAlphabetically(boolean sortAlphabetically); - - boolean disableDecoration(); - - @Synced - void setDisableDecoration(boolean disableDecoration); - - void _setDisableDecoration(boolean disableDecoration); - - int allowedBufferTypes(); - - boolean isBufferTypeAllowed(BufferInfo.Type type); - - void setBufferTypeAllowed(BufferInfo.Type type, boolean allowed); - - @Synced - void setAllowedBufferTypes(int bufferTypes); - - void _setAllowedBufferTypes(int bufferTypes); - - MinimumActivity minimumActivity(); - - @Synced - void setMinimumActivity(MinimumActivity activity); - - void _setMinimumActivity(MinimumActivity activity); - - void _setMinimumActivity(int activity); - - boolean hideInactiveBuffers(); - - @Synced - void setHideInactiveBuffers(boolean hideInactiveBuffers); - - void _setHideInactiveBuffers(boolean hideInactiveBuffers); - - boolean hideInactiveNetworks(); - - @Synced - void setHideInactiveNetworks(boolean hideInactiveNetworks); - - void _setHideInactiveNetworks(boolean hideInactiveNetworks); - - @Synced - void requestSetBufferViewName(final String bufferViewName); - - void _requestSetBufferViewName(final String bufferViewName); - - @NonNull - ObservableList<Integer> bufferList(); - - @NonNull - ObservableSet<Integer> bufferIds(); - - @NonNull - ObservableSet<Integer> removedBuffers(); - - @NonNull - ObservableSet<Integer> temporarilyRemovedBuffers(); - - @Synced - void addBuffer(final int bufferId, int pos); - - void _addBuffer(final int bufferId, int pos); - - @Synced - void requestAddBuffer(final int bufferId, int pos); - - void _requestAddBuffer(final int bufferId, int pos); - - @Synced - void moveBuffer(final int bufferId, int pos); - - void _moveBuffer(final int bufferId, int pos); - - @Synced - void requestMoveBuffer(final int bufferId, int pos); - - void _requestMoveBuffer(final int bufferId, int pos); - - @Synced - void removeBuffer(final int bufferId); - - void _removeBuffer(final int bufferId); - - @Synced - void requestRemoveBuffer(final int bufferId); - - void _requestRemoveBuffer(final int bufferId); - - @Synced - void removeBufferPermanently(final int bufferId); - - void _removeBufferPermanently(final int bufferId); - - @Synced - void requestRemoveBufferPermanently(final int bufferId); - - void _requestRemoveBufferPermanently(final int bufferId); - - void init(int bufferViewConfigId); - - ObservableSet<QNetwork> networkList(); - - void deleteBuffer(int bufferId); - - void updateNetworks(); - - void checkAddBuffer(int id); - - DisplayType mayDisplay(Buffer buffer); - - @NonNull - ObservableSet<Integer> allBufferIds(); - - void checkAddBuffers(); - - enum DisplayType { - NONE, - ALWAYS, - TEMP_HIDDEN, - PERM_HIDDEN - } - - enum MinimumActivity { - NONE(0), - OTHER(1), - MESSAGE(2), - HIGHLIGHT(4); - - public final int id; - - MinimumActivity(int id) { - this.id = id; - } - - public static MinimumActivity fromId(int id) { - switch (id) { - default: - case 0: - return NONE; - case 1: - return OTHER; - case 2: - return MESSAGE; - case 4: - return HIGHLIGHT; - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewManager.java deleted file mode 100644 index b229c1409..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QBufferViewManager.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; - -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -public interface QBufferViewManager extends QSyncableObject<QBufferViewManager> { - @NonNull - AndroidObservableSortedList<QBufferViewConfig> bufferViewConfigs(); - - QBufferViewConfig bufferViewConfig(int bufferViewId); - - void _addBufferViewConfig(int bufferViewConfigId); - - void _addBufferViewConfig(final QBufferViewConfig bufferViewConfig); - - @Synced - void createBufferView(final QBufferViewConfig bufferView); - - @Synced - void createBufferViews(final List<QBufferViewConfig> bufferViewConfigs); - - @Synced - void deleteBufferView(int bufferViewId); - - @Synced - void deleteBufferViews(final List<Integer> bufferViews); - - void _deleteBufferViewConfig(int bufferViewConfigId); - - void checkForNewBuffers(int bufferId); - - Map<Integer, QBufferViewConfig> bufferViewConfigMap(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QCertManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QCertManager.java deleted file mode 100644 index aaf6e1af3..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QCertManager.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; - -import java.security.PrivateKey; -import java.security.cert.Certificate; - -import de.kuschku.libquassel.syncables.Synced; - -public interface QCertManager extends QObservable { - @NonNull - PrivateKey sslKey(); - - @Synced - void setSslKey(byte[] encoded); - - @NonNull - Certificate sslCert(); - - @Synced - void setSslCert(byte[] encoded); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QCoreInfo.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QCoreInfo.java deleted file mode 100644 index 2b4e7caa1..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QCoreInfo.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.Synced; - -public interface QCoreInfo extends QObservable<QCoreInfo> { - Map<String, QVariant> coreData(); - - @Synced - void setCoreData(final Map<String, QVariant> coreData); - - void _setCoreData(final Map<String, QVariant> coreData); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIdentity.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIdentity.java deleted file mode 100644 index cff83ed04..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIdentity.java +++ /dev/null @@ -1,202 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.Nullable; - -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.libquassel.syncables.types.impl.Identity; - -public interface QIdentity extends QObservable<QIdentity> { - void setToDefaults(); - - boolean isValid(); - - int id(); - - String identityName(); - - String realName(); - - List<String> nicks(); - - String awayNick(); - - boolean awayNickEnabled(); - - String awayReason(); - - boolean awayReasonEnabled(); - - boolean autoAwayEnabled(); - - int autoAwayTime(); - - String autoAwayReason(); - - boolean autoAwayReasonEnabled(); - - boolean detachAwayEnabled(); - - String detachAwayReason(); - - boolean detachAwayReasonEnabled(); - - String ident(); - - String kickReason(); - - String partReason(); - - String quitReason(); - - @Synced - void setId(int id); - - void _setId(int id); - - @Synced - void setIdentityName(final String name); - - void _setIdentityName(final String name); - - @Synced - void setRealName(final String realName); - - void _setRealName(final String realName); - - @Synced - void setNicks(final List<String> nicks); - - void _setNicks(final List<String> nicks); - - @Synced - void setAwayNick(final String awayNick); - - void _setAwayNick(final String awayNick); - - @Synced - void setAwayNickEnabled(boolean enabled); - - void _setAwayNickEnabled(boolean enabled); - - @Synced - void setAwayReason(final String awayReason); - - void _setAwayReason(final String awayReason); - - @Synced - void setAwayReasonEnabled(boolean enabled); - - void _setAwayReasonEnabled(boolean enabled); - - @Synced - void setAutoAwayEnabled(boolean enabled); - - void _setAutoAwayEnabled(boolean enabled); - - @Synced - void setAutoAwayTime(int time); - - void _setAutoAwayTime(int time); - - @Synced - void setAutoAwayReason(final String reason); - - void _setAutoAwayReason(final String reason); - - @Synced - void setAutoAwayReasonEnabled(boolean enabled); - - void _setAutoAwayReasonEnabled(boolean enabled); - - @Synced - void setDetachAwayEnabled(boolean enabled); - - void _setDetachAwayEnabled(boolean enabled); - - @Synced - void setDetachAwayReason(final String reason); - - void _setDetachAwayReason(final String reason); - - @Synced - void setDetachAwayReasonEnabled(boolean enabled); - - void _setDetachAwayReasonEnabled(boolean enabled); - - @Synced - void setIdent(final String ident); - - void _setIdent(final String ident); - - @Synced - void setKickReason(final String reason); - - void _setKickReason(final String reason); - - @Synced - void setPartReason(final String reason); - - void _setPartReason(final String reason); - - @Synced - void setQuitReason(final String reason); - - void _setQuitReason(final String reason); - - @Synced - void copyFrom(final QIdentity other); - - void _copyFrom(final QIdentity other); - - String sslKey(); - - @Nullable - String sslKeyPem(); - - String sslCert(); - - @Nullable - String sslCertPem(); - - @Synced - void setSslKey(final String encoded); - - void _setSslKey(final String encoded); - - @Synced - void setSslCert(final String encoded); - - void _setSslCert(final String encoded); - - @Synced - void update(Identity identity); - - void _update(QIdentity identity); - - void _update(Map<String, QVariant> identity); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java deleted file mode 100644 index e088534fc..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.libquassel.syncables.types.impl.IgnoreListManager; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -public interface QIgnoreListManager extends QObservable<QIgnoreListManager> { - @Synced - void removeIgnoreListItem(final String ignoreRule); - - void _removeIgnoreListItem(final String ignoreRule); - - @Synced - void toggleIgnoreRule(final String ignoreRule); - - void _toggleIgnoreRule(final String ignoreRule); - - @Synced - void addIgnoreListItem(IgnoreType type, final String ignoreRule, boolean isRegEx, StrictnessType strictness, ScopeType scope, final String scopeRule, boolean isActive); - - @Synced - void addIgnoreListItem(int type, final String ignoreRule, boolean isRegEx, int strictness, int scope, final String scopeRule, boolean isActive); - - void _addIgnoreListItem(int type, final String ignoreRule, boolean isRegEx, int strictness, int scope, final String scopeRule, boolean isActive); - - void _addIgnoreListItem(IgnoreListManager.IgnoreListItem item); - - StrictnessType match(String msgContents, String msgSender, Message.Type msgType, String network, String bufferName); - - boolean matches(Message message, QNetwork network); - - void _update(Map<String, QVariant> from); - - void _update(QIgnoreListManager from); - - void requestUpdate(Map<String, QVariant<Object>> variantMap); - - void requestUpdate(); - - AndroidObservableSortedList<? extends IgnoreListManager.IgnoreListItem> ignoreList(); - - void _toggleIgnoreRule(IgnoreListManager.IgnoreListItem ignoreRule, boolean active); - - enum IgnoreType { - SenderIgnore(0), - MessageIgnore(1), - CtcpIgnore(2); - - public final int value; - - IgnoreType(int value) { - this.value = value; - } - - @NonNull - public static IgnoreType of(int id) { - switch (id) { - case 1: - return MessageIgnore; - case 2: - return CtcpIgnore; - default: - case 0: - return SenderIgnore; - } - } - } - - enum StrictnessType { - UnmatchedStrictness(0), - SoftStrictness(1), - HardStrictness(2); - - public final int value; - - StrictnessType(int value) { - this.value = value; - } - - @NonNull - public static StrictnessType of(int id) { - switch (id) { - default: - case 0: - return UnmatchedStrictness; - case 1: - return SoftStrictness; - case 2: - return HardStrictness; - } - } - } - - enum ScopeType { - GlobalScope(0), - NetworkScope(1), - ChannelScope(2); - - public final int value; - - ScopeType(int value) { - this.value = value; - } - - @NonNull - public static ScopeType of(int id) { - switch (id) { - case 1: - return NetworkScope; - case 2: - return ChannelScope; - default: - case 0: - return GlobalScope; - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java deleted file mode 100644 index e210f60c8..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcChannel.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.List; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.util.observables.lists.ObservableSortedList; - -public interface QIrcChannel extends QObservable<QIrcChannel> { - boolean isKnownUser(QIrcUser ircuser); - - boolean isValidChannelUserMode(final String mode); - - String name(); - - String topic(); - - String password(); - - boolean encrypted(); - - QNetwork network(); - - @NonNull - List<String> ircUsers(); - - String userModes(QIrcUser ircuser); - - String userModes(final String nick); - - boolean hasMode(final char mode); - - String modeValue(final char mode); - - List<String> modeValueList(final char mode); - - String channelModeString(); - - String codecForEncoding(); - - String codecForDecoding(); - - void setCodecForEncoding(final String codecName); - - void setCodecForDecoding(final String codecName); - - @Synced - void setTopic(final String topic); - - void _setTopic(final String topic); - - @Synced - void setPassword(final String password); - - void _setPassword(final String password); - - @Synced - void setEncrypted(boolean encrypted); - - void _setEncrypted(boolean encrypted); - - // Disabled due to type erasure - //@Synced void joinIrcUsers(final List<IrcUser> users, final List<String> modes); - //void _joinIrcUsers(final List<IrcUser> users, final List<String> modes); - - @Synced - void joinIrcUsers(final List<String> nicks, final List<String> modes); - - void _joinIrcUsers(final List<String> nicks, final List<String> modes); - - @Synced - void joinIrcUser(QIrcUser ircuser); - - void _joinIrcUser(QIrcUser ircuser); - - @Synced - void part(QIrcUser ircuser); - - void _part(QIrcUser ircuser); - - @Synced - void part(final String nick); - - void _part(final String nick); - - @Synced - void setUserModes(QIrcUser ircuser, final String modes); - - void _setUserModes(QIrcUser ircuser, final String modes); - - @Synced - void setUserModes(final String nick, final String modes); - - void _setUserModes(final String nick, final String modes); - - @Synced - void addUserMode(QIrcUser ircuser, final String mode); - - void _addUserMode(QIrcUser ircuser, final String mode); - - @Synced - void addUserMode(final String nick, final String mode); - - void _addUserMode(final String nick, final String mode); - - @Synced - void removeUserMode(QIrcUser ircuser, final String mode); - - void _removeUserMode(QIrcUser ircuser, final String mode); - - @Synced - void removeUserMode(final String nick, final String mode); - - void _removeUserMode(final String nick, final String mode); - - @Synced - void addChannelMode(final char mode, final String value); - - void _addChannelMode(final char mode, final String value); - - @Synced - void removeChannelMode(final char mode, final String value); - - void _removeChannelMode(final char mode, final String value); - - void init(QNetwork network, Client client); - - @Nullable - String getObjectName(); - - @NonNull - ObservableSortedList<String> users(); - - void _ircUserNickChanged(String oldNick, String newNick); - - List<Character> modeList(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java deleted file mode 100644 index c34bfac42..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIrcUser.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import org.joda.time.DateTime; - -import java.util.List; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.syncables.Synced; - -public interface QIrcUser extends QObservable<QIrcUser> { - String user(); - - String host(); - - String nick(); - - String realName(); - - String hostmask(); - - String account(); - - boolean isAway(); - - @Synced - void setAway(final boolean away); - - String awayMessage(); - - DateTime idleTime(); - - DateTime loginTime(); - - String server(); - - String ircOperator(); - - int lastAwayMessage(); - - String whoisServiceReply(); - - String suserHost(); - - boolean encrypted(); - - QNetwork network(); - - @NonNull - String userModes(); - - @NonNull - List<String> channels(); - - DateTime lastChannelActivity(int id); - - void setLastChannelActivity(int id, final DateTime time); - - DateTime lastSpokenTo(int id); - - void setLastSpokenTo(int id, final DateTime time); - - @Synced - void setUser(final String user); - - void _setUser(final String user); - - @Synced - void setHost(final String host); - - void _setHost(final String host); - - @Synced - void setNick(final String nick); - - void _setNick(final String nick); - - @Synced - void setRealName(final String realName); - - void _setRealName(final String realName); - - @Synced - void setAccount(final String account); - - void _setAccount(final String account); - - void _setAway(final boolean away); - - @Synced - void setAwayMessage(final String awayMessage); - - void _setAwayMessage(final String awayMessage); - - @Synced - void setIdleTime(final DateTime idleTime); - - void _setIdleTime(final DateTime idleTime); - - @Synced - void setLoginTime(final DateTime loginTime); - - void _setLoginTime(final DateTime loginTime); - - @Synced - void setServer(final String server); - - void _setServer(final String server); - - @Synced - void setIrcOperator(final String ircOperator); - - void _setIrcOperator(final String ircOperator); - - @Synced - void setLastAwayMessage(final int lastAwayMessage); - - void _setLastAwayMessage(final int lastAwayMessage); - - @Synced - void setWhoisServiceReply(final String whoisServiceReply); - - void _setWhoisServiceReply(final String whoisServiceReply); - - @Synced - void setSuserHost(final String suserHost); - - void _setSuserHost(final String suserHost); - - @Synced - void setEncrypted(boolean encrypted); - - void _setEncrypted(boolean encrypted); - - @Synced - void updateHostmask(final String mask); - - void _updateHostmask(final String mask); - - @Synced - void setUserModes(final String modes); - - void _setUserModes(final String modes); - - - @Synced - void joinChannel(QIrcChannel channel); - - void _joinChannel(QIrcChannel channel); - - @Synced - void joinChannel(QIrcChannel channel, boolean skip_channel_join); - - void _joinChannel(QIrcChannel channel, boolean skip_channel_join); - - @Synced - void joinChannel(final String channelname); - - void _joinChannel(final String channelname); - - @Synced - void partChannel(QIrcChannel channel); - - void _partChannel(QIrcChannel channel); - - @Synced - void partChannel(QIrcChannel channel, boolean skip_channel_part); - - void _partChannel(QIrcChannel channel, boolean skip_channel_part); - - @Synced - void partChannel(final String channelname); - - void _partChannel(final String channelname); - - @Synced - void quit(); - - void _quit(); - - @Synced - void addUserModes(final String modes); - - void _addUserModes(final String modes); - - @Synced - void removeUserModes(final String modes); - - void _removeUserModes(final String modes); - - void init(QNetwork network, Client client); - - @Nullable - String getObjectName(); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java deleted file mode 100644 index 517ce6be7..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetwork.java +++ /dev/null @@ -1,419 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.List; - -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.syncables.Synced; -import de.kuschku.libquassel.syncables.types.impl.IrcChannel; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.util.irc.IrcCaseMappers; -import de.kuschku.util.irc.chanmodes.IrcModeProvider; - -public interface QNetwork extends QObservable<QNetwork> { - int networkId(); - - boolean isMyNick(final String nick); - - boolean isMe(QIrcUser ircuser); - - boolean isChannelName(final String channelname); - - boolean isConnected(); - - @Synced - void setConnected(boolean isConnected); - - ConnectionState connectionState(); - - String prefixToMode(final char prefix); - - String prefixToMode(final String prefix); - - String modeToPrefix(final char mode); - - String modeToPrefix(final String mode); - - int modeToIndex(String mode); - - int lowestModeIndex(String mode); - - @NonNull - ChannelModeType channelModeType(final char mode); - - @NonNull - ChannelModeType channelModeType(final String mode); - - String networkName(); - - String currentServer(); - - String myNick(); - - int latency(); - - QIrcUser me(); - - int identity(); - - @NonNull - List<String> nicks(); - - @NonNull - List<String> channels(); - - List<NetworkServer> serverList(); - - boolean useRandomServer(); - - List<String> perform(); - - boolean useAutoIdentify(); - - String autoIdentifyService(); - - String autoIdentifyPassword(); - - boolean useSasl(); - - String saslAccount(); - - String saslPassword(); - - boolean useAutoReconnect(); - - int autoReconnectInterval(); - - short autoReconnectRetries(); - - boolean unlimitedReconnectRetries(); - - boolean rejoinChannels(); - - NetworkInfo networkInfo(); - - List<String> prefixes(); - - List<String> prefixModes(); - - IrcModeProvider modeProvider(); - - void determinePrefixes(); - - boolean supports(final String param); - - String support(final String param); - - QIrcUser ircUser(final String nickname); - - @NonNull - List<QIrcUser> ircUsers(); - - int ircUserCount(); - - QIrcChannel newIrcChannel(final String channelname); - - @Nullable - QIrcChannel ircChannel(final String channelname); - - @NonNull - List<QIrcChannel> ircChannels(); - - int ircChannelCount(); - - String codecForServer(); - - String codecForEncoding(); - - String codecForDecoding(); - - String defaultCodecForServer(); - - String defaultCodecForEncoding(); - - String defaultCodecForDecoding(); - - void setDefaultCodecForServer(final String name); - - void setDefaultCodecForEncoding(final String name); - - void setDefaultCodecForDecoding(final String name); - - boolean autoAwayActive(); - - @Synced - void setAutoAwayActive(boolean active); - - void _setAutoAwayActive(boolean active); - - @Synced - void setNetworkName(final String networkName); - - void _setNetworkName(final String networkName); - - @Synced - void setCurrentServer(final String currentServer); - - void _setCurrentServer(final String currentServer); - - void _setConnected(boolean isConnected); - - @Synced - void setConnectionState(int state); - - void _setConnectionState(int state); - - @Synced - void setMyNick(final String mynick); - - void _setMyNick(final String mynick); - - @Synced - void setLatency(int latency); - - void _setLatency(int latency); - - @Synced - void setIdentity(int identityId); - - void _setIdentity(int identityId); - - @Synced - void setServerList(final List<NetworkServer> serverList); - - void _setServerList(final List<NetworkServer> serverList); - - @Synced - void setUseRandomServer(boolean useRandomServer); - - void _setUseRandomServer(boolean useRandomServer); - - @Synced - void setPerform(final List<String> performs); - - void _setPerform(final List<String> performs); - - @Synced - void setUseAutoIdentify(boolean useAutoIdentify); - - void _setUseAutoIdentify(boolean useAutoIdentify); - - @Synced - void setAutoIdentifyService(final String autoIdentifyService); - - void _setAutoIdentifyService(final String autoIdentifyService); - - @Synced - void setAutoIdentifyPassword(final String autoIdentifyPassword); - - void _setAutoIdentifyPassword(final String autoIdentifyPassword); - - @Synced - void setUseSasl(boolean useSasl); - - void setSaslPassword(final String saslPassword); - - void _setUseSasl(boolean useSasl); - - @Synced - void setSaslAccount(final String saslAccount); - - void _setSaslAccount(final String saslAccount); - - @Synced - void _setSaslPassword(final String saslPassword); - - @Synced - void setUseAutoReconnect(boolean useAutoReconnect); - - void _setUseAutoReconnect(boolean useAutoReconnect); - - @Synced - void setAutoReconnectInterval(int autoReconnectInterval); - - void _setAutoReconnectInterval(int autoReconnectInterval); - - @Synced - void setAutoReconnectRetries(short autoReconnectRetries); - - void _setAutoReconnectRetries(short autoReconnectRetries); - - @Synced - void setUnlimitedReconnectRetries(boolean unlimitedReconnectRetries); - - void _setUnlimitedReconnectRetries(boolean unlimitedReconnectRetries); - - @Synced - void setRejoinChannels(boolean rejoinChannels); - - void _setRejoinChannels(boolean rejoinChannels); - - @Synced - void setCodecForServer(final String codecName); - - void _setCodecForServer(final String codecName); - - @Synced - void setCodecForEncoding(final String codecName); - - void _setCodecForEncoding(final String codecName); - - @Synced - void setCodecForDecoding(final String codecName); - - void _setCodecForDecoding(final String codecName); - - @Synced - void addSupport(final String param); - - void _addSupport(final String param); - - @Synced - void addSupport(final String param, final String value); - - void _addSupport(final String param, final String value); - - @Synced - void removeSupport(final String param); - - void _removeSupport(final String param); - - @Synced - void addIrcUser(final String hostmask); - - void _addIrcUser(final String hostmask); - - @Synced - void addIrcChannel(final String channel); - - void _addIrcChannel(final String channel); - - @Synced - QIrcUser updateNickFromMask(final String mask); - - QIrcUser _updateNickFromMask(final String mask); - - void ircUserNickChanged(String oldNick, String newnick); - - @Synced - void connect(); - - void _connect(); - - @Synced - void disconnect(); - - void _disconnect(); - - @Synced - void setNetworkInfo(final NetworkInfo info); - - void _setNetworkInfo(final NetworkInfo info); - - @Synced - void removeIrcUser(QIrcUser ircuser); - - void _removeIrcUser(QIrcUser ircuser); - - @Synced - void removeIrcChannel(QIrcChannel ircChannel); - - void _removeIrcChannel(QIrcChannel ircChannel); - - @Synced - void removeChansAndUsers(); - - void _removeChansAndUsers(); - - void _addIrcChannel(IrcChannel ircChannel); - - IrcCaseMappers.IrcCaseMapper caseMapper(); - - enum ConnectionState { - Disconnected(0), - Connecting(1), - Initializing(2), - Initialized(3), - Reconnecting(4), - Disconnecting(5); - - public final int value; - - ConnectionState(int value) { - this.value = value; - } - - @NonNull - public static ConnectionState of(int id) { - switch (id) { - case 1: - return Connecting; - case 2: - return Initializing; - case 3: - return Initialized; - case 4: - return Reconnecting; - case 5: - return Disconnecting; - default: - case 0: - return Disconnected; - } - } - } - - enum ChannelModeType { - NOT_A_CHANMODE(-1), - A_CHANMODE(0), - B_CHANMODE(1), - C_CHANMODE(2), - D_CHANMODE(3); - - public final int id; - - ChannelModeType(int id) { - this.id = id; - } - - @NonNull - public static ChannelModeType of(int id) { - switch (id) { - case 0: - return A_CHANMODE; - case 1: - return B_CHANMODE; - case 2: - return C_CHANMODE; - case 3: - return D_CHANMODE; - default: - case -1: - return NOT_A_CHANMODE; - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetworkConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetworkConfig.java deleted file mode 100644 index 8e2438bea..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QNetworkConfig.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import de.kuschku.libquassel.syncables.Synced; - -public interface QNetworkConfig extends QObservable<QNetworkConfig> { - boolean pingTimeoutEnabled(); - - @Synced - void setPingTimeoutEnabled(boolean pingTimeoutEnabled); - - void _setPingTimeoutEnabled(boolean pingTimeoutEnabled); - - @Synced - void requestSetPingTimeoutEnabled(boolean pingTimeoutEnabled); - - void _requestSetPingTimeoutEnabled(boolean pingTimeoutEnabled); - - int pingInterval(); - - @Synced - void setPingInterval(int pingInterval); - - void _setPingInterval(int pingInterval); - - @Synced - void requestSetPingInterval(int pingInterval); - - void _requestSetPingInterval(int pingInterval); - - int maxPingCount(); - - @Synced - void setMaxPingCount(int maxPingCount); - - void _setMaxPingCount(int maxPingCount); - - @Synced - void requestSetMaxPingCount(int maxPingCount); - - void _requestSetMaxPingCount(int maxPingCount); - - boolean autoWhoEnabled(); - - @Synced - void setAutoWhoEnabled(boolean autoWhoEnabled); - - void _setAutoWhoEnabled(boolean autoWhoEnabled); - - @Synced - void requestSetAutoWhoEnabled(boolean autoWhoEnabled); - - void _requestSetAutoWhoEnabled(boolean autoWhoEnabled); - - int autoWhoInterval(); - - @Synced - void setAutoWhoInterval(int autoWhoInterval); - - void _setAutoWhoInterval(int autoWhoInterval); - - @Synced - void requestSetAutoWhoInterval(int autoWhoInterval); - - void _requestSetAutoWhoInterval(int autoWhoInterval); - - int autoWhoNickLimit(); - - @Synced - void setAutoWhoNickLimit(int autoWhoNickLimit); - - void _setAutoWhoNickLimit(int autoWhoNickLimit); - - @Synced - void requestSetAutoWhoNickLimit(int autoWhoNickLimit); - - void _requestSetAutoWhoNickLimit(int autoWhoNickLimit); - - int autoWhoDelay(); - - @Synced - void setAutoWhoDelay(int autoWhoDelay); - - void _setAutoWhoDelay(int autoWhoDelay); - - @Synced - void requestSetAutoWhoDelay(int autoWhoDelay); - - void _requestSetAutoWhoDelay(int autoWhoDelay); - - boolean standardCtcp(); - - @Synced - void setStandardCtcp(boolean standardCtcp); - - void _setStandardCtcp(boolean standardCtcp); - - @Synced - void requestSetStandardCtcp(boolean standardCtcp); - - void _requestSetStandardCtcp(boolean standardCtcp); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QObservable.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QObservable.java deleted file mode 100644 index 3bdb7f388..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QObservable.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import de.kuschku.util.observables.callbacks.GeneralCallback; - -public interface QObservable<T> { - void addObserver(GeneralCallback<T> o); - - void deleteObserver(GeneralCallback<T> o); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QSyncableObject.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QSyncableObject.java deleted file mode 100644 index 436738044..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QSyncableObject.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.interfaces; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.Map; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.primitives.types.QVariant; - -public interface QSyncableObject<T> extends QObservable<T> { - void syncVar(@NonNull String methodName, @NonNull Object... params); - - void sync(@NonNull String methodName, @NonNull Object[] params); - - void rpcVar(@NonNull String procedureName, @NonNull Object... params); - - void rpc(@NonNull String procedureName, @NonNull Object[] params); - - void _update(Map<String, QVariant> from); - - void _update(T from); - - void renameObject(String newName); - - @Nullable - String getObjectName(); - - void setObjectName(@Nullable String objectName); - - void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client); -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IAliasManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IAliasManager.java deleted file mode 100644 index 979a72de5..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IAliasManager.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QAliasManager; - -public class IAliasManager implements Invoker<QAliasManager> { - @NonNull - private static final IAliasManager invoker = new IAliasManager(); - - private IAliasManager() { - } - - @NonNull - public static IAliasManager get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QAliasManager obj) throws SyncInvocationException { - switch (function.methodName) { - case "addAlias": { - obj._addAlias((String) function.params.get(0), (String) function.params.get(1)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBacklogManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBacklogManager.java deleted file mode 100644 index 1d5d8619f..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBacklogManager.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; - -public class IBacklogManager implements Invoker<QBacklogManager> { - @NonNull - private static final IBacklogManager invoker = new IBacklogManager(); - - private IBacklogManager() { - } - - @NonNull - public static IBacklogManager get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QBacklogManager obj) throws SyncInvocationException { - switch (function.methodName) { - case "receiveBacklog": { - obj._receiveBacklog((int) function.params.get(0), (int) function.params.get(1), (int) function.params.get(2), (int) function.params.get(3), (int) function.params.get(4), (List<Message>) function.params.get(5)); - } - break; - case "receiveBacklogAll": { - obj._receiveBacklogAll((int) function.params.get(0), (int) function.params.get(1), (int) function.params.get(2), (int) function.params.get(3), (List<Message>) function.params.get(4)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferSyncer.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferSyncer.java deleted file mode 100644 index 0f5fe0d24..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferSyncer.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferSyncer; - -public class IBufferSyncer implements Invoker<QBufferSyncer> { - @NonNull - private static final IBufferSyncer invoker = new IBufferSyncer(); - - private IBufferSyncer() { - } - - @NonNull - public static IBufferSyncer get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QBufferSyncer obj) throws SyncInvocationException { - switch (function.methodName) { - case "setLastSeenMsg": { - obj._setLastSeenMsg((int) function.params.get(0), (int) function.params.get(1)); - } - break; - case "setMarkerLine": { - obj._setMarkerLine((int) function.params.get(0), (int) function.params.get(1)); - } - break; - case "removeBuffer": { - obj._removeBuffer((int) function.params.get(0)); - } - break; - case "renameBuffer": { - obj._renameBuffer((int) function.params.get(0), (String) function.params.get(1)); - } - break; - case "mergeBuffersPermanently": { - obj._mergeBuffersPermanently((int) function.params.get(0), (int) function.params.get(1)); - } - break; - case "markBufferAsRead": { - obj._markBufferAsRead((int) function.params.get(0)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferViewConfig.java deleted file mode 100644 index 49c326689..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferViewConfig.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; - -public class IBufferViewConfig implements Invoker<QBufferViewConfig> { - @NonNull - private static final IBufferViewConfig invoker = new IBufferViewConfig(); - - private IBufferViewConfig() { - } - - @NonNull - public static IBufferViewConfig get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QBufferViewConfig obj) throws SyncInvocationException { - switch (function.methodName) { - case "setBufferViewName": { - obj._setBufferViewName((String) function.params.get(0)); - } - break; - case "setNetworkId": { - obj._setNetworkId((int) function.params.get(0)); - } - break; - case "setAddNewBuffersAutomatically": { - obj._setAddNewBuffersAutomatically((boolean) function.params.get(0)); - } - break; - case "setSortAlphabetically": { - obj._setSortAlphabetically((boolean) function.params.get(0)); - } - break; - case "setDisableDecoration": { - obj._setDisableDecoration((boolean) function.params.get(0)); - } - break; - case "setAllowedBufferTypes": { - obj._setAllowedBufferTypes((int) function.params.get(0)); - } - break; - case "setMinimumActivity": { - obj._setMinimumActivity((int) function.params.get(0)); - } - break; - case "setHideInactiveBuffers": { - obj._setHideInactiveBuffers((boolean) function.params.get(0)); - } - break; - case "setHideInactiveNetworks": { - obj._setHideInactiveNetworks((boolean) function.params.get(0)); - } - break; - case "addBuffer": { - obj._addBuffer((int) function.params.get(0), (int) function.params.get(1)); - } - break; - case "moveBuffer": { - obj._moveBuffer((int) function.params.get(0), (int) function.params.get(1)); - } - break; - case "removeBuffer": { - obj._removeBuffer((int) function.params.get(0)); - } - break; - case "removeBufferPermanently": { - obj._removeBufferPermanently((int) function.params.get(0)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferViewManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferViewManager.java deleted file mode 100644 index cfe99ffc2..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IBufferViewManager.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; - -public class IBufferViewManager implements Invoker<QBufferViewManager> { - @NonNull - private static final IBufferViewManager invoker = new IBufferViewManager(); - - private IBufferViewManager() { - } - - @NonNull - public static IBufferViewManager get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QBufferViewManager obj) throws SyncInvocationException { - switch (function.methodName) { - case "addBufferViewConfig": { - obj._addBufferViewConfig((int) function.params.get(0)); - } - break; - case "deleteBufferViewConfig": { - obj._deleteBufferViewConfig((int) function.params.get(0)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/ICertManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/ICertManager.java deleted file mode 100644 index f39f20b9b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/ICertManager.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QCertManager; - -public class ICertManager implements Invoker<QCertManager> { - @NonNull - private static final ICertManager invoker = new ICertManager(); - - private ICertManager() { - } - - @NonNull - public static ICertManager get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QCertManager obj) throws SyncInvocationException { - switch (function.methodName) { - case "": { - - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IClient.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IClient.java deleted file mode 100644 index 76a143bb0..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IClient.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.client.QClient; -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.RpcCallFunction; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.impl.Identity; - -public class IClient { - @NonNull - private static final IClient invoker = new IClient(); - - private IClient() { - } - - @NonNull - public static IClient get() { - return invoker; - } - - public void invoke(RpcCallFunction function, QClient obj) throws SyncInvocationException { - switch (function.functionName) { - case "2displayMsg(Message)": { - obj._displayMsg((Message) function.params.get(0)); - } - break; - case "2bufferInfoUpdated(BufferInfo)": { - obj._bufferInfoUpdated((BufferInfo) function.params.get(0)); - } - break; - case "2identityCreated(Identity)": { - obj._identityCreated((Identity) function.params.get(0)); - } - break; - case "2identityRemoved(IdentityId)": { - obj._identityRemoved((int) function.params.get(0)); - } - break; - case "2networkCreated(NetworkId)": { - obj._networkCreated((int) function.params.get(0)); - } - break; - case "2networkRemoved(NetworkId)": { - obj._networkRemoved((int) function.params.get(0)); - } - break; - case "2passwordChanged(PeerPtr,bool)": { - obj._passwordChanged((long) function.params.get(0), (boolean) function.params.get(1)); - } - break; - case "2displayStatusMsg(QString,QString)": { - obj._displayStatusMsg((String) function.params.get(0), (String) function.params.get(1)); - } - break; - case "__objectRenamed__": { - obj.___objectRenamed__((String) function.params.get(0), (String) function.params.get(1), (String) function.params.get(2)); - } - break; - default: { - throw new SyncInvocationException("Client::" + function.functionName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/ICoreInfo.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/ICoreInfo.java deleted file mode 100644 index 01617bb07..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/ICoreInfo.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import java.util.Map; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.interfaces.QCoreInfo; - -public class ICoreInfo implements Invoker<QCoreInfo> { - @NonNull - private static final ICoreInfo invoker = new ICoreInfo(); - - private ICoreInfo() { - } - - @NonNull - public static ICoreInfo get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QCoreInfo obj) throws SyncInvocationException { - switch (function.methodName) { - case "setCoreData": { - obj._setCoreData((Map<String, QVariant>) function.params.get(0)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIdentity.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIdentity.java deleted file mode 100644 index 429f8cc5b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIdentity.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; - -public class IIdentity implements Invoker<QIdentity> { - @NonNull - private static final IIdentity invoker = new IIdentity(); - - private IIdentity() { - } - - @NonNull - public static IIdentity get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QIdentity obj) throws SyncInvocationException { - switch (function.methodName) { - case "setId": { - obj._setId((int) function.params.get(0)); - } - break; - case "setIdentityName": { - obj._setIdentityName((String) function.params.get(0)); - } - break; - case "setRealName": { - obj._setRealName((String) function.params.get(0)); - } - break; - case "setNicks": { - obj._setNicks((List<String>) function.params.get(0)); - } - break; - case "setAwayNick": { - obj._setAwayNick((String) function.params.get(0)); - } - break; - case "setAwayNickEnabled": { - obj._setAwayNickEnabled((boolean) function.params.get(0)); - } - break; - case "setAwayReason": { - obj._setAwayReason((String) function.params.get(0)); - } - break; - case "setAwayReasonEnabled": { - obj._setAwayReasonEnabled((boolean) function.params.get(0)); - } - break; - case "setAutoAwayEnabled": { - obj._setAutoAwayEnabled((boolean) function.params.get(0)); - } - break; - case "setAutoAwayTime": { - obj._setAutoAwayTime((int) function.params.get(0)); - } - break; - case "setAutoAwayReason": { - obj._setAutoAwayReason((String) function.params.get(0)); - } - break; - case "setAutoAwayReasonEnabled": { - obj._setAutoAwayReasonEnabled((boolean) function.params.get(0)); - } - break; - case "setDetachAwayEnabled": { - obj._setDetachAwayEnabled((boolean) function.params.get(0)); - } - break; - case "setDetachAwayReason": { - obj._setDetachAwayReason((String) function.params.get(0)); - } - break; - case "setDetachAwayReasonEnabled": { - obj._setDetachAwayReasonEnabled((boolean) function.params.get(0)); - } - break; - case "setIdent": { - obj._setIdent((String) function.params.get(0)); - } - break; - case "setKickReason": { - obj._setKickReason((String) function.params.get(0)); - } - break; - case "setPartReason": { - obj._setPartReason((String) function.params.get(0)); - } - break; - case "setQuitReason": { - obj._setQuitReason((String) function.params.get(0)); - } - break; - case "setSslKey": { - obj._setSslKey((String) function.params.get(0)); - } - break; - case "setSslCert": { - obj._setSslCert((String) function.params.get(0)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIgnoreListManager.java deleted file mode 100644 index 41347cc71..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIgnoreListManager.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; - -public class IIgnoreListManager implements Invoker<QIgnoreListManager> { - @NonNull - private static final IIgnoreListManager invoker = new IIgnoreListManager(); - - private IIgnoreListManager() { - } - - @NonNull - public static IIgnoreListManager get() { - return invoker; - } - - public void invoke(SyncFunction function, QIgnoreListManager object) throws SyncInvocationException { - switch (function.methodName) { - case "removeIgnoreListItem": { - object._removeIgnoreListItem((String) function.params.get(0)); - } - break; - case "toggleIgnoreRule": { - object._toggleIgnoreRule((String) function.params.get(0)); - } - break; - case "addIgnoreListItem": { - object._addIgnoreListItem((int) function.params.get(0), (String) function.params.get(1), (boolean) function.params.get(2), (int) function.params.get(3), (int) function.params.get(4), (String) function.params.get(5), (boolean) function.params.get(6)); - } - break; - case "update": { - InvokerHelper.update(object, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIrcChannel.java deleted file mode 100644 index 6120c7df9..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIrcChannel.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; - -public class IIrcChannel implements Invoker<QIrcChannel> { - @NonNull - private static final IIrcChannel invoker = new IIrcChannel(); - - private IIrcChannel() { - } - - @NonNull - public static IIrcChannel get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QIrcChannel obj) throws SyncInvocationException { - switch (function.methodName) { - case "setTopic": { - obj._setTopic((String) function.params.get(0)); - } - break; - case "setPassword": { - obj._setPassword((String) function.params.get(0)); - } - break; - case "setEncrypted": { - obj._setEncrypted((boolean) function.params.get(0)); - } - break; - case "joinIrcUsers": { - obj._joinIrcUsers((List<String>) function.params.get(0), (List<String>) function.params.get(1)); - } - break; - case "part": { - obj._part((String) function.params.get(0)); - } - break; - case "setUserModes": { - obj._setUserModes((String) function.params.get(0), (String) function.params.get(1)); - } - break; - case "addUserMode": { - obj._addUserMode((String) function.params.get(0), (String) function.params.get(1)); - } - break; - case "removeUserMode": { - obj._removeUserMode((String) function.params.get(0), (String) function.params.get(1)); - } - break; - case "addChannelMode": { - obj._addChannelMode((char) function.params.get(0), (String) function.params.get(1)); - } - break; - case "removeChannelMode": { - obj._removeChannelMode((char) function.params.get(0), (String) function.params.get(1)); - } - break; - case "ircUserNickChanged": { - obj._ircUserNickChanged((String) function.params.get(0), (String) function.params.get(1)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIrcUser.java deleted file mode 100644 index 46b0019c5..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/IIrcUser.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import org.joda.time.DateTime; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; - -public class IIrcUser implements Invoker<QIrcUser> { - @NonNull - private static final IIrcUser invoker = new IIrcUser(); - - private IIrcUser() { - } - - @NonNull - public static IIrcUser get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QIrcUser obj) throws SyncInvocationException { - switch (function.methodName) { - case "setAway": { - obj._setAway((boolean) function.params.get(0)); - } - break; - case "setUser": { - obj._setUser((String) function.params.get(0)); - } - break; - case "setHost": { - obj._setHost((String) function.params.get(0)); - } - break; - case "setNick": { - obj._setNick((String) function.params.get(0)); - } - break; - case "setRealName": { - obj._setRealName((String) function.params.get(0)); - } - break; - case "setAccount": { - obj._setAccount((String) function.params.get(0)); - } - break; - case "setAwayMessage": { - obj._setAwayMessage((String) function.params.get(0)); - } - break; - case "setIdleTime": { - obj._setIdleTime((DateTime) function.params.get(0)); - } - break; - case "setLoginTime": { - obj._setLoginTime((DateTime) function.params.get(0)); - } - break; - case "setServer": { - obj._setServer((String) function.params.get(0)); - } - break; - case "setIrcOperator": { - obj._setIrcOperator((String) function.params.get(0)); - } - break; - case "setLastAwayMessage": { - obj._setLastAwayMessage((int) function.params.get(0)); - } - break; - case "setWhoisServiceReply": { - obj._setWhoisServiceReply((String) function.params.get(0)); - } - break; - case "setSuserHost": { - obj._setSuserHost((String) function.params.get(0)); - } - break; - case "setEncrypted": { - obj._setEncrypted((boolean) function.params.get(0)); - } - break; - case "updateHostmask": { - obj._updateHostmask((String) function.params.get(0)); - } - break; - case "setUserModes": { - obj._setUserModes((String) function.params.get(0)); - } - break; - case "joinChannel": { - obj._joinChannel((String) function.params.get(0)); - } - break; - case "partChannel": { - obj._partChannel((String) function.params.get(0)); - } - break; - case "addUserModes": { - obj._addUserModes((String) function.params.get(0)); - } - break; - case "removeUserModes": { - obj._removeUserModes((String) function.params.get(0)); - } - break; - case "quit": { - obj._quit(); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/INetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/INetwork.java deleted file mode 100644 index 217cd57cc..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/INetwork.java +++ /dev/null @@ -1,197 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; - -public class INetwork implements Invoker<QNetwork> { - @NonNull - private static final INetwork invoker = new INetwork(); - - private INetwork() { - } - - @NonNull - public static INetwork get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QNetwork obj) throws SyncInvocationException { - switch (function.methodName) { - case "setAutoAwayActive": { - obj._setAutoAwayActive((boolean) function.params.get(0)); - } - break; - case "setNetworkName": { - obj._setNetworkName((String) function.params.get(0)); - } - break; - case "setCurrentServer": { - obj._setCurrentServer((String) function.params.get(0)); - } - break; - case "setConnected": { - obj._setConnected((boolean) function.params.get(0)); - } - break; - case "setConnectionState": { - obj._setConnectionState((int) function.params.get(0)); - } - break; - case "setMyNick": { - obj._setMyNick((String) function.params.get(0)); - } - break; - case "setLatency": { - obj._setLatency((int) function.params.get(0)); - } - break; - case "setIdentity": { - obj._setIdentity((int) function.params.get(0)); - } - break; - case "setServerList": { - obj._setServerList((List<NetworkServer>) function.params.get(0)); - } - break; - case "setUseRandomServer": { - obj._setUseRandomServer((boolean) function.params.get(0)); - } - break; - case "setPerform": { - obj._setPerform((List<String>) function.params.get(0)); - } - break; - case "setUseAutoIdentify": { - obj._setUseAutoIdentify((boolean) function.params.get(0)); - } - break; - case "setAutoIdentifyService": { - obj._setAutoIdentifyService((String) function.params.get(0)); - } - break; - case "setAutoIdentifyPassword": { - obj._setAutoIdentifyPassword((String) function.params.get(0)); - } - break; - case "setUseSasl": { - obj._setUseSasl((boolean) function.params.get(0)); - } - break; - case "setSaslAccount": { - obj._setSaslAccount((String) function.params.get(0)); - } - break; - case "setSaslPassword": { - obj._setSaslPassword((String) function.params.get(0)); - } - break; - case "setUseAutoReconnect": { - obj._setUseAutoReconnect((boolean) function.params.get(0)); - } - break; - case "setAutoReconnectInterval": { - obj._setAutoReconnectInterval((int) function.params.get(0)); - } - break; - case "setAutoReconnectRetries": { - obj._setAutoReconnectRetries((short) function.params.get(0)); - } - break; - case "setUnlimitedReconnectRetries": { - obj._setUnlimitedReconnectRetries((boolean) function.params.get(0)); - } - break; - case "setRejoinChannels": { - obj._setRejoinChannels((boolean) function.params.get(0)); - } - break; - case "setCodecForServer": { - obj._setCodecForServer((String) function.params.get(0)); - } - break; - case "setCodecForEncoding": { - obj._setCodecForEncoding((String) function.params.get(0)); - } - break; - case "setCodecForDecoding": { - obj._setCodecForDecoding((String) function.params.get(0)); - } - break; - case "addSupport": { - if (function.params.size() == 1) - obj._addSupport((String) function.params.get(0)); - else if (function.params.size() == 2) - obj._addSupport((String) function.params.get(0), (String) function.params.get(1)); - } - break; - case "removeSupport": { - obj._removeSupport((String) function.params.get(0)); - } - break; - case "addIrcUser": { - obj._addIrcUser((String) function.params.get(0)); - } - break; - case "addIrcChannel": { - obj._addIrcChannel((String) function.params.get(0)); - } - break; - case "updateNickFromMask": { - obj._updateNickFromMask((String) function.params.get(0)); - } - break; - case "setNetworkInfo": { - obj._setNetworkInfo((NetworkInfo) function.params.get(0)); - } - break; - case "connect": { - obj._connect(); - } - break; - case "disconnect": { - obj._disconnect(); - } - break; - case "removeChansAndUsers": { - obj._removeChansAndUsers(); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/INetworkConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/INetworkConfig.java deleted file mode 100644 index 43383232b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/INetworkConfig.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; -import de.kuschku.libquassel.syncables.types.interfaces.QNetworkConfig; - -public class INetworkConfig implements Invoker<QNetworkConfig> { - @NonNull - private static final INetworkConfig invoker = new INetworkConfig(); - - private INetworkConfig() { - } - - @NonNull - public static INetworkConfig get() { - return invoker; - } - - @Override - public void invoke(SyncFunction function, QNetworkConfig obj) throws SyncInvocationException { - switch (function.methodName) { - case "setPingTimeoutEnabled": { - obj._setPingTimeoutEnabled((boolean) function.params.get(0)); - } - break; - case "setPingInterval": { - obj._setPingInterval((int) function.params.get(0)); - } - break; - case "setMaxPingCount": { - obj._setMaxPingCount((int) function.params.get(0)); - } - break; - case "setAutoWhoEnabled": { - obj._setAutoWhoEnabled((boolean) function.params.get(0)); - } - break; - case "setAutoWhoInterval": { - obj._setAutoWhoInterval((int) function.params.get(0)); - } - break; - case "setAutoWhoNickLimit": { - obj._setAutoWhoNickLimit((int) function.params.get(0)); - } - break; - case "setAutoWhoDelay": { - obj._setAutoWhoDelay((int) function.params.get(0)); - } - break; - case "setStandardCtcp": { - obj._setStandardCtcp((boolean) function.params.get(0)); - } - break; - case "update": { - InvokerHelper.update(obj, function.params.get(0)); - } - break; - default: { - throw new SyncInvocationException(function.className + "::" + function.methodName); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/Invoker.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/Invoker.java deleted file mode 100644 index 3a9b88f90..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/Invoker.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; - -public interface Invoker<T> { - void invoke(SyncFunction function, T obj) throws SyncInvocationException; -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/InvokerHelper.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/InvokerHelper.java deleted file mode 100644 index 020f56d1b..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/InvokerHelper.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import java.util.Map; - -import de.kuschku.libquassel.syncables.types.interfaces.QSyncableObject; - -public class InvokerHelper { - private InvokerHelper() { - - } - - public static void update(Object object, Object parameter) { - if (object instanceof QSyncableObject) { - QSyncableObject syncableObject = (QSyncableObject) object; - if (parameter instanceof QSyncableObject) { - QSyncableObject parameter1 = (QSyncableObject) parameter; - syncableObject._update(parameter1); - } else if (parameter instanceof Map) { - Map parameter1 = (Map) parameter; - syncableObject._update(parameter1); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/InvokerRegistry.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/InvokerRegistry.java deleted file mode 100644 index c8d762613..000000000 --- a/app/src/main/java/de/kuschku/libquassel/syncables/types/invokers/InvokerRegistry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.libquassel.syncables.types.invokers; - -import de.kuschku.libquassel.exceptions.SyncInvocationException; -import de.kuschku.libquassel.functions.types.SyncFunction; - -public class InvokerRegistry { - private InvokerRegistry() { - - } - - public static <T> Invoker<T> getInvoker(SyncFunction function) { - switch (function.className) { - case "AliasManager": - return (Invoker<T>) IAliasManager.get(); - case "BufferSyncer": - return (Invoker<T>) IBufferSyncer.get(); - case "BufferViewManager": - return (Invoker<T>) IBufferViewManager.get(); - case "Identity": - return (Invoker<T>) IIdentity.get(); - case "IrcChannel": - return (Invoker<T>) IIrcChannel.get(); - case "Network": - return (Invoker<T>) INetwork.get(); - case "BacklogManager": - return (Invoker<T>) IBacklogManager.get(); - case "BufferViewConfig": - return (Invoker<T>) IBufferViewConfig.get(); - case "CoreInfo": - return (Invoker<T>) ICoreInfo.get(); - case "IgnoreListManager": - return (Invoker<T>) IIgnoreListManager.get(); - case "IrcUser": - return (Invoker<T>) IIrcUser.get(); - case "NetworkConfig": - return (Invoker<T>) INetworkConfig.get(); - default: - return null; - } - } - - public static void invoke(SyncFunction function, Object obj) throws SyncInvocationException { - Invoker invoker = getInvoker(function); - if (invoker != null) - invoker.invoke(function, obj); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/Exceptions.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/Exceptions.kt new file mode 100644 index 000000000..21ec532cc --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/Exceptions.kt @@ -0,0 +1,9 @@ +package de.kuschku.quasseldroid_ng + +abstract class QuasselException : Exception() +data class ObjectNotFoundException(val className: String, val objectName: String) : + QuasselException() + +data class WrongObjectTypeException(val obj: Any?, val type: String) : QuasselException() +data class UnknownMethodException(val className: String, val methodName: String) : + QuasselException() diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java deleted file mode 100644 index ca9b37584..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasselDroidNG.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng; - -import android.app.Application; -import android.content.Context; - -import com.raizlabs.android.dbflow.config.FlowConfig; -import com.raizlabs.android.dbflow.config.FlowManager; - -import net.danlew.android.joda.JodaTimeAndroid; - -import org.acra.ACRA; -import org.acra.ReportField; -import org.acra.ReportingInteractionMode; -import org.acra.annotation.ReportsCrashes; - -import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; - -@ReportsCrashes( - formUri = "https://reports.kuschku.de/report/2/", - reportType = org.acra.sender.HttpSender.Type.JSON, - httpMethod = org.acra.sender.HttpSender.Method.POST, - customReportContent = { - ReportField.APP_VERSION_CODE, - ReportField.APP_VERSION_NAME, - ReportField.ANDROID_VERSION, - ReportField.PACKAGE_NAME, - ReportField.REPORT_ID, - ReportField.BUILD, - ReportField.STACK_TRACE - }, - mode = ReportingInteractionMode.TOAST, - resToastText = R.string.notificationReportCrash -) -public class QuasselDroidNG extends Application { - private static Context applicationContext; - - public static Context context() { - return applicationContext; - } - - @Override - public void onCreate() { - super.onCreate(); - - ACRA.init(this); - - FlowManager.init(new FlowConfig.Builder(this).build()); - FlowManager.getDatabase(ConnectedDatabase.class).getWritableDatabase(); - - JodaTimeAndroid.init(this); - - applicationContext = getApplicationContext(); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt new file mode 100644 index 000000000..6832c0ee1 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt @@ -0,0 +1,60 @@ +package de.kuschku.quasseldroid_ng + +import android.app.Application +import android.content.Context +import android.content.Intent +import android.content.pm.ShortcutInfo +import android.content.pm.ShortcutManager +import android.graphics.drawable.Icon +import android.os.Build +import de.kuschku.quasseldroid_ng.service.QuasselService +import de.kuschku.quasseldroid_ng.util.helpers.systemService +import org.acra.ACRA +import org.acra.ReportingInteractionMode +import org.acra.config.ConfigurationBuilder + +class QuasseldroidNG : Application() { + override fun attachBaseContext(base: Context?) { + super.attachBaseContext(base) + + val config = ConfigurationBuilder(this) + .setMailTo("support@kuschku.de") + .setReportingInteractionMode(ReportingInteractionMode.DIALOG) + .setResDialogText(R.string.crash_text) + .build() + + ACRA.init(this, config) + } + + override fun onCreate() { + super.onCreate() + + if (!ACRA.isACRASenderServiceProcess()) { + startService(Intent(this, QuasselService::class.java)) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + systemService<ShortcutManager>().dynamicShortcuts = listOf( + ShortcutInfo.Builder(this, "id1") + .setShortLabel("#quassel") + .setIcon(Icon.createWithResource(this, R.drawable.ic_shortcut_channel)) + .setIntent(packageManager.getLaunchIntentForPackage(BuildConfig.APPLICATION_ID)) + .build(), + ShortcutInfo.Builder(this, "id2") + .setShortLabel("#quasseldroid") + .setIcon(Icon.createWithResource(this, R.drawable.ic_shortcut_channel)) + .setIntent(packageManager.getLaunchIntentForPackage(BuildConfig.APPLICATION_ID)) + .build(), + ShortcutInfo.Builder(this, "id3") + .setShortLabel("#quassel.de") + .setIcon(Icon.createWithResource(this, R.drawable.ic_shortcut_channel)) + .setIntent(packageManager.getLaunchIntentForPackage(BuildConfig.APPLICATION_ID)) + .build(), + ShortcutInfo.Builder(this, "id4") + .setShortLabel("justJanne") + .setIcon(Icon.createWithResource(this, R.drawable.ic_shortcut_query)) + .setIntent(packageManager.getLaunchIntentForPackage(BuildConfig.APPLICATION_ID)) + .build() + ) + } + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt new file mode 100644 index 000000000..7affde4d4 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt @@ -0,0 +1,207 @@ +package de.kuschku.quasseldroid_ng.persistence + +import android.arch.persistence.room.* +import android.content.Context +import android.support.annotation.IntRange +import de.kuschku.quasseldroid_ng.protocol.Message_Flag +import de.kuschku.quasseldroid_ng.protocol.Message_Flags +import de.kuschku.quasseldroid_ng.protocol.Message_Type +import de.kuschku.quasseldroid_ng.protocol.Message_Types +import de.kuschku.quasseldroid_ng.quassel.BufferInfo +import de.kuschku.quasseldroid_ng.util.Flag +import de.kuschku.quasseldroid_ng.util.Flags +import org.threeten.bp.Instant + +@Database(entities = arrayOf(QuasselDatabase.Buffer::class, QuasselDatabase.Network::class, + QuasselDatabase.Message::class), + version = 2) +@TypeConverters(QuasselDatabase.Message.MessageTypeConverters::class) +abstract class QuasselDatabase : RoomDatabase() { + abstract fun networks(): NetworkDao + abstract fun buffers(): BufferDao + abstract fun message(): MessageDao + + @Entity(indices = arrayOf(Index("networkId"))) + class Buffer( + @PrimaryKey var bufferId: Int, + var networkId: Int, + var type: Int, + var groupId: Int, + var bufferName: String + ) + + class RawMessage( + messageId: Int, + time: Instant, + type: Message_Types, + flag: Message_Flags, + var bufferInfo: BufferInfo, + sender: String, + senderPrefixes: String, + content: String + ) : Message(messageId, time, type.toInt(), flag.toInt(), bufferInfo.bufferId, sender, + senderPrefixes, content) + + @Entity + open class Message( + @PrimaryKey var messageId: Int, + var time: Instant, + var type: Int, + var flag: Int, + var bufferId: Int, + var sender: String, + var senderPrefixes: String, + var content: String + ) { + enum class MessageType(override val bit: Int) : Flag<MessageType> { + Plain(0x00001), + Notice(0x00002), + Action(0x00004), + Nick(0x00008), + Mode(0x00010), + Join(0x00020), + Part(0x00040), + Quit(0x00080), + Kick(0x00100), + Kill(0x00200), + Server(0x00400), + Info(0x00800), + Error(0x01000), + DayChange(0x02000), + Topic(0x04000), + NetsplitJoin(0x08000), + NetsplitQuit(0x10000), + Invite(0x20000), + Markerline(0x40000); + + companion object : Flags.Factory<MessageType> { + override val NONE = MessageType.of() + override fun of(bit: Int) = Flags.of<MessageType>(bit) + override fun of(vararg flags: MessageType) = Flags.of(*flags) + } + } + + enum class MessageFlag(override val bit: Int) : Flag<MessageFlag> { + Self(0x01), + Highlight(0x02), + Redirected(0x04), + ServerMsg(0x08), + Backlog(0x80); + + companion object : Flags.Factory<MessageFlag> { + override val NONE = MessageFlag.of() + override fun of(bit: Int) = Flags.of<MessageFlag>(bit) + override fun of(vararg flags: MessageFlag) = Flags.of(*flags) + } + } + + class MessageTypeConverters { + @TypeConverter + fun convertInstant(value: Long) = Instant.ofEpochMilli(value) + + @TypeConverter + fun convertInstant(value: Instant) = value.toEpochMilli() + } + + override fun toString(): String { + return "Message(messageId=$messageId, time=$time, type=${Message_Type.of( + type)}, flag=${Message_Flag.of( + flag)}, bufferId=$bufferId, sender='$sender', senderPrefixes='$senderPrefixes', content='$content')" + } + } + + @Entity + class Network( + @PrimaryKey var networkId: Int, + var networkName: String + ) + + @Dao + interface NetworkDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun save(vararg entities: QuasselDatabase.Network) + + @Query("SELECT * FROM network WHERE networkId = :networkId") + fun findById(networkId: Int): QuasselDatabase.Network + + @Query("SELECT * FROM network") + fun all(): List<QuasselDatabase.Network> + + @Delete + fun delete(Network: QuasselDatabase.Network) + + @Query("DELETE FROM network") + fun clear() + } + + @Dao + interface BufferDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun save(vararg entities: QuasselDatabase.Buffer) + + @Query("SELECT * FROM buffer WHERE networkId = :bufferId") + fun findById(bufferId: Int): QuasselDatabase.Buffer + + @Query("SELECT * FROM buffer WHERE networkId = :networkId") + fun findByNetwork(networkId: Int): List<QuasselDatabase.Buffer> + + @Query("DELETE FROM buffer WHERE networkId = :networkId") + fun deleteByNetwork(networkId: Int) + + @Query("SELECT * FROM buffer") + fun all(): List<QuasselDatabase.Buffer> + + @Delete + fun delete(buffer: QuasselDatabase.Buffer) + + @Query("DELETE FROM buffer") + fun clear() + } + + @Dao + interface MessageDao { + @Query("SELECT * FROM message WHERE messageId = :messageId") + fun find(messageId: Int): Message + + @Query("SELECT * FROM message WHERE bufferId = :bufferId") + fun findByBufferId(bufferId: Int): List<Message> + + @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1") + fun findLastByBufferId(bufferId: Int): Message + + @Update(onConflict = OnConflictStrategy.REPLACE) + fun save(entity: Message) + + @Query("UPDATE message SET bufferId = :bufferId1 WHERE bufferId = :bufferId2") + fun merge(@IntRange(from = 0) bufferId1: Int, @IntRange(from = 0) bufferId2: Int) + + @Query("DELETE FROM message WHERE bufferId = :bufferId") + fun clearBuffer(@IntRange(from = 0) bufferId: Int) + } + + object Creator { + private var database: QuasselDatabase? = null + private set + + // For Singleton instantiation + private val LOCK = Any() + + fun init(context: Context): QuasselDatabase { + if (database == null) { + synchronized(LOCK) { + if (database == null) { + database = Room.databaseBuilder(context.applicationContext, + QuasselDatabase::class.java, DATABASE_NAME) + .fallbackToDestructiveMigration() + .build() + } + } + } + return database!! + } + } + + companion object { + const val DATABASE_NAME = "persistence-clientData" + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/ClientData.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/ClientData.kt new file mode 100644 index 000000000..1b92ec6ac --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/ClientData.kt @@ -0,0 +1,11 @@ +package de.kuschku.quasseldroid_ng.protocol + +import org.threeten.bp.Instant + +data class ClientData( + val identifier: String, + val buildDate: Instant, + val clientFeatures: Quassel_Features, + val protocolFeatures: Protocol_Features, + val supportedProtocols: ByteArray +) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/HandshakeMessage.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/HandshakeMessage.kt new file mode 100644 index 000000000..34064d826 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/HandshakeMessage.kt @@ -0,0 +1,255 @@ +package de.kuschku.quasseldroid_ng.protocol + +import de.kuschku.quasseldroid_ng.util.Flags + + +sealed class HandshakeMessage { + class ClientInit(val clientVersion: String?, val buildDate: String?, + val clientFeatures: Quassel_Features?) : HandshakeMessage() { + override fun toString(): String { + return "ClientInit(clientVersion=$clientVersion, buildDate=$buildDate, clientFeatures=$clientFeatures)" + } + } + + class ClientInitReject(val errorString: String?) : HandshakeMessage() { + override fun toString(): String { + return "ClientInitReject(errorString=$errorString)" + } + } + + class ClientInitAck(val coreFeatures: Quassel_Features?, val coreConfigured: Boolean?, + val backendInfo: QVariantList?, + val authenticatorInfo: QVariantList?) : HandshakeMessage() { + override fun toString(): String { + return "ClientInitAck(coreFeatures=$coreFeatures, coreConfigured=$coreConfigured, backendInfo=$backendInfo, authenticatorInfo=$authenticatorInfo)" + } + } + + class CoreSetupData(val adminUser: String?, val adminPassword: String?, val backend: String?, + val setupData: QVariantMap?, val authenticator: String?, + val authSetupData: QVariantMap?) : + HandshakeMessage() { + override fun toString(): String { + return "CoreSetupData(adminUser=$adminUser, adminPassword=$adminPassword, backend=$backend, setupData=$setupData, authenticator=$authenticator, authSetupData=$authSetupData)" + } + } + + class CoreSetupReject(val errorString: String?) : HandshakeMessage() { + override fun toString(): String { + return "CoreSetupReject(errorString=$errorString)" + } + } + + class CoreSetupAck : HandshakeMessage() { + override fun toString(): String { + return "CoreSetupAck" + } + } + + class ClientLogin(val user: String?, val password: String?) : HandshakeMessage() { + override fun toString(): String { + return "ClientLogin" + } + } + + class ClientLoginReject(val errorString: String?) : HandshakeMessage() { + override fun toString(): String { + return "ClientLoginReject(errorString=$errorString)" + } + } + + class ClientLoginAck : HandshakeMessage() { + override fun toString(): String { + return "ClientLoginAck" + } + } + + class SessionInit(val identities: QVariantList?, val bufferInfos: QVariantList?, + val networkIds: QVariantList?) : + HandshakeMessage() { + override fun toString(): String { + return "SessionInit(identities=$identities, bufferInfos=$bufferInfos, networkIds=$networkIds)" + } + } + + companion object : HandshakeMessageSerializer<HandshakeMessage> { + override fun serialize(data: HandshakeMessage) = when (data) { + is ClientInit -> ClientInitSerializer.serialize(data) + is ClientInitReject -> ClientInitRejectSerializer.serialize(data) + is ClientInitAck -> ClientInitAckSerializer.serialize(data) + is CoreSetupData -> CoreSetupDataSerializer.serialize(data) + is CoreSetupReject -> CoreSetupRejectSerializer.serialize(data) + is CoreSetupAck -> CoreSetupAckSerializer.serialize(data) + is ClientLogin -> ClientLoginSerializer.serialize(data) + is ClientLoginReject -> ClientLoginRejectSerializer.serialize(data) + is ClientLoginAck -> ClientLoginAckSerializer.serialize(data) + is SessionInit -> SessionInitSerializer.serialize(data) + } + + override fun deserialize(data: QVariantMap): HandshakeMessage { + val msgType = data["MsgType"].value<String?>() + return when (msgType) { + "ClientInit" -> ClientInitSerializer.deserialize(data) + "ClientInitReject" -> ClientInitRejectSerializer.deserialize(data) + "ClientInitAck" -> ClientInitAckSerializer.deserialize(data) + "CoreSetupData" -> CoreSetupDataSerializer.deserialize(data) + "CoreSetupReject" -> CoreSetupRejectSerializer.deserialize(data) + "CoreSetupAck" -> CoreSetupAckSerializer.deserialize(data) + "ClientLogin" -> ClientLoginSerializer.deserialize(data) + "ClientLoginReject" -> ClientLoginRejectSerializer.deserialize(data) + "ClientLoginAck" -> ClientLoginAckSerializer.deserialize(data) + "SessionInit" -> SessionInitSerializer.deserialize(data) + else -> throw IllegalArgumentException( + "Invalid MsgType: $msgType" + ) + } + } + + } +} + +object ClientInitSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInit> { + override fun serialize(data: HandshakeMessage.ClientInit) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString), + "ClientVersion" to QVariant_(data.clientVersion, Type.QString), + "ClientDate" to QVariant_(data.buildDate, Type.QString), + "ClientFeatures" to QVariant_(data.clientFeatures?.toInt(), Type.UInt) + ) + + override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInit( + clientVersion = data["ClientVersion"].value(), + buildDate = data["ClientDate"].value(), + clientFeatures = Flags.of(data["ClientFeatures"].value(0)) + ) +} + +object ClientInitRejectSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInitReject> { + override fun serialize(data: HandshakeMessage.ClientInitReject) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString), + "Error" to QVariant_(data.errorString, Type.QString) + ) + + override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInitReject( + errorString = data["Error"].value() + ) +} + +object ClientInitAckSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInitAck> { + override fun serialize(data: HandshakeMessage.ClientInitAck) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString), + "CoreFeatures" to QVariant_(data.coreFeatures?.toInt(), Type.UInt), + "StorageBackends" to QVariant_(data.backendInfo, Type.QVariantList), + "Authenticator" to QVariant_(data.authenticatorInfo, Type.QVariantList), + "Configured" to QVariant_(data.coreConfigured, Type.Bool) + ) + + override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInitAck( + coreFeatures = Flags.of(data["CoreFeatures"].value(0)), + backendInfo = data["StorageBackends"].value(), + authenticatorInfo = data["Authenticators"].value(), + coreConfigured = data["Configured"].value() + ) +} + +object CoreSetupDataSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupData> { + override fun serialize(data: HandshakeMessage.CoreSetupData) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString), + "SetupData" to QVariant_(mapOf( + "AdminUser" to QVariant_(data.adminUser, Type.QString), + "AdminPasswd" to QVariant_(data.adminPassword, Type.QString), + "Backend" to QVariant_(data.backend, Type.QString), + "ConnectionProperties" to QVariant_(data.setupData, Type.QVariantMap), + "Authenticator" to QVariant_(data.authenticator, Type.QString), + "AuthProperties" to QVariant_(data.authSetupData, Type.QVariantMap) + ), Type.QVariantMap) + ) + + override fun deserialize(data: QVariantMap): HandshakeMessage.CoreSetupData { + val setupData = data["SetupData"].value<QVariantMap?>() + return HandshakeMessage.CoreSetupData( + adminUser = setupData?.get("AdminUser").value(), + adminPassword = setupData?.get("AdminPasswd").value(), + backend = setupData?.get("Backend").value(), + setupData = setupData?.get("ConnectionProperties").value(), + authenticator = setupData?.get("Authenticator").value(), + authSetupData = setupData?.get("AuthProperties").value() + ) + } +} + +object CoreSetupRejectSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupReject> { + override fun serialize(data: HandshakeMessage.CoreSetupReject) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString), + "Error" to QVariant_(data.errorString, Type.QString) + ) + + override fun deserialize(data: QVariantMap) = HandshakeMessage.CoreSetupReject( + errorString = data["Error"].value() + ) +} + +object CoreSetupAckSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupAck> { + override fun serialize(data: HandshakeMessage.CoreSetupAck) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString) + ) + + override fun deserialize(data: QVariantMap) = HandshakeMessage.CoreSetupAck() +} + +object ClientLoginSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientLogin> { + override fun serialize(data: HandshakeMessage.ClientLogin) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString), + "User" to QVariant_(data.user, Type.QString), + "Password" to QVariant_(data.password, Type.QString) + ) + + override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLogin( + user = data["User"].value(), + password = data["Password"].value() + ) +} + +object ClientLoginRejectSerializer : + HandshakeMessageSerializer<HandshakeMessage.ClientLoginReject> { + override fun serialize(data: HandshakeMessage.ClientLoginReject) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString), + "Error" to QVariant_(data.errorString, Type.QString) + ) + + override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLoginReject( + errorString = data["Error"].value() + ) +} + +object ClientLoginAckSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientLoginAck> { + override fun serialize(data: HandshakeMessage.ClientLoginAck) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString) + ) + + override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLoginAck() +} + +object SessionInitSerializer : HandshakeMessageSerializer<HandshakeMessage.SessionInit> { + override fun serialize(data: HandshakeMessage.SessionInit) = mapOf( + "MsgType" to QVariant_(data::class.java.simpleName, Type.QString), + "SessionState" to QVariant_(mapOf( + "BufferInfos" to QVariant_(data.bufferInfos, Type.QVariantList), + "NetworkIds" to QVariant_(data.networkIds, Type.QVariantList), + "Identities" to QVariant_(data.identities, Type.QVariantList) + ), Type.QVariantMap) + ) + + override fun deserialize(data: QVariantMap): HandshakeMessage.SessionInit { + val setupData = data["SessionState"].value<QVariantMap?>() + return HandshakeMessage.SessionInit( + bufferInfos = setupData?.get("BufferInfos").value(), + networkIds = setupData?.get("NetworkIds").value(), + identities = setupData?.get("Identities").value() + ) + } +} + +interface HandshakeMessageSerializer<T : HandshakeMessage> { + fun serialize(data: T): QVariantMap + fun deserialize(data: QVariantMap): T +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/MetaType.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/MetaType.kt new file mode 100644 index 000000000..b5ca4e9f3 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/MetaType.kt @@ -0,0 +1,101 @@ +package de.kuschku.quasseldroid_ng.protocol + +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.* +import org.threeten.bp.LocalTime +import org.threeten.bp.OffsetDateTime + +data class MetaType<T>(val klass: Class<T>, val type: Type, val serializer: Serializer<T>? = null, + val name: String = type.serializableName) { + companion object { + private val byName = HashMap<String, MetaType<*>>() + private val byType = HashMap<Type, MetaType<*>>() + + private inline fun <reified T : Any?> addType(type: Type, + serializer: Serializer<T>? = null) { + val metaType = MetaType(T::class.java, type, serializer, type.serializableName) + byName[metaType.name] = metaType + byType[metaType.type] = metaType + } + + private inline fun <reified T : Any?> addType(type: Type, name: String, + serializer: Serializer<T>? = null) { + val metaType = MetaType(T::class.java, type, serializer, name) + byName[metaType.name] = metaType + } + + private inline fun <reified T : Any?> addType(type: Type, name: QType, + serializer: Serializer<T>? = null) { + addType(type, name.typeName, serializer) + } + + init { + addType(Type.Void, VoidSerializer) + addType(Type.Bool, BoolSerializer) + addType(Type.Char, ByteSerializer) + addType(Type.UChar, ByteSerializer) + addType(Type.Short, ShortSerializer) + addType(Type.UShort, ShortSerializer) + addType(Type.Int, IntSerializer) + addType(Type.UInt, IntSerializer) + addType(Type.Long, LongSerializer) + addType(Type.ULong, LongSerializer) + + addType(Type.QTime, TimeSerializer) + addType(Type.QDateTime, DateTimeSerializer) + addType(Type.QChar, CharSerializer) + addType(Type.QString, StringSerializer.UTF16) + addType(Type.QByteArray, ByteArraySerializer) + addType(Type.QStringList, StringListSerializer) + addType(Type.QVariantList, VariantListSerializer) + addType(Type.QVariantMap, VariantMapSerializer) + addType(Type.QVariant, VariantSerializer) + + addType(Type.UserType, QType.BufferId, IntSerializer) + addType(Type.UserType, QType.BufferInfo, BufferInfoSerializer) + addType(Type.UserType, QType.DccConfig_IpDetectionMode, DccConfig_IpDetectionModeSerializer) + addType(Type.UserType, QType.DccConfig_PortSelectionMode, + DccConfig_PortSelectionModeSerializer) + addType(Type.UserType, QType.IrcUser, VariantMapSerializer) + addType(Type.UserType, QType.IrcChannel, VariantMapSerializer) + addType(Type.UserType, QType.Identity, VariantMapSerializer) + addType(Type.UserType, QType.IdentityId, IntSerializer) + addType(Type.UserType, QType.MsgId, IntSerializer) + addType(Type.UserType, QType.Message, MessageSerializer) + addType(Type.UserType, QType.NetworkId, IntSerializer) + addType(Type.UserType, QType.NetworkInfo, VariantMapSerializer) + addType(Type.UserType, QType.Network_Server, VariantMapSerializer) + addType(Type.UserType, QType.QHostAddress, HostAddressSerializer) + + addType(Type.QByteArray, "UTF8String", StringSerializer.UTF8) + addType(Type.QByteArray, "CString", StringSerializer.C) + + addType(Type.Long, "PeerPtr", LongSerializer) + } + + fun <T : Any?> get(key: String?): MetaType<T> = + byName[key] as MetaType<T>? ?: throw(IllegalArgumentException("Type does not exist: $key")) + + + fun <T : Any?> get(key: Type?): MetaType<T> = + byType[key] as MetaType<T>? ?: throw(IllegalArgumentException("Type does not exist: $key")) + + fun <T : Any?> get(data: T): MetaType<T>? = when (data) { + equals(null) -> get(Type.Void) + is Boolean -> get<Boolean>(Type.Bool) + is Byte -> get<Byte>(Type.Char) + is Short -> get<Short>(Type.Short) + is Int -> get<Int>(Type.Int) + is Long -> get<Long>(Type.Long) + is LocalTime -> get<LocalTime>(Type.QTime) + is OffsetDateTime -> get<OffsetDateTime>(Type.QDateTime) + is String -> get<String?>(Type.QString) + is QVariant<*> -> get<QVariant<*>>(Type.QVariant) + is List<*> -> if (data.isEmpty() || data[0] !is String) { + get<List<*>>(Type.QVariantList) + } else { + get<QStringList>(Type.QStringList) + } + else -> throw IllegalArgumentException("Unsupported type: $data") + } as MetaType<T> + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/NetworkLayerProtocol.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/NetworkLayerProtocol.kt new file mode 100644 index 000000000..606a5d26a --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/NetworkLayerProtocol.kt @@ -0,0 +1,13 @@ +package de.kuschku.quasseldroid_ng.protocol + +enum class NetworkLayerProtocol(val value: Byte) { + IPv4Protocol(0), + IPv6Protocol(1), + AnyIPProtocol(2), + UnknownNetworkLayerProtocol(-1); + + companion object { + private val byId = NetworkLayerProtocol.values().associateBy(NetworkLayerProtocol::value) + fun of(value: Byte) = byId[value] ?: NetworkLayerProtocol.UnknownNetworkLayerProtocol + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QType.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QType.kt new file mode 100644 index 000000000..ce1138a16 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QType.kt @@ -0,0 +1,19 @@ +package de.kuschku.quasseldroid_ng.protocol + +enum class QType(val typeName: String) { + BufferId("BufferId"), + BufferInfo("BufferInfo"), + DccConfig_IpDetectionMode("DccConfig::IpDetectionMode"), + DccConfig_PortSelectionMode("DccConfig::PortSelectionMode"), + IrcUser("IrcUser"), + IrcChannel("IrcChannel"), + Identity("Identity"), + IdentityId("IdentityId"), + Message("Message"), + MsgId("MsgId"), + Network("Network"), + NetworkId("NetworkId"), + NetworkInfo("NetworkInfo"), + Network_Server("Network::Server"), + QHostAddress("QHostAddress") +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QTypes.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QTypes.kt new file mode 100644 index 000000000..970d9a74b --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QTypes.kt @@ -0,0 +1,116 @@ +package de.kuschku.quasseldroid_ng.protocol + +import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.StringSerializer +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.deserializeString +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.serializeString +import de.kuschku.quasseldroid_ng.quassel.BufferInfo +import de.kuschku.quasseldroid_ng.quassel.ProtocolFeature +import de.kuschku.quasseldroid_ng.quassel.QuasselFeature +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetwork +import de.kuschku.quasseldroid_ng.util.Flags +import de.kuschku.quasseldroid_ng.util.ShortFlags +import java.nio.ByteBuffer + +typealias QStringList = List<String?> +typealias All_ = Any? +typealias QVariant_ = QVariant<All_> +typealias QVariantMap = Map<String, QVariant_> +typealias QVariantList = List<QVariant_> + +typealias IdentityId = Int +typealias BufferId = Int +typealias MsgId = Int +typealias NetworkId = Int + +typealias Message_Type = QuasselDatabase.Message.MessageType +typealias Message_Types = Flags<Message_Type> + +typealias Message_Flag = QuasselDatabase.Message.MessageFlag +typealias Message_Flags = Flags<Message_Flag> + +typealias Quassel_Feature = QuasselFeature +typealias Quassel_Features = Flags<Quassel_Feature> + +typealias Protocol_Feature = ProtocolFeature +typealias Protocol_Features = Flags<Protocol_Feature> + +typealias Network_ChannelModeType = INetwork.ChannelModeType +typealias Network_ChannelModeTypes = Flags<Network_ChannelModeType> + +typealias Buffer_Type = BufferInfo.Type +typealias Buffer_Types = ShortFlags<Buffer_Type> + +typealias Buffer_Activity = BufferInfo.Activity +typealias Buffer_Activities = Flags<Buffer_Activity> + +typealias UByte = Byte +typealias UShort = Short +typealias UInt = Int +typealias ULong = Long + +inline val SLOT + get() = Throwable().stackTrace.first().methodName + +typealias ARG = QVariant_ + +fun QVariantMap.toVariantList(): QVariantList = + entries.flatMap { (key, value) -> + listOf(QVariant_(key.serializeString(StringSerializer.UTF8), Type.QByteArray), value) + } + +fun QVariantList.toVariantMap(): QVariantMap = + (0 until size step 2).map { + Pair( + get(it).value<ByteBuffer?>().deserializeString(StringSerializer.UTF8) ?: "", + get(it + 1) + ) + }.toMap() + +fun <K, V> List<Map<K, V>>.transpose(): Map<K, List<V>> { + val result = mutableMapOf<K, MutableList<V>>() + forEach { map -> + map.entries.forEach { (key, value) -> + result.getOrPut(key, ::mutableListOf).add(value) + } + } + return result +} + + +fun <K, V> Map<K, List<V>>.transpose(): List<Map<K, V>> { + val result = MutableList(values.map(List<*>::size).max() ?: 0) { mutableMapOf<K, V>() } + this.entries.forEach { (key, values) -> + values.forEachIndexed { index, value -> + result[index][key] = value + } + } + return result +} + +fun nickFromMask(mask: String): String { + val (nick, _, _) = splitHostMask(mask) + return nick +} + +fun userFromMask(mask: String): String { + val (_, user, _) = splitHostMask(mask) + return user +} + +fun hostFromMask(mask: String): String { + val (_, _, host) = splitHostMask(mask) + return host +} + +fun splitHostMask(mask: String): Triple<String, String, String> { + if (!mask.contains("@")) + return Triple(mask, "", "") + + val (userPart, host) = mask.split("@", limit = 2) + if (!userPart.contains("!")) + return Triple(mask, "", host) + + val (nick, user) = userPart.split('!', limit = 2) + return Triple(nick, user, host) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QVariant.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QVariant.kt new file mode 100644 index 000000000..da5ffb395 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QVariant.kt @@ -0,0 +1,45 @@ +package de.kuschku.quasseldroid_ng.protocol + +class QVariant<T>(val data: T?, val type: MetaType<T>) { + constructor(data: T?, type: Type) : this(data, MetaType.Companion.get(type)) + constructor(data: T?, type: QType) : this(data, type.typeName) + constructor(data: T?, type: String) : this(data, MetaType.Companion.get(type)) + + private fun <U> coerce(): QVariant<U> { + return this as QVariant<U> + } + + fun or(defValue: T): T { + return data ?: defValue + } + + fun <U> _value(defValue: U): U { + return this.coerce<U>().data ?: defValue + } + + fun <U> _valueOr(f: () -> U): U { + return this.coerce<U>().data ?: f() + } + + fun <U> _valueOrThrow(): U = this._valueOrThrow(NullPointerException()) + + fun <U> _valueOrThrow(e: Throwable): U { + return this.coerce<U>().data ?: throw e + } + + override fun toString(): String { + return "QVariant(${type.name}, $data)" + } +} + +fun <U> QVariant_?.value(): U? + = this?._value<U?>(null) + +fun <U> QVariant_?.value(defValue: U): U + = this?._value<U>(defValue) ?: defValue + +fun <U> QVariant_?.valueOr(f: () -> U): U + = this?._valueOr<U>(f) ?: f() + +fun <U> QVariant_?.valueOrThrow(e: Throwable = NullPointerException()): U + = this?._valueOrThrow<U>(e) ?: throw e diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/SignalProxyMessage.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/SignalProxyMessage.kt new file mode 100644 index 000000000..b694e50c5 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/SignalProxyMessage.kt @@ -0,0 +1,172 @@ +package de.kuschku.quasseldroid_ng.protocol + +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.StringSerializer.UTF8 +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.deserializeString +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.serializeString +import org.threeten.bp.Instant +import java.nio.ByteBuffer + +enum class RequestType(val value: Int) { + Invalid(0), + Sync(1), + RpcCall(2), + InitRequest(3), + InitData(4), + HeartBeat(5), + HeartBeatReply(6); + + companion object { + private val byId = enumValues<RequestType>().associateBy(RequestType::value) + fun of(value: Int) = byId[value] ?: Invalid + } +} + +sealed class SignalProxyMessage { + class SyncMessage(val className: String, val objectName: String, val slotName: String, + val params: QVariantList) : SignalProxyMessage() { + override fun toString(): String { + return "SyncMessage::$className:$objectName/$slotName" + } + } + + class RpcCall(val slotName: String, val params: QVariantList) : SignalProxyMessage() { + override fun toString(): String { + return "RpcCall::$slotName" + } + } + + class InitRequest(val className: String, val objectName: String) : SignalProxyMessage() { + override fun toString(): String { + return "InitRequest::$className:$objectName" + } + } + + class InitData(val className: String, val objectName: String, val initData: QVariantMap) : + SignalProxyMessage() { + override fun toString(): String { + return "InitData::$className:$objectName" + } + } + + class HeartBeat(val timestamp: Instant) : SignalProxyMessage() { + override fun toString(): String { + return "HeartBeat::$timestamp" + } + } + + class HeartBeatReply(val timestamp: Instant) : SignalProxyMessage() { + override fun toString(): String { + return "HeartBeatReply::$timestamp" + } + } + + companion object : SignalProxyMessageSerializer<SignalProxyMessage> { + override fun serialize(data: SignalProxyMessage) = when (data) { + is SignalProxyMessage.SyncMessage -> SyncMessageSerializer.serialize(data) + is SignalProxyMessage.RpcCall -> RpcCallSerializer.serialize(data) + is SignalProxyMessage.InitRequest -> InitRequestSerializer.serialize(data) + is SignalProxyMessage.InitData -> InitDataSerializer.serialize(data) + is SignalProxyMessage.HeartBeat -> HeartBeatSerializer.serialize(data) + is SignalProxyMessage.HeartBeatReply -> HeartBeatReplySerializer.serialize(data) + } + + override fun deserialize(data: QVariantList): SignalProxyMessage { + val type = data.first().value(-1) + return when (RequestType.of(type)) { + RequestType.Sync -> SyncMessageSerializer.deserialize(data.drop(1)) + RequestType.RpcCall -> RpcCallSerializer.deserialize(data.drop(1)) + RequestType.InitRequest -> InitRequestSerializer.deserialize(data.drop(1)) + RequestType.InitData -> InitDataSerializer.deserialize(data.drop(1)) + RequestType.HeartBeat -> HeartBeatSerializer.deserialize(data.drop(1)) + RequestType.HeartBeatReply -> HeartBeatReplySerializer.deserialize(data.drop(1)) + else -> throw IllegalArgumentException("Invalid MsgType: $type") + } + } + + } +} + +object SyncMessageSerializer : SignalProxyMessageSerializer<SignalProxyMessage.SyncMessage> { + override fun serialize(data: SignalProxyMessage.SyncMessage): QVariantList = listOf( + QVariant_(RequestType.Sync.value, Type.Int), + QVariant_(data.className.serializeString(UTF8), Type.QByteArray), + QVariant_(data.objectName.serializeString(UTF8), Type.QByteArray), + QVariant_(data.slotName.serializeString(UTF8), Type.QByteArray), + *data.params.toTypedArray() + ) + + override fun deserialize(data: QVariantList) = SignalProxyMessage.SyncMessage( + data[0].value<ByteBuffer?>().deserializeString(UTF8) ?: "", + data[1].value<ByteBuffer?>().deserializeString(UTF8) ?: "", + data[2].value<ByteBuffer?>().deserializeString(UTF8) ?: "", + data.drop(3) + ) +} + +object RpcCallSerializer : SignalProxyMessageSerializer<SignalProxyMessage.RpcCall> { + override fun serialize(data: SignalProxyMessage.RpcCall) = listOf( + QVariant_(RequestType.RpcCall.value, Type.Int), + QVariant_(data.slotName.serializeString(UTF8), Type.QByteArray), + *data.params.toTypedArray() + ) + + override fun deserialize(data: QVariantList) = SignalProxyMessage.RpcCall( + data[0].value<ByteBuffer?>().deserializeString(UTF8) ?: "", + data.drop(1) + ) +} + +object InitRequestSerializer : SignalProxyMessageSerializer<SignalProxyMessage.InitRequest> { + override fun serialize(data: SignalProxyMessage.InitRequest) = listOf( + QVariant_(RequestType.InitRequest.value, Type.Int), + QVariant_(data.className.serializeString(UTF8), Type.QByteArray), + QVariant_(data.objectName.serializeString(UTF8), Type.QByteArray) + ) + + override fun deserialize(data: QVariantList) = SignalProxyMessage.InitRequest( + data[0].value<ByteBuffer?>().deserializeString(UTF8) ?: "", + data[1].value<ByteBuffer?>().deserializeString(UTF8) ?: "" + ) +} + +object InitDataSerializer : SignalProxyMessageSerializer<SignalProxyMessage.InitData> { + override fun serialize(data: SignalProxyMessage.InitData) = listOf( + QVariant_(RequestType.InitData.value, Type.Int), + QVariant_(data.className.serializeString(UTF8), Type.QByteArray), + QVariant_(data.objectName.serializeString(UTF8), Type.QByteArray), + QVariant_(data.initData, Type.QVariantMap) + ) + + override fun deserialize(data: QVariantList) = SignalProxyMessage.InitData( + data[0].value<ByteBuffer?>().deserializeString(UTF8) ?: "", + data[1].value<ByteBuffer?>().deserializeString(UTF8) ?: "", + data.drop(2).toVariantMap() + ) +} + +object HeartBeatSerializer : SignalProxyMessageSerializer<SignalProxyMessage.HeartBeat> { + override fun serialize(data: SignalProxyMessage.HeartBeat) = listOf( + QVariant_(RequestType.HeartBeat.value, Type.Int), + QVariant_(data.timestamp, Type.QDateTime) + ) + + override fun deserialize(data: QVariantList) = SignalProxyMessage.HeartBeat( + data[0].value(Instant.EPOCH) + ) +} + +object HeartBeatReplySerializer : SignalProxyMessageSerializer<SignalProxyMessage.HeartBeatReply> { + override fun serialize(data: SignalProxyMessage.HeartBeatReply) = listOf( + QVariant_(RequestType.HeartBeatReply.value, Type.Int), + QVariant_(data.timestamp, Type.QDateTime) + ) + + override fun deserialize(data: QVariantList) = SignalProxyMessage.HeartBeatReply( + data[0].value(Instant.EPOCH) + ) +} + +interface SignalProxyMessageSerializer<T : SignalProxyMessage> { + fun serialize(data: T): QVariantList + fun deserialize(data: QVariantList): T +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/Type.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/Type.kt new file mode 100644 index 000000000..dfe2dedee --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/Type.kt @@ -0,0 +1,104 @@ +package de.kuschku.quasseldroid_ng.protocol + +import java.util.* + + +enum class Type(val id: kotlin.Int) { + Void(0), + Bool(1), + Int(2), + UInt(3), + LongLong(4), + ULongLong(5), + + Double(6), + QChar(7), + QVariantMap(8), + QVariantList(9), + + QString(10), + QStringList(11), + QByteArray(12), + + QBitArray(13), + QDate(14), + QTime(15), + QDateTime(16), + QUrl(17), + + QLocale(18), + QRect(19), + QRectF(20), + QSize(21), + QSizeF(22), + + QLine(23), + QLineF(24), + QPoint(25), + QPointF(26), + QRegExp(27), + + QVariantHash(28), + QEasingCurve(29), + + FirstGuiType(63), + + QFont(64), + QPixmap(65), + QBrush(66), + QColor(67), + QPalette(68), + + QIcon(69), + QImage(70), + QPolygon(71), + QRegion(72), + QBitmap(73), + + QCursor(74), + QSizePolicy(75), + QKeySequence(76), + QPen(77), + + QTextLength(78), + QTextFormat(79), + QMatrix(80), + QTransform(81), + + QMatrix4x4(82), + QVector2D(83), + QVector3D(84), + QVector4D(85), + + QQuaternion(86), + + VoidStar(128), + Long(129), + Short(130), + Char(131), + ULong(132), + + UShort(133), + UChar(134), + Float(135), + QObjectStar(136), + QWidgetStar(137), + + QVariant(138), + + User(256), + UserType(127), + LastType(-1); + + val serializableName + get() = if (name.startsWith("Q")) { + name + } else { + name.toLowerCase(Locale.ENGLISH) + } + + companion object { + private val byId = Type.values().associateBy(Type::id) + fun of(type: kotlin.Int) = byId[type] + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BoolSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BoolSerializer.kt new file mode 100644 index 000000000..67c8b33a8 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BoolSerializer.kt @@ -0,0 +1,17 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object BoolSerializer : Serializer<Boolean> { + override fun serialize(buffer: ChainedByteBuffer, data: Boolean, + features: Quassel_Features) = buffer.put(if (data) { + 0x01 + } else { + 0x00 + }.toByte()) + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features) + = buffer.get() != 0x00.toByte() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BufferInfoSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BufferInfoSerializer.kt new file mode 100644 index 000000000..15398ee17 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BufferInfoSerializer.kt @@ -0,0 +1,32 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Buffer_Type +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.quassel.BufferInfo +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object BufferInfoSerializer : Serializer<BufferInfo> { + override fun serialize(buffer: ChainedByteBuffer, data: BufferInfo, features: Quassel_Features) { + IntSerializer.serialize(buffer, data.bufferId, features) + IntSerializer.serialize(buffer, data.networkId, features) + ShortSerializer.serialize(buffer, data.type.toShort(), features) + IntSerializer.serialize(buffer, data.groupId, features) + StringSerializer.UTF8.serialize(buffer, data.bufferName, features) + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): BufferInfo { + val bufferId = IntSerializer.deserialize(buffer, features) + val networkId = IntSerializer.deserialize(buffer, features) + val type = Buffer_Type.of(ShortSerializer.deserialize(buffer, features)) + val groupId = IntSerializer.deserialize(buffer, features) + val bufferName = StringSerializer.UTF8.deserialize(buffer, features) + return BufferInfo( + bufferId = bufferId, + networkId = networkId, + type = type, + groupId = groupId, + bufferName = bufferName + ) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteArraySerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteArraySerializer.kt new file mode 100644 index 000000000..7a6bd9039 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteArraySerializer.kt @@ -0,0 +1,29 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object ByteArraySerializer : Serializer<ByteBuffer?> { + override fun serialize(buffer: ChainedByteBuffer, data: ByteBuffer?, features: Quassel_Features) { + if (data == null) { + IntSerializer.serialize(buffer, -1, features) + } else { + IntSerializer.serialize(buffer, data.remaining(), features) + buffer.put(data) + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): ByteBuffer? { + val len = IntSerializer.deserialize(buffer, features) + return if (len == -1) { + null + } else { + val result = ByteBuffer.allocate(len) + while (result.hasRemaining()) + result.put(buffer.get()) + result.flip() + result + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteSerializer.kt new file mode 100644 index 000000000..47e0f47ea --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteSerializer.kt @@ -0,0 +1,15 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object ByteSerializer : Serializer<Byte> { + override fun serialize(buffer: ChainedByteBuffer, data: Byte, features: Quassel_Features) { + buffer.put(data) + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Byte { + return buffer.get() + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/CharSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/CharSerializer.kt new file mode 100644 index 000000000..2d031300a --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/CharSerializer.kt @@ -0,0 +1,44 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer +import java.nio.CharBuffer + +object CharSerializer : Serializer<Char> { + private val byteBuffer = ByteBuffer.allocateDirect(2) + private val charBuffer = CharBuffer.allocate(1) + private val encoder = Charsets.UTF_16BE.newEncoder() + private val decoder = Charsets.UTF_16BE.newDecoder() + + override fun serialize(buffer: ChainedByteBuffer, data: Char, features: Quassel_Features) { + synchronized(this) { + charBuffer.clear() + charBuffer.put(data) + charBuffer.flip() + byteBuffer.clear() + encoder.encode(charBuffer, byteBuffer, true) + byteBuffer.flip() + if (byteBuffer.remaining() == 2) { + buffer.put(byteBuffer) + } else { + buffer.putShort(0) + } + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Char { + synchronized(this) { + byteBuffer.clear() + byteBuffer.putShort(buffer.short) + byteBuffer.flip() + charBuffer.clear() + decoder.decode(byteBuffer, charBuffer, true) + charBuffer.flip() + return if (charBuffer.remaining() == 1) + charBuffer.get() + else + '\u0000' + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DateTimeSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DateTimeSerializer.kt new file mode 100644 index 000000000..b70ad22b1 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DateTimeSerializer.kt @@ -0,0 +1,73 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import org.threeten.bp.Instant +import org.threeten.bp.LocalDateTime +import org.threeten.bp.OffsetDateTime +import org.threeten.bp.ZoneOffset +import org.threeten.bp.temporal.ChronoField +import org.threeten.bp.temporal.JulianFields +import org.threeten.bp.temporal.Temporal +import java.nio.ByteBuffer + +object DateTimeSerializer : Serializer<Temporal> { + enum class TimeSpec(val value: Byte) { + LocalTime(0), + UTC(1), + OffsetFromUTC(2), + TimeZone(3); + + companion object { + private val map = TimeSpec.values().associateBy(TimeSpec::value) + fun of(type: Byte) = map[type] + } + } + + override fun serialize(buffer: ChainedByteBuffer, data: Temporal, features: Quassel_Features) { + when (data) { + is LocalDateTime -> { + IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features) + IntSerializer.serialize(buffer, data.getLong(ChronoField.MILLI_OF_DAY).toInt(), features) + ByteSerializer.serialize(buffer, TimeSpec.LocalTime.value, features) + } + is OffsetDateTime -> { + IntSerializer.serialize(buffer, data.getLong(JulianFields.JULIAN_DAY).toInt(), features) + IntSerializer.serialize(buffer, data.getLong(ChronoField.MILLI_OF_DAY).toInt(), features) + ByteSerializer.serialize(buffer, TimeSpec.OffsetFromUTC.value, features) + IntSerializer.serialize(buffer, data.offset.totalSeconds, features) + } + is Instant -> { + val time = data.atOffset(ZoneOffset.UTC) + IntSerializer.serialize(buffer, time.getLong(JulianFields.JULIAN_DAY).toInt(), features) + IntSerializer.serialize(buffer, time.getLong(ChronoField.MILLI_OF_DAY).toInt(), features) + ByteSerializer.serialize(buffer, TimeSpec.UTC.value, features) + } + else -> + throw IllegalArgumentException( + "Unsupported Format: ${data::class.java.canonicalName}") + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Temporal { + val julianDay = IntSerializer.deserialize(buffer, features).toLong() + val milliOfDay = IntSerializer.deserialize(buffer, features).toLong() + val timeSpec = TimeSpec.of(ByteSerializer.deserialize(buffer, features)) + if (milliOfDay == -1L || julianDay == -1L) + return Instant.EPOCH + return when (timeSpec) { + TimeSpec.LocalTime -> + LocalDateTime.now() + .with(JulianFields.JULIAN_DAY, julianDay) + .with(ChronoField.MILLI_OF_DAY, milliOfDay) + .atZone(ZoneOffset.systemDefault()) + .toInstant() + else -> + OffsetDateTime.now() + .with(JulianFields.JULIAN_DAY, julianDay) + .with(ChronoField.MILLI_OF_DAY, milliOfDay) + .withOffsetSameLocal(ZoneOffset.UTC) + .toInstant() + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt new file mode 100644 index 000000000..0df0a8001 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt @@ -0,0 +1,18 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IDccConfig +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object DccConfig_IpDetectionModeSerializer : Serializer<IDccConfig.IpDetectionMode> { + override fun serialize(buffer: ChainedByteBuffer, data: IDccConfig.IpDetectionMode, + features: Quassel_Features) { + buffer.put(data.value) + } + + override fun deserialize(buffer: ByteBuffer, + features: Quassel_Features): IDccConfig.IpDetectionMode { + return IDccConfig.IpDetectionMode.of(buffer.get()) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt new file mode 100644 index 000000000..f97b8308c --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt @@ -0,0 +1,18 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IDccConfig +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object DccConfig_PortSelectionModeSerializer : Serializer<IDccConfig.PortSelectionMode> { + override fun serialize(buffer: ChainedByteBuffer, data: IDccConfig.PortSelectionMode, + features: Quassel_Features) { + buffer.put(data.value) + } + + override fun deserialize(buffer: ByteBuffer, + features: Quassel_Features): IDccConfig.PortSelectionMode { + return IDccConfig.PortSelectionMode.of(buffer.get()) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt new file mode 100644 index 000000000..e928abb82 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt @@ -0,0 +1,31 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object HandshakeVariantMapSerializer : Serializer<QVariantMap> { + override fun serialize(buffer: ChainedByteBuffer, data: QVariantMap, features: Quassel_Features) { + IntSerializer.serialize(buffer, data.size * 2, features) + data.entries.forEach { (key, value) -> + VariantSerializer.serialize(buffer, QVariant_(key, Type.QString), features) + VariantSerializer.serialize(buffer, value, features) + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): QVariantMap { + val range = 0 until IntSerializer.deserialize(buffer, features) / 2 + val pairs = range.map { + val keyRaw: ByteBuffer? = VariantSerializer.deserialize(buffer, features).value() + val key: String? = if (keyRaw != null) { + StringSerializer.UTF8.deserializeAll(keyRaw) + } else { + null + } + val value = VariantSerializer.deserialize(buffer, features) + Pair(key ?: "", value) + } + val pairArray = pairs.toTypedArray() + return mapOf(*pairArray) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HostAddressSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HostAddressSerializer.kt new file mode 100644 index 000000000..74c0c6168 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HostAddressSerializer.kt @@ -0,0 +1,48 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.NetworkLayerProtocol +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.net.Inet4Address +import java.net.Inet6Address +import java.net.InetAddress +import java.nio.ByteBuffer + +object HostAddressSerializer : Serializer<InetAddress> { + override fun serialize(buffer: ChainedByteBuffer, data: InetAddress, features: Quassel_Features) { + when (data) { + is Inet4Address -> { + ByteSerializer.serialize(buffer, NetworkLayerProtocol.IPv4Protocol.value, features) + buffer.put(data.address) + } + is Inet6Address -> { + ByteSerializer.serialize(buffer, NetworkLayerProtocol.IPv6Protocol.value, features) + buffer.put(data.address) + } + else -> { + ByteSerializer.serialize(buffer, NetworkLayerProtocol.UnknownNetworkLayerProtocol.value, + features) + throw IllegalArgumentException("Invalid network protocol ${data.javaClass.canonicalName}") + } + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): InetAddress { + val type = ByteSerializer.deserialize(buffer, features) + return when (NetworkLayerProtocol.of(type)) { + NetworkLayerProtocol.IPv4Protocol -> { + val buf = ByteArray(4) + buffer.get(buf) + Inet4Address.getByAddress(buf) + } + NetworkLayerProtocol.IPv6Protocol -> { + val buf = ByteArray(16) + buffer.get(buf) + Inet6Address.getByAddress(buf) + } + else -> { + throw IllegalArgumentException("Invalid network protocol $type") + } + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/IntSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/IntSerializer.kt new file mode 100644 index 000000000..f3c680e22 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/IntSerializer.kt @@ -0,0 +1,15 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object IntSerializer : Serializer<Int> { + override fun serialize(buffer: ChainedByteBuffer, data: Int, features: Quassel_Features) { + buffer.putInt(data) + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Int { + return buffer.int + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/LongSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/LongSerializer.kt new file mode 100644 index 000000000..2e92c7b1f --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/LongSerializer.kt @@ -0,0 +1,15 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object LongSerializer : Serializer<Long> { + override fun serialize(buffer: ChainedByteBuffer, data: Long, features: Quassel_Features) { + buffer.putLong(data) + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Long { + return buffer.long + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/MessageSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/MessageSerializer.kt new file mode 100644 index 000000000..96fe47730 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/MessageSerializer.kt @@ -0,0 +1,40 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.quassel.QuasselFeature +import de.kuschku.quasseldroid_ng.util.hasFlag +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import org.threeten.bp.Instant +import java.nio.ByteBuffer + +object MessageSerializer : Serializer<QuasselDatabase.RawMessage> { + override fun serialize(buffer: ChainedByteBuffer, data: QuasselDatabase.RawMessage, + features: Quassel_Features) { + IntSerializer.serialize(buffer, data.messageId, features) + IntSerializer.serialize(buffer, data.time.epochSecond.toInt(), features) + IntSerializer.serialize(buffer, data.type, features) + ByteSerializer.serialize(buffer, data.flag.toByte(), features) + BufferInfoSerializer.serialize(buffer, data.bufferInfo, features) + StringSerializer.UTF8.serialize(buffer, data.sender, features) + if (features.hasFlag(QuasselFeature.SenderPrefixes)) + StringSerializer.UTF8.serialize(buffer, data.senderPrefixes, features) + StringSerializer.UTF8.serialize(buffer, data.content, features) + } + + override fun deserialize(buffer: ByteBuffer, + features: Quassel_Features): QuasselDatabase.RawMessage { + return QuasselDatabase.RawMessage( + messageId = IntSerializer.deserialize(buffer, features), + time = Instant.ofEpochSecond(IntSerializer.deserialize(buffer, features).toLong()), + type = QuasselDatabase.Message.MessageType.of(IntSerializer.deserialize(buffer, features)), + flag = QuasselDatabase.Message.MessageFlag.of( + ByteSerializer.deserialize(buffer, features).toInt()), + bufferInfo = BufferInfoSerializer.deserialize(buffer, features), + sender = StringSerializer.UTF8.deserialize(buffer, features) ?: "", + senderPrefixes = if (features.hasFlag(QuasselFeature.SenderPrefixes)) + StringSerializer.UTF8.deserialize(buffer, features) ?: "" else "", + content = StringSerializer.UTF8.deserialize(buffer, features) ?: "" + ) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ProtocolSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ProtocolSerializer.kt new file mode 100644 index 000000000..69d9aafce --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ProtocolSerializer.kt @@ -0,0 +1,23 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Protocol_Features +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.quassel.Protocol +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object ProtocolSerializer : Serializer<Protocol> { + override fun serialize(buffer: ChainedByteBuffer, data: Protocol, features: Quassel_Features) { + ByteSerializer.serialize(buffer, data.flags.toByte(), features) + ShortSerializer.serialize(buffer, data.data, features) + ByteSerializer.serialize(buffer, data.version, features) + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Protocol { + return Protocol( + Protocol_Features.of(ByteSerializer.deserialize(buffer, features).toInt()), + ShortSerializer.deserialize(buffer, features), + ByteSerializer.deserialize(buffer, features) + ) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/Serializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/Serializer.kt new file mode 100644 index 000000000..aa3f55566 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/Serializer.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2017 Janne Koschinski + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +interface Serializer<T> { + fun serialize(buffer: ChainedByteBuffer, data: T, features: Quassel_Features) + fun deserialize(buffer: ByteBuffer, features: Quassel_Features): T +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ShortSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ShortSerializer.kt new file mode 100644 index 000000000..f9f733e9e --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ShortSerializer.kt @@ -0,0 +1,15 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object ShortSerializer : Serializer<Short> { + override fun serialize(buffer: ChainedByteBuffer, data: Short, features: Quassel_Features) { + buffer.putShort(data) + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Short { + return buffer.short + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringListSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringListSerializer.kt new file mode 100644 index 000000000..335094b86 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringListSerializer.kt @@ -0,0 +1,23 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.QStringList +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object StringListSerializer : Serializer<QStringList?> { + override fun serialize(buffer: ChainedByteBuffer, data: QStringList?, + features: Quassel_Features) { + IntSerializer.serialize(buffer, data?.size ?: 0, features) + data?.forEach { + StringSerializer.UTF16.serialize(buffer, it, features) + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): QStringList { + return (0 until IntSerializer.deserialize(buffer, features)).map { + StringSerializer.UTF16.deserialize(buffer, features) + }.toMutableList() + } + +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringSerializer.kt new file mode 100644 index 000000000..ab220637a --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringSerializer.kt @@ -0,0 +1,101 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.QVariant +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.helpers.copyTo +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer +import java.nio.CharBuffer +import java.nio.charset.Charset +import java.nio.charset.CharsetDecoder +import java.nio.charset.CharsetEncoder + +abstract class StringSerializer( + private val encoder: CharsetEncoder, + private val decoder: CharsetDecoder, + private val trailingNullBytes: Int +) : Serializer<String?> { + constructor(charset: Charset, + trailingNullByte: Boolean = false) : this( + charset.newEncoder(), + charset.newDecoder(), + if (trailingNullByte) { + 1 + } else { + 0 + } + ) + + object UTF16 : StringSerializer(Charsets.UTF_16BE) + object UTF8 : StringSerializer(Charsets.UTF_8) + object C : StringSerializer(Charsets.ISO_8859_1, trailingNullByte = true) + + override fun serialize(buffer: ChainedByteBuffer, data: String?, features: Quassel_Features) { + if (data == null) { + IntSerializer.serialize(buffer, -1, features) + } else { + val charBuffer = CharBuffer.allocate(data.length) + charBuffer.put(data) + charBuffer.flip() + val byteBuffer = encoder.encode(charBuffer) + IntSerializer.serialize(buffer, byteBuffer.remaining() + trailingNullBytes, features) + buffer.put(byteBuffer) + for (i in 0 until trailingNullBytes) + buffer.put(0) + } + } + + fun serialize(data: String?): ByteBuffer = if (data == null) { + ByteBuffer.allocate(0) + } else { + val charBuffer = CharBuffer.allocate(data.length) + charBuffer.put(data) + charBuffer.flip() + encoder.encode(charBuffer) + } + + fun deserializeAll(buffer: ByteBuffer): String? { + val len = buffer.remaining() + return if (len == -1) { + null + } else { + val byteBuffer = ByteBuffer.allocate(len) + buffer.copyTo(byteBuffer) + byteBuffer.clear() + byteBuffer.limit(byteBuffer.limit() - trailingNullBytes) + decoder.decode(byteBuffer).toString() + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): String? { + val len = IntSerializer.deserialize(buffer, features) + return if (len == -1) { + null + } else { + val byteBuffer = ByteBuffer.allocate(len) + buffer.copyTo(byteBuffer) + byteBuffer.clear() + byteBuffer.limit(byteBuffer.limit() - trailingNullBytes) + decoder.decode(byteBuffer).toString() + } + } +} + +fun QVariant<ByteBuffer>?.deserializeString( + serializer: StringSerializer) = if (this?.data == null) { + null +} else { + serializer.deserializeAll(data) +} + +fun ByteBuffer?.deserializeString(serializer: StringSerializer) = if (this == null) { + null +} else { + serializer.deserializeAll(this) +} + +fun String?.serializeString(serializer: StringSerializer) = if (this == null) { + null +} else { + serializer.serialize(this) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/TimeSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/TimeSerializer.kt new file mode 100644 index 000000000..3cbd7d66d --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/TimeSerializer.kt @@ -0,0 +1,16 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import org.threeten.bp.LocalTime +import java.nio.ByteBuffer + +object TimeSerializer : Serializer<LocalTime> { + override fun serialize(buffer: ChainedByteBuffer, data: LocalTime, features: Quassel_Features) { + IntSerializer.serialize(buffer, (data.toNanoOfDay() / 1000).toInt(), features) + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): LocalTime { + return LocalTime.ofNanoOfDay(IntSerializer.deserialize(buffer, features).toLong() * 1000) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantListSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantListSerializer.kt new file mode 100644 index 000000000..699e94a00 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantListSerializer.kt @@ -0,0 +1,27 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.QVariantList +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object VariantListSerializer : Serializer<QVariantList> { + override fun serialize(buffer: ChainedByteBuffer, data: QVariantList, + features: Quassel_Features) { + IntSerializer.serialize(buffer, data.size, features) + data.forEach { + VariantSerializer.serialize(buffer, it, features) + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): QVariantList { + val length = IntSerializer.deserialize(buffer, features) + val result = mutableListOf<QVariant_>() + for (i in 0 until length) { + result.add(VariantSerializer.deserialize(buffer, features)) + } + return result + } + +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantMapSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantMapSerializer.kt new file mode 100644 index 000000000..732c09070 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantMapSerializer.kt @@ -0,0 +1,26 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object VariantMapSerializer : Serializer<QVariantMap> { + override fun serialize(buffer: ChainedByteBuffer, data: QVariantMap, features: Quassel_Features) { + IntSerializer.serialize(buffer, data.size, features) + data.entries.forEach { (key, value) -> + StringSerializer.UTF16.serialize(buffer, key, features) + VariantSerializer.serialize(buffer, value, features) + } + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): QVariantMap { + return mutableMapOf(*(0 until IntSerializer.deserialize(buffer, features)).map { + Pair( + StringSerializer.UTF16.deserialize(buffer, features) ?: "", + VariantSerializer.deserialize(buffer, features) + ) + }.toTypedArray()) + } + +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantSerializer.kt new file mode 100644 index 000000000..29fcb18c9 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantSerializer.kt @@ -0,0 +1,39 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object VariantSerializer : Serializer<QVariant_> { + override fun serialize(buffer: ChainedByteBuffer, data: QVariant_, features: Quassel_Features) { + IntSerializer.serialize(buffer, data.type.type.id, features) + BoolSerializer.serialize(buffer, false, features) + if (data.type.type == Type.UserType) { + StringSerializer.C.serialize(buffer, data.type.name, features) + } + if (data.type.serializer == null) { + throw IllegalArgumentException("Unknown type: ${data.type.name}") + } + data.type.serializer.serialize(buffer, data.data, features) + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): QVariant_ { + val rawType = IntSerializer.deserialize(buffer, features) + val type = Type.of(rawType) + + val isNull = BoolSerializer.deserialize(buffer, features) + + val metaType: MetaType<All_> = if (type == Type.UserType) { + val deserialize = StringSerializer.C.deserialize(buffer, features) + MetaType.get(deserialize) + } else { + MetaType.get(type) + } + if (metaType.serializer == null) { + throw IllegalArgumentException("Unknown type: ${metaType.name}") + } + + val result = metaType.serializer.deserialize(buffer, features) + return QVariant(result, metaType) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VoidSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VoidSerializer.kt new file mode 100644 index 000000000..e7b172a77 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VoidSerializer.kt @@ -0,0 +1,14 @@ +package de.kuschku.quasseldroid_ng.protocol.primitive.serializer + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.ByteBuffer + +object VoidSerializer : Serializer<Any?> { + override fun serialize(buffer: ChainedByteBuffer, data: Any?, features: Quassel_Features) { + } + + override fun deserialize(buffer: ByteBuffer, features: Quassel_Features): Any? { + return null + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/BufferInfo.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/BufferInfo.kt new file mode 100644 index 000000000..19c9bb276 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/BufferInfo.kt @@ -0,0 +1,38 @@ +package de.kuschku.quasseldroid_ng.quassel + +import de.kuschku.quasseldroid_ng.protocol.Buffer_Types +import de.kuschku.quasseldroid_ng.util.Flag +import de.kuschku.quasseldroid_ng.util.Flags +import de.kuschku.quasseldroid_ng.util.ShortFlag +import de.kuschku.quasseldroid_ng.util.ShortFlags + +data class BufferInfo(var bufferId: Int, var networkId: Int, var type: Buffer_Types, + var groupId: Int, + var bufferName: String?) { + enum class Type(override val bit: Short) : ShortFlag<Type> { + InvalidBuffer(0x00), + StatusBuffer(0x01), + ChannelBuffer(0x02), + QueryBuffer(0x04), + GroupBuffer(0x08); + + companion object : ShortFlags.Factory<Type> { + val validValues = values().filter { it.bit != 0.toShort() }.toTypedArray() + override fun of(bit: Short) = ShortFlags.ofBitMask<Type>(bit) + override fun of(vararg flags: Type) = ShortFlags.of(*flags) + } + } + + enum class Activity(override val bit: Int) : Flag<Activity> { + NoActivity(0x00), + OtherActivity(0x01), + NewMessage(0x02), + Highlight(0x40); + + companion object : Flags.Factory<Activity> { + override val NONE = Activity.of() + override fun of(bit: Int) = Flags.of<Activity>(bit) + override fun of(vararg flags: Activity) = Flags.of(*flags) + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/NetworkInfo.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/NetworkInfo.kt new file mode 100644 index 000000000..4c6c257eb --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/NetworkInfo.kt @@ -0,0 +1,2 @@ +package de.kuschku.quasseldroid_ng.quassel + diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolFeature.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolFeature.kt new file mode 100644 index 000000000..034daba49 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolFeature.kt @@ -0,0 +1,16 @@ +package de.kuschku.quasseldroid_ng.quassel + +import de.kuschku.quasseldroid_ng.util.Flag +import de.kuschku.quasseldroid_ng.util.Flags + +enum class ProtocolFeature(override val bit: Int) : Flag<ProtocolFeature> { + None(0x00), + TLS(0x01), + Compression(0x02); + + companion object : Flags.Factory<ProtocolFeature> { + override val NONE = ProtocolFeature.of() + override fun of(bit: Int) = Flags.of<ProtocolFeature>(bit) + override fun of(vararg flags: ProtocolFeature) = Flags.of(*flags) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolMeta.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolMeta.kt new file mode 100644 index 000000000..ca65033f3 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolMeta.kt @@ -0,0 +1,5 @@ +package de.kuschku.quasseldroid_ng.quassel + +import de.kuschku.quasseldroid_ng.protocol.Protocol_Features + +data class Protocol(val flags: Protocol_Features, val data: Short, val version: Byte) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/QuasselFeature.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/QuasselFeature.kt new file mode 100644 index 000000000..ccfe70cfa --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/QuasselFeature.kt @@ -0,0 +1,44 @@ +package de.kuschku.quasseldroid_ng.quassel + +import de.kuschku.quasseldroid_ng.util.Flag +import de.kuschku.quasseldroid_ng.util.Flags + +/** + * A list of features that are optional in core and/or client, but need runtime checking + * + * Some features require an uptodate counterpart, but don't justify a protocol break. + * This is what we use this enum for. Add such features to it and check at runtime on the other + * side for their existence. + * + * This list should be cleaned up after every protocol break, as we can assume them to be present then. + */ +enum class QuasselFeature(override val bit: Int) : Flag<QuasselFeature> { + None(0x0000), + SynchronizedMarkerLine(0x0001), + SaslAuthentication(0x0002), + SaslExternal(0x0004), + HideInactiveNetworks(0x0008), + PasswordChange(0x0010), + /** IRCv3 capability negotiation, account tracking */ + CapNegotiation(0x0020), + /** IRC server SSL validation */ + VerifyServerSSL(0x0040), + /** IRC server custom message rate limits */ + CustomRateLimits(0x0080), + DccFileTransfer(0x0100), + /** Timestamp formatting in away (e.g. %%hh:mm%%) */ + AwayFormatTimestamp(0x0200), + /** Whether or not the core supports auth backends. */ + Authenticators(0x0400), + /** Sync buffer activity status */ + BufferActivitySync(0x0800), + /** Show prefixes for senders in backlog */ + SenderPrefixes(0x1000); + + companion object : Flags.Factory<QuasselFeature> { + override val NONE: Flags<QuasselFeature> = QuasselFeature.of() + val validValues = values().filter { it.bit != 0 }.toTypedArray() + override fun of(bit: Int) = Flags.of<QuasselFeature>(bit) + override fun of(vararg flags: QuasselFeature) = Flags.of(*flags) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/AliasManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/AliasManager.kt new file mode 100644 index 000000000..a86219cd4 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/AliasManager.kt @@ -0,0 +1,162 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.protocol.valueOr +import de.kuschku.quasseldroid_ng.quassel.BufferInfo +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IAliasManager +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IAliasManager.Alias +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject +import de.kuschku.quasseldroid_ng.session.SignalProxy +import java.util.* +import java.util.regex.Pattern + +class AliasManager constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "AliasManager"), IAliasManager, ISyncableObject { + override fun toVariantMap(): QVariantMap = mapOf( + "Aliases" to QVariant_(initAliases(), Type.QVariantMap) + ) + + override fun fromVariantMap(properties: QVariantMap) { + initSetAliases(properties["Aliases"].valueOr(::emptyMap)) + } + + override fun initAliases(): QVariantMap = mapOf( + "names" to QVariant_(_aliases.map(Alias::name), Type.QStringList), + "expansions" to QVariant_(_aliases.map(Alias::expansion), Type.QStringList) + ) + + override fun initSetAliases(aliases: QVariantMap) { + val names = aliases["names"].valueOr<List<String>>(::emptyList) + val expansions = aliases["expansions"].valueOr<List<String>>(::emptyList) + + if (names.size != expansions.size) + throw IllegalArgumentException( + "Sizes do not match: names=${names.size}, expansions=${expansions.size}") + + _aliases.clear() + _aliases.addAll(names.zip(expansions, ::Alias)) + } + + override fun addAlias(name: String, expansion: String) { + if (contains(name)) { + return + } + + _aliases.add(Alias(name, expansion)) + + super.addAlias(name, expansion) + } + + fun indexOf(name: String) = _aliases.map(Alias::name).indexOf(name) + + fun contains(name: String) = _aliases.map(Alias::name).contains(name) + + fun defaults() = listOf<Alias>( + Alias("j", "/join $0"), + Alias("ns", "/msg nickserv $0"), + Alias("nickserv", "/msg nickserv $0"), + Alias("cs", "/msg chanserv $0"), + Alias("chanserv", "/msg chanserv $0"), + Alias("hs", "/msg hostserv $0"), + Alias("hostserv", "/msg hostserv $0"), + Alias("wii", "/whois $0 $0"), + Alias("back", "/quote away"), + + // let's add aliases for scripts that only run on linux + Alias("inxi", "/exec inxi $0"), + Alias("sysinfo", "/exec inxi -d") + ) + + fun processInput(info: BufferInfo, message: String, + previousCommands: MutableList<IAliasManager.Command>) { + var msg = message + + // leading slashes indicate there's a command to call unless there is another one in the first section (like a path /proc/cpuinfo) + // For those habitally tied to irssi, "/ " also makes the rest of the line a literal message + val secondSlashPos = msg.indexOf('/', 1) + val firstSpacePos = msg.indexOf(' ') + if (!msg.startsWith('/') || firstSpacePos == 1 || + (secondSlashPos != -1 && (secondSlashPos < firstSpacePos || firstSpacePos == -1))) { + if (msg.startsWith("//")) + msg = msg.substring(1) // "//asdf" is transformed to "/asdf" + else if (msg.startsWith("/ ")) + msg.substring(2) // "/ /asdf" is transformed to "/asdf" + msg = "/SAY $msg" // make sure we only send proper commands to the core + } else { + // check for aliases + val split = msg.split(' ', ignoreCase = true, limit = 2) + val search: String = split.firstOrNull() + ?: return + val found = _aliases.firstOrNull { it.name.equals(search, true) } + ?: return + expand(found.expansion, info, split.getOrNull(1) ?: "", previousCommands) + } + + previousCommands.add(IAliasManager.Command(info, msg)) + } + + fun expand(expansion: String, bufferInfo: BufferInfo, msg: String, + previousCommands: MutableList<IAliasManager.Command>) { + val network = proxy.network(bufferInfo.networkId) + + val paramRange = Pattern.compile("""\$(\d+)\.\.(\d*)""") + val commands = Arrays.asList( + *expansion.split("; ?").dropLastWhile { it.isEmpty() }.toTypedArray()) + val params = Arrays.asList<String>( + *msg.split(' ').dropLastWhile({ it.isEmpty() }).toTypedArray()) + val expandedCommands = LinkedList<String>() + + for (i in commands.indices) { + var command = commands[i] + + if (params.size != 0) { + val m = paramRange.matcher(command) + while (m.find()) { + val start = m.group(1).toIntOrNull() ?: -1 + val replacement: String + // $1.. would be "arg1 and all following" + replacement = if (m.group(2).isEmpty()) { + params.subList(start, params.size).joinToString(" ") + } else { + val end = m.group(2).toIntOrNull() ?: -1 + if (end < start) { + "" + } else { + params.subList(start, end).joinToString(" ") + } + } + command = command.substring(0, m.start()) + replacement + command.substring(m.end()) + } + } + + for (j in params.size downTo 1) { + val user = network?.ircUser(params[j - 1]) + val host = user?.host() ?: "*" + command = command.replace(String.format(Locale.US, "$%d:hostname", j).toRegex(), host) + command = command.replace(String.format(Locale.US, "$%d", j).toRegex(), params[j - 1]) + } + command = command.replace("$0", msg) + command = command.replace("\$channelname", bufferInfo.bufferName ?: "") + command = command.replace("\$channel", bufferInfo.bufferName ?: "") + command = command.replace("\$currentnick", network?.myNick() ?: "") + command = command.replace("\$nick", network?.myNick() ?: "") + command = command.replace("\$network", network?.networkName() ?: "") + expandedCommands.add(command) + } + while (!expandedCommands.isEmpty()) { + val command: String + if (expandedCommands[0].trim { it <= ' ' }.toLowerCase(Locale.US).startsWith("/wait ")) { + command = expandedCommands.joinToString("; ") + expandedCommands.clear() + } else { + command = expandedCommands[0] + } + previousCommands.add(IAliasManager.Command(bufferInfo, command)) + } + } + + private val _aliases = mutableListOf<IAliasManager.Alias>() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BacklogManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BacklogManager.kt new file mode 100644 index 000000000..7c58a3a33 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BacklogManager.kt @@ -0,0 +1,19 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.BufferId +import de.kuschku.quasseldroid_ng.protocol.MsgId +import de.kuschku.quasseldroid_ng.protocol.QVariantList +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IBacklogManager +import de.kuschku.quasseldroid_ng.session.SignalProxy + +class BacklogManager constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "BacklogManager"), IBacklogManager { + override fun receiveBacklog(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int, + additional: Int, messages: QVariantList) { + } + + override fun receiveBacklogAll(first: MsgId, last: MsgId, limit: Int, additional: Int, + messages: QVariantList) { + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferSyncer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferSyncer.kt new file mode 100644 index 000000000..91c6ebc70 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferSyncer.kt @@ -0,0 +1,123 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IBufferSyncer +import de.kuschku.quasseldroid_ng.session.SignalProxy +import de.kuschku.quasseldroid_ng.util.Flags + +class BufferSyncer constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "BufferSyncer"), IBufferSyncer { + fun lastSeenMsg(buffer: BufferId): MsgId = _lastSeenMsg[buffer] ?: 0 + fun markerLine(buffer: BufferId): MsgId = _markerLines[buffer] ?: 0 + fun activity(buffer: BufferId): Message_Types = _bufferActivities[buffer] ?: Message_Types.of() + + override fun toVariantMap(): QVariantMap = mapOf( + "Activities" to QVariant_(initActivities(), Type.QVariantList), + "LastSeenMsg" to QVariant_(initLastSeenMsg(), Type.QVariantList), + "MarkerLines" to QVariant_(initMarkerLines(), Type.QVariantList) + ) + + override fun fromVariantMap(properties: QVariantMap) { + initSetActivities(properties["Activities"].valueOr(::emptyList)) + initSetLastSeenMsg(properties["LastSeenMsg"].valueOr(::emptyList)) + initSetMarkerLines(properties["MarkerLines"].valueOr(::emptyList)) + } + + override fun initActivities(): QVariantList { + val list: MutableList<QVariant_> = mutableListOf() + for ((key, value) in _bufferActivities) { + list.add(QVariant_(key, QType.BufferId)) + list.add(QVariant_(value, Type.Int)) + } + return list + } + + override fun initLastSeenMsg(): QVariantList { + val list: MutableList<QVariant_> = mutableListOf() + for ((key, value) in _bufferActivities) { + list.add(QVariant_(key, QType.BufferId)) + list.add(QVariant_(value, QType.MsgId)) + } + return list + } + + override fun initMarkerLines(): QVariantList { + val list: MutableList<QVariant_> = mutableListOf() + for ((key, value) in _bufferActivities) { + list.add(QVariant_(key, QType.BufferId)) + list.add(QVariant_(value, QType.MsgId)) + } + return list + } + + override fun initSetActivities(data: QVariantList) { + (0 until data.size step 2).map { + data[it].value(0) to data[it + 1].value(0) + }.forEach { (buffer, activity) -> + setBufferActivity(buffer, activity) + } + } + + override fun initSetLastSeenMsg(data: QVariantList) { + (0 until data.size step 2).map { + data[it].value(0) to data[it + 1].value(0) + }.forEach { (buffer, msgId) -> + setLastSeenMsg(buffer, msgId) + } + } + + override fun initSetMarkerLines(data: QVariantList) { + (0 until data.size step 2).map { + data[it].value(0) to data[it + 1].value(0) + }.forEach { (buffer, msgId) -> + setMarkerLine(buffer, msgId) + } + } + + override fun mergeBuffersPermanently(buffer1: BufferId, buffer2: BufferId) { + _lastSeenMsg.remove(buffer2) + _markerLines.remove(buffer2) + _bufferActivities.remove(buffer2) + } + + override fun removeBuffer(buffer: BufferId) { + _lastSeenMsg.remove(buffer) + _markerLines.remove(buffer) + _bufferActivities.remove(buffer) + } + + override fun renameBuffer(buffer: BufferId, newName: String) { + } + + override fun setLastSeenMsg(buffer: BufferId, msgId: MsgId) { + if (msgId < 0) + return + + val oldLastSeenMsg = lastSeenMsg(buffer) + if (oldLastSeenMsg < msgId) { + _lastSeenMsg[buffer] = msgId + super.setLastSeenMsg(buffer, msgId) + } + } + + override fun setMarkerLine(buffer: BufferId, msgId: MsgId) { + if (msgId < 0 || markerLine(buffer) == msgId) + return + + _markerLines[buffer] = msgId + super.setMarkerLine(buffer, msgId) + } + + override fun setBufferActivity(buffer: BufferId, activity: Int) { + val flags = Message_Types.of<Message_Type>(activity) + super.setBufferActivity(buffer, activity) + _bufferActivities[buffer] = flags + } + + private val _lastSeenMsg: MutableMap<BufferId, MsgId> = mutableMapOf() + private val _markerLines: MutableMap<BufferId, MsgId> = mutableMapOf() + private val _bufferActivities: MutableMap<BufferId, Flags<QuasselDatabase.Message.MessageType>> = mutableMapOf() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewConfig.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewConfig.kt new file mode 100644 index 000000000..29c48f710 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewConfig.kt @@ -0,0 +1,209 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import clamp +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IBufferViewConfig +import de.kuschku.quasseldroid_ng.session.SignalProxy + +class BufferViewConfig constructor( + bufferViewId: Int, + proxy: SignalProxy +) : SyncableObject(proxy, "BufferViewConfig"), IBufferViewConfig { + override fun init() { + renameObject("$_bufferViewId") + } + + override fun toVariantMap(): QVariantMap = mapOf( + "BufferList" to QVariant_(initBufferList(), Type.QVariantList), + "RemovedBuffers" to QVariant_(initBufferList(), Type.QVariantList), + "TemporarilyRemovedBuffers" to QVariant_(initBufferList(), Type.QVariantList) + ) + initProperties() + + override fun fromVariantMap(properties: QVariantMap) { + initSetBufferList(properties["BufferList"].valueOr(::emptyList)) + initSetRemovedBuffers(properties["RemovedBuffers"].valueOr(::emptyList)) + initSetTemporarilyRemovedBuffers(properties["TemporarilyRemovedBuffers"].valueOr(::emptyList)) + initSetProperties(properties) + } + + override fun initBufferList(): QVariantList = _buffers.map { + QVariant_(it, QType.BufferId) + } + + override fun initRemovedBuffers(): QVariantList = _removedBuffers.map { + QVariant_(it, QType.BufferId) + } + + override fun initTemporarilyRemovedBuffers(): QVariantList = _temporarilyRemovedBuffers.map { + QVariant_(it, QType.BufferId) + } + + override fun initProperties(): QVariantMap = mapOf( + "bufferViewName" to QVariant_(bufferViewName(), Type.QString), + "networkId" to QVariant_(networkId(), QType.NetworkId), + "addNewBuffersAutomatically" to QVariant_(addNewBuffersAutomatically(), Type.Bool), + "sortAlphabetically" to QVariant_(sortAlphabetically(), Type.Bool), + "hideInactiveBuffers" to QVariant_(hideInactiveBuffers(), Type.Bool), + "hideInactiveNetworks" to QVariant_(hideInactiveNetworks(), Type.Bool), + "disableDecoration" to QVariant_(disableDecoration(), Type.Bool), + "allowedBufferTypes" to QVariant_(allowedBufferTypes(), Type.Int), + "minimumActivity" to QVariant_(minimumActivity(), Type.Int), + "showSearch" to QVariant_(showSearch(), Type.Bool) + ) + + override fun initSetBufferList(buffers: QVariantList) { + _buffers = buffers.mapNotNull { it.value<BufferId?>() }.toMutableList() + } + + override fun initSetRemovedBuffers(buffers: QVariantList) { + _removedBuffers = buffers.mapNotNull { it.value<BufferId?>() }.toMutableSet() + } + + override fun initSetTemporarilyRemovedBuffers(buffers: QVariantList) { + _temporarilyRemovedBuffers = buffers.mapNotNull { it.value<BufferId?>() }.toMutableSet() + } + + override fun initSetProperties(properties: QVariantMap) { + setBufferViewName(properties["bufferViewName"].value(bufferViewName())) + setNetworkId(properties["networkId"].value(networkId())) + setAddNewBuffersAutomatically( + properties["addNewBuffersAutomatically"].value(addNewBuffersAutomatically())) + setSortAlphabetically(properties["sortAlphabetically"].value(sortAlphabetically())) + setHideInactiveBuffers(properties["hideInactiveBuffers"].value(hideInactiveBuffers())) + setHideInactiveNetworks(properties["hideInactiveNetworks"].value(hideInactiveNetworks())) + setDisableDecoration(properties["disableDecoration"].value(disableDecoration())) + setAllowedBufferTypes(properties["allowedBufferTypes"].value(allowedBufferTypes().toInt())) + setMinimumActivity(properties["minimumActivity"].value(minimumActivity().toInt())) + setShowSearch(properties["showSearch"].value(showSearch())) + } + + override fun addBuffer(bufferId: BufferId, pos: Int) { + if (_buffers.contains(bufferId)) + return + + if (_removedBuffers.contains(bufferId)) + _removedBuffers.remove(bufferId) + + if (_temporarilyRemovedBuffers.contains(bufferId)) + _temporarilyRemovedBuffers.remove(bufferId) + + _buffers.add(minOf(maxOf(pos, 0), _buffers.size), bufferId) + } + + override fun moveBuffer(bufferId: BufferId, pos: Int) { + if (!_buffers.contains(bufferId)) + return + + val currentPos = _buffers.indexOf(bufferId) + val targetPos = pos.clamp(0, _buffers.size - 1) + + if (currentPos > targetPos) { + _buffers.removeAt(currentPos) + _buffers.add(bufferId, targetPos) + } + + if (currentPos < targetPos) { + _buffers.removeAt(currentPos) + _buffers.add(bufferId, targetPos - 1) + } + } + + override fun removeBuffer(bufferId: BufferId) { + if (_buffers.contains(bufferId)) + _buffers.remove(bufferId) + + if (_removedBuffers.contains(bufferId)) + _removedBuffers.remove(bufferId) + + _temporarilyRemovedBuffers.add(bufferId) + } + + override fun removeBufferPermanently(bufferId: BufferId) { + if (_buffers.contains(bufferId)) + _buffers.remove(bufferId) + + if (_temporarilyRemovedBuffers.contains(bufferId)) + _temporarilyRemovedBuffers.remove(bufferId); + + _removedBuffers.add(bufferId) + } + + fun bufferViewId() = _bufferViewId + fun bufferViewName() = _bufferViewName + fun networkId() = _networkId + fun addNewBuffersAutomatically() = _addNewBuffersAutomatically + fun sortAlphabetically() = _sortAlphabetically + fun hideInactiveBuffers() = _hideInactiveBuffers + fun hideInactiveNetworks() = _hideInactiveNetworks + fun disableDecoration() = _disableDecoration + fun allowedBufferTypes() = _allowedBufferTypes + fun minimumActivity() = _minimumActivity + fun showSearch() = _showSearch + + + override fun setAddNewBuffersAutomatically(addNewBuffersAutomatically: Boolean) { + _addNewBuffersAutomatically = addNewBuffersAutomatically + super.setAddNewBuffersAutomatically(addNewBuffersAutomatically) + } + + override fun setAllowedBufferTypes(bufferTypes: Int) { + _allowedBufferTypes = Buffer_Type.of(bufferTypes.toShort()) + super.setAllowedBufferTypes(bufferTypes) + } + + override fun setBufferViewName(bufferViewName: String) { + _bufferViewName = bufferViewName + super.setBufferViewName(bufferViewName) + } + + override fun setDisableDecoration(disableDecoration: Boolean) { + _disableDecoration = disableDecoration + super.setDisableDecoration(disableDecoration) + } + + override fun setHideInactiveBuffers(hideInactiveBuffers: Boolean) { + _hideInactiveBuffers = hideInactiveBuffers + super.setHideInactiveBuffers(hideInactiveBuffers) + } + + override fun setHideInactiveNetworks(hideInactiveNetworks: Boolean) { + _hideInactiveNetworks = hideInactiveNetworks + super.setHideInactiveNetworks(hideInactiveNetworks) + } + + override fun setMinimumActivity(activity: Int) { + _minimumActivity = Buffer_Activity.of(activity) + super.setMinimumActivity(activity) + } + + override fun setNetworkId(networkId: NetworkId) { + _networkId = networkId + super.setNetworkId(networkId) + } + + override fun setShowSearch(showSearch: Boolean) { + _showSearch = showSearch + super.setShowSearch(showSearch) + } + + override fun setSortAlphabetically(sortAlphabetically: Boolean) { + _sortAlphabetically = sortAlphabetically + super.setSortAlphabetically(sortAlphabetically) + } + + val _bufferViewId: Int = bufferViewId + var _bufferViewName: String = "" + var _networkId: NetworkId = 0 + var _addNewBuffersAutomatically: Boolean = true + var _sortAlphabetically: Boolean = true + var _hideInactiveBuffers: Boolean = false + var _hideInactiveNetworks: Boolean = false + var _disableDecoration: Boolean = false + var _allowedBufferTypes: Buffer_Types = Buffer_Type.of(*Buffer_Type.validValues) + var _minimumActivity: Buffer_Activities = Buffer_Activities.of(0) + var _showSearch: Boolean = false + var _buffers: MutableList<BufferId> = mutableListOf() + var _removedBuffers: MutableSet<BufferId> = mutableSetOf() + var _temporarilyRemovedBuffers: MutableSet<BufferId> = mutableSetOf() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewManager.kt new file mode 100644 index 000000000..7ea65b6f7 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewManager.kt @@ -0,0 +1,55 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IBufferViewManager +import de.kuschku.quasseldroid_ng.session.SignalProxy + +class BufferViewManager constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "BufferViewManager"), IBufferViewManager { + override fun toVariantMap(): QVariantMap = mapOf( + "BufferViewIds" to QVariant_(initBufferViewIds(), Type.QVariantList) + ) + + override fun fromVariantMap(properties: QVariantMap) { + initSetBufferViewIds(properties["BufferViewIds"].valueOr(::emptyList)) + } + + override fun initBufferViewIds(): QVariantList = _bufferViewConfigs.keys.map { + QVariant_(it, Type.Int) + } + + fun bufferViewConfig(bufferViewId: Int) = _bufferViewConfigs[bufferViewId] + + fun bufferViewConfigs() = _bufferViewConfigs.values + + override fun initSetBufferViewIds(bufferViewIds: QVariantList) { + bufferViewIds + .mapNotNull { it.value<Int>() } + .forEach { addBufferViewConfig(it) } + } + + override fun addBufferViewConfig(config: BufferViewConfig) { + if (_bufferViewConfigs.contains(config.bufferViewId())) + return + + proxy.synchronize(config) + _bufferViewConfigs[config.bufferViewId()] = config + } + + override fun addBufferViewConfig(bufferViewConfigId: Int) { + if (_bufferViewConfigs.contains(bufferViewConfigId)) + return + + addBufferViewConfig(BufferViewConfig(bufferViewConfigId, proxy)) + } + + override fun deleteBufferViewConfig(bufferViewConfigId: Int) { + if (!_bufferViewConfigs.contains(bufferViewConfigId)) + return + + _bufferViewConfigs.remove(bufferViewConfigId) + } + + private val _bufferViewConfigs: MutableMap<BufferId, BufferViewConfig> = mutableMapOf() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CertManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CertManager.kt new file mode 100644 index 000000000..a02fe7177 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CertManager.kt @@ -0,0 +1,47 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ICertManager +import de.kuschku.quasseldroid_ng.session.SignalProxy +import java.nio.ByteBuffer + +class CertManager constructor( + private val _identityId: IdentityId, + proxy: SignalProxy +) : SyncableObject(proxy, "CertManager"), ICertManager { + override fun init() { + renameObject("$_identityId") + } + + override fun toVariantMap() = initProperties() + + override fun fromVariantMap(properties: QVariantMap) { + initSetProperties(properties) + } + + override fun initProperties(): QVariantMap = mapOf( + "sslKey" to QVariant_(sslKeyPem(), Type.QByteArray), + "sslCert" to QVariant_(sslCertPem(), Type.QByteArray) + ) + + override fun initSetProperties(properties: QVariantMap) { + setSslKey(properties["sslKey"].value()) + setSslCert(properties["sslCert"].value()) + } + + fun sslCertPem() = _sslCert + fun sslKeyPem() = _sslKey + + override fun setSslCert(encoded: ByteBuffer?) { + _sslCert = encoded + super.setSslCert(encoded) + } + + override fun setSslKey(encoded: ByteBuffer?) { + _sslKey = encoded + super.setSslKey(encoded) + } + + private var _sslKey: ByteBuffer? = null + private var _sslCert: ByteBuffer? = null +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CoreInfo.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CoreInfo.kt new file mode 100644 index 000000000..6e29d5c40 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CoreInfo.kt @@ -0,0 +1,35 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.protocol.value +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ICoreInfo +import de.kuschku.quasseldroid_ng.session.SignalProxy + +class CoreInfo constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "CoreInfo"), ICoreInfo { + override fun toVariantMap() = initProperties() + + override fun fromVariantMap(properties: QVariantMap) { + initSetProperties(properties) + } + + override fun initProperties(): QVariantMap = mapOf( + "coreData" to QVariant_(coreData(), Type.QVariantMap) + ) + + override fun initSetProperties(properties: QVariantMap) { + setCoreData(properties["coreData"].value(coreData())) + } + + override fun setCoreData(data: QVariantMap) { + _coreData = data + super.setCoreData(data) + } + + fun coreData() = _coreData + + private var _coreData: QVariantMap = emptyMap() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/DccConfig.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/DccConfig.kt new file mode 100644 index 000000000..364689678 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/DccConfig.kt @@ -0,0 +1,148 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IDccConfig +import de.kuschku.quasseldroid_ng.session.SignalProxy +import java.net.Inet4Address +import java.net.InetAddress + +class DccConfig constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "DccConfig"), IDccConfig { + override fun init() { + renameObject("DccConfig") + } + + override fun toVariantMap() = initProperties() + + override fun fromVariantMap(properties: QVariantMap) { + initSetProperties(properties) + } + + override fun initProperties(): QVariantMap = mapOf( + /// Whether DCC is enabled + "dccEnabled" to QVariant_(isDccEnabled(), Type.Bool), + /// The IP to use for outgoing traffic + "outgoingIp" to QVariant_(outgoingIp(), QType.QHostAddress), + /// The IP detection mode + "ipDetectionMode" to QVariant_(ipDetectionMode(), QType.DccConfig_IpDetectionMode), + /// The port range selection mode + "portSelectionMode" to QVariant_(portSelectionMode(), QType.DccConfig_PortSelectionMode), + /// Minimum port to use for incoming connections + "minPort" to QVariant_(minPort(), Type.UShort), + /// Maximum port to use for incoming connections + "maxPort" to QVariant_(maxPort(), Type.UShort), + /// The chunk size to be used + "chunkSize" to QVariant_(chunkSize(), Type.Int), + /// The timeout for DCC transfers + "sendTimeout" to QVariant_(sendTimeout(), Type.Int), + /// Whether passive (reverse) DCC should be used + "usePassiveDcc" to QVariant_(usePassiveDcc(), Type.Bool), + /// Whether fast sending should be used + "useFastSend" to QVariant_(useFastSend(), Type.Bool) + ) + + override fun initSetProperties(properties: QVariantMap) { + /// Whether DCC is enabled + setDccEnabled(properties["dccEnabled"].value(isDccEnabled())) + /// The IP to use for outgoing traffic + setOutgoingIp(properties["outgoingIp"].value(outgoingIp())) + /// The IP detection mode + setIpDetectionMode(properties["ipDetectionMode"].value(ipDetectionMode())) + /// The port range selection mode + setPortSelectionMode(properties["portSelectionMode"].value(portSelectionMode())) + /// Minimum port to use for incoming connections + setMinPort(properties["minPort"].value(minPort())) + /// Maximum port to use for incoming connections + setMaxPort(properties["maxPort"].value(maxPort())) + /// The chunk size to be used + setChunkSize(properties["chunkSize"].value(chunkSize())) + /// The timeout for DCC transfers + setSendTimeout(properties["sendTimeout"].value(sendTimeout())) + /// Whether passive (reverse) DCC should be used + setUsePassiveDcc(properties["usePassiveDcc"].value(usePassiveDcc())) + /// Whether fast sending should be used + setUseFastSend(properties["useFastSend"].value(useFastSend())) + } + + override fun setDccEnabled(enabled: Boolean) { + _dccEnabled = enabled + } + + override fun setOutgoingIp(outgoingIp: InetAddress) { + _outgoingIp = outgoingIp + } + + override fun setIpDetectionMode(ipDetectionMode: IDccConfig.IpDetectionMode) { + _ipDetectionMode = ipDetectionMode + } + + override fun setPortSelectionMode(portSelectionMode: IDccConfig.PortSelectionMode) { + _portSelectionMode = portSelectionMode + } + + override fun setMinPort(port: UShort) { + _minPort = port + } + + override fun setMaxPort(port: UShort) { + _maxPort = port + } + + override fun setChunkSize(chunkSize: Int) { + _chunkSize = chunkSize + } + + override fun setSendTimeout(timeout: Int) { + _sendTimeout = timeout + } + + override fun setUsePassiveDcc(use: Boolean) { + _usePassiveDcc = use + } + + override fun setUseFastSend(use: Boolean) { + _useFastSend = use + } + + fun isDccEnabled() = _dccEnabled + fun outgoingIp() = _outgoingIp + fun ipDetectionMode() = _ipDetectionMode + fun portSelectionMode() = _portSelectionMode + fun minPort() = _minPort + fun maxPort() = _maxPort + fun chunkSize() = _chunkSize + fun sendTimeout() = _sendTimeout + fun usePassiveDcc() = _usePassiveDcc + fun useFastSend() = _useFastSend + + /** Whether DCC is enabled */ + private var _dccEnabled: Boolean = false + + /** The IP to use for outgoing traffic */ + private var _outgoingIp: InetAddress = Inet4Address.getByAddress(byteArrayOf(127, 0, 0, 1)) + + /** The IP detection mode */ + private var _ipDetectionMode: IDccConfig.IpDetectionMode = IDccConfig.IpDetectionMode.Automatic + + /** The port range selection mode */ + private var _portSelectionMode: IDccConfig.PortSelectionMode = IDccConfig.PortSelectionMode.Automatic + + /** Minimum port to use for incoming connections */ + private var _minPort: UShort = 1024 + + /** Maximum port to use for incoming connections */ + private var _maxPort: UShort = 32767 + + /** The chunk size to be used */ + private var _chunkSize: Int = 16 + + /** The timeout for DCC transfers */ + private var _sendTimeout: Int = 180 + + /** Whether passive (reverse) DCC should be used */ + private var _usePassiveDcc: Boolean = false + + /** Whether fast sending should be used */ + private var _useFastSend: Boolean = false +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Identity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Identity.kt new file mode 100644 index 000000000..1b66db966 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Identity.kt @@ -0,0 +1,198 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIdentity +import de.kuschku.quasseldroid_ng.session.SignalProxy + +class Identity constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "Identity"), IIdentity { + override fun toVariantMap() = initProperties() + override fun fromVariantMap(properties: QVariantMap) { + initSetProperties(properties) + } + + override fun init() { + renameObject("${id()}") + } + + override fun initProperties(): QVariantMap = mapOf( + "identityId" to QVariant_(id(), QType.IdentityId), + "identityName" to QVariant_(identityName(), Type.QString), + "realName" to QVariant_(realName(), Type.QString), + "nicks" to QVariant_(nicks(), Type.QStringList), + "awayNick" to QVariant_(awayNick(), Type.QString), + "awayNickEnabled" to QVariant_(awayNickEnabled(), Type.Bool), + "awayReason" to QVariant_(awayReason(), Type.QString), + "awayReasonEnabled" to QVariant_(awayReasonEnabled(), Type.Bool), + "autoAwayEnabled" to QVariant_(autoAwayEnabled(), Type.Bool), + "autoAwayTime" to QVariant_(autoAwayTime(), Type.Int), + "autoAwayReason" to QVariant_(autoAwayReason(), Type.QString), + "autoAwayReasonEnabled" to QVariant_(autoAwayReasonEnabled(), Type.Bool), + "detachAwayEnabled" to QVariant_(detachAwayEnabled(), Type.Bool), + "detachAwayReason" to QVariant_(detachAwayReason(), Type.QString), + "detachAwayReasonEnabled" to QVariant_(detachAwayReasonEnabled(), Type.Bool), + "ident" to QVariant_(ident(), Type.QString), + "kickReason" to QVariant_(kickReason(), Type.QString), + "partReason" to QVariant_(partReason(), Type.QString), + "quitReason" to QVariant_(quitReason(), Type.QString) + ) + + override fun initSetProperties(properties: QVariantMap) { + setId(properties["identityId"].value(id())) + setIdentityName(properties["identityName"].value(identityName())) + setRealName(properties["realName"].value(realName())) + setNicks(properties["nicks"].value(nicks())) + setAwayNick(properties["awayNick"].value(awayNick())) + setAwayNickEnabled(properties["awayNickEnabled"].value(awayNickEnabled())) + setAwayReason(properties["awayReason"].value(awayReason())) + setAwayReasonEnabled(properties["awayReasonEnabled"].value(awayReasonEnabled())) + setAutoAwayEnabled(properties["autoAwayEnabled"].value(autoAwayEnabled())) + setAutoAwayTime(properties["autoAwayTime"].value(autoAwayTime())) + setAutoAwayReason(properties["autoAwayReason"].value(autoAwayReason())) + setAutoAwayReasonEnabled(properties["autoAwayReasonEnabled"].value(autoAwayReasonEnabled())) + setDetachAwayEnabled(properties["detachAwayEnabled"].value(detachAwayEnabled())) + setDetachAwayReason(properties["detachAwayReason"].value(detachAwayReason())) + setDetachAwayReasonEnabled( + properties["detachAwayReasonEnabled"].value(detachAwayReasonEnabled())) + setIdent(properties["ident"].value(ident())) + setKickReason(properties["kickReason"].value(kickReason())) + setPartReason(properties["partReason"].value(partReason())) + setQuitReason(properties["quitReason"].value(quitReason())) + } + + fun id() = _identityId + fun identityName() = _identityName + fun realName() = _realName + fun nicks() = _nicks + fun awayNick() = _awayNick + fun awayNickEnabled() = _awayNickEnabled + fun awayReason() = _awayReason + fun awayReasonEnabled() = _awayReasonEnabled + fun autoAwayEnabled() = _autoAwayEnabled + fun autoAwayTime() = _autoAwayTime + fun autoAwayReason() = _autoAwayReason + fun autoAwayReasonEnabled() = _autoAwayReasonEnabled + fun detachAwayEnabled() = _detachAwayEnabled + fun detachAwayReason() = _detachAwayReason + fun detachAwayReasonEnabled() = _detachAwayReasonEnabled + fun ident() = _ident + fun kickReason() = _kickReason + fun partReason() = _partReason + fun quitReason() = _quitReason + + override fun setAutoAwayEnabled(enabled: Boolean) { + _autoAwayEnabled = enabled + super.setAutoAwayEnabled(enabled) + } + + override fun setAutoAwayReason(reason: String) { + _autoAwayReason = reason + super.setAutoAwayReason(reason) + } + + override fun setAutoAwayReasonEnabled(enabled: Boolean) { + _autoAwayReasonEnabled = enabled + super.setAutoAwayReasonEnabled(enabled) + } + + override fun setAutoAwayTime(time: Int) { + _autoAwayTime = time + super.setAutoAwayTime(time) + } + + override fun setAwayNick(awayNick: String) { + _awayNick = awayNick + super.setAwayNick(awayNick) + } + + override fun setAwayNickEnabled(enabled: Boolean) { + _awayNickEnabled = enabled + super.setAwayNickEnabled(enabled) + } + + override fun setAwayReason(awayReason: String) { + _awayReason = awayReason + super.setAwayReason(awayReason) + } + + override fun setAwayReasonEnabled(enabled: Boolean) { + _awayReasonEnabled = enabled + super.setAwayReasonEnabled(enabled) + } + + override fun setDetachAwayEnabled(enabled: Boolean) { + _detachAwayEnabled = enabled + super.setDetachAwayEnabled(enabled) + } + + override fun setDetachAwayReason(reason: String) { + _detachAwayReason = reason + super.setDetachAwayReason(reason) + } + + override fun setDetachAwayReasonEnabled(enabled: Boolean) { + _detachAwayReasonEnabled = enabled + super.setDetachAwayReasonEnabled(enabled) + } + + override fun setId(id: IdentityId) { + _identityId = id + super.setId(id) + } + + override fun setIdent(ident: String) { + _ident = ident + super.setIdent(ident) + } + + override fun setIdentityName(name: String) { + _identityName = name + super.setIdentityName(name) + } + + override fun setKickReason(reason: String) { + _kickReason = reason + super.setKickReason(reason) + } + + override fun setNicks(nicks: QStringList) { + _nicks = nicks.filterNotNull().toMutableList() + super.setNicks(nicks) + } + + override fun setPartReason(reason: String) { + _partReason = reason + super.setPartReason(reason) + } + + override fun setQuitReason(reason: String) { + _quitReason = reason + super.setQuitReason(reason) + } + + override fun setRealName(realName: String) { + _realName = realName + super.setRealName(realName) + } + + private var _identityId: IdentityId = -1 + private var _identityName: String = "<empty>" + private var _realName: String = "" + private var _nicks: MutableList<String> = mutableListOf("quassel") + private var _awayNick: String = "" + private var _awayNickEnabled: Boolean = false + private var _awayReason: String = "Gone fishing." + private var _awayReasonEnabled: Boolean = true + private var _autoAwayEnabled: Boolean = false + private var _autoAwayTime: Int = 10 + private var _autoAwayReason: String = "Not here. No, really. not here!" + private var _autoAwayReasonEnabled: Boolean = false + private var _detachAwayEnabled: Boolean = false + private var _detachAwayReason: String = "All Quassel clients vanished from the face of the earth..." + private var _detachAwayReasonEnabled: Boolean = false + private var _ident: String = "quassel" + private var _kickReason: String = "Kindergarten is elsewhere!" + private var _partReason: String = "http://quassel-irc.org - Chat comfortably. Anywhere." + private var _quitReason: String = "http://quassel-irc.org - Chat comfortably. Anywhere." +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IgnoreListManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IgnoreListManager.kt new file mode 100644 index 000000000..c447a2de0 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IgnoreListManager.kt @@ -0,0 +1,36 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.protocol.valueOr +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIgnoreListManager +import de.kuschku.quasseldroid_ng.session.SignalProxy + +class IgnoreListManager constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "IgnoreListManager"), IIgnoreListManager { + override fun toVariantMap(): QVariantMap = mapOf( + "IgnoreList" to QVariant_(initIgnoreList(), Type.QVariantMap) + ) + + override fun fromVariantMap(properties: QVariantMap) { + initSetIgnoreList(properties["IgnoreList"].valueOr(::emptyMap)) + } + + override fun initIgnoreList(): QVariantMap = emptyMap() + + override fun initSetIgnoreList(ignoreList: QVariantMap) { + } + + override fun addIgnoreListItem(type: Int, ignoreRule: String, isRegEx: Boolean, strictness: Int, + scope: Int, scopeRule: String, isActive: Boolean) { + } + + override fun removeIgnoreListItem(ignoreRule: String) { + } + + override fun toggleIgnoreRule(ignoreRule: String) { + } + +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcChannel.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcChannel.kt new file mode 100644 index 000000000..1fb8e0878 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcChannel.kt @@ -0,0 +1,317 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIrcChannel +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetwork +import de.kuschku.quasseldroid_ng.session.SignalProxy +import de.kuschku.quasseldroid_ng.util.helpers.getOr +import java.nio.charset.Charset + +class IrcChannel( + name: String, + network: Network, + proxy: SignalProxy +) : SyncableObject(proxy, "IrcChannel"), IIrcChannel { + override fun init() { + renameObject("${network().networkId()}/${name()}") + } + + override fun toVariantMap(): QVariantMap = mapOf( + "ChanModes" to QVariant_(initChanModes(), Type.QVariantMap), + "UserModes" to QVariant_(initUserModes(), Type.QVariantMap) + ) + initProperties() + + override fun fromVariantMap(properties: QVariantMap) { + initSetChanModes(properties["ChanModes"].valueOr(::emptyMap)) + initSetUserModes(properties["UserModes"].valueOr(::emptyMap)) + initSetProperties(properties) + } + + override fun initChanModes(): QVariantMap = mapOf( + "A" to QVariant_(_A_channelModes.entries.map { (key, value) -> + key to QVariant_(value.toList(), Type.QStringList) + }, Type.QVariantMap), + "B" to QVariant_(_B_channelModes.entries.map { (key, value) -> + key to QVariant_(value, Type.QString) + }, Type.QVariantMap), + "C" to QVariant_(_C_channelModes.entries.map { (key, value) -> + key to QVariant_(value, Type.QString) + }, Type.QVariantMap), + "D" to QVariant_(_D_channelModes.joinToString(), Type.QString) + ) + + override fun initUserModes(): QVariantMap = _userModes.entries.map { (key, value) -> + key.nick() to QVariant_(value, Type.QString) + }.toMap() + + override fun initProperties(): QVariantMap = mapOf( + "name" to QVariant_(name(), Type.QString), + "topic" to QVariant_(topic(), Type.QString), + "password" to QVariant_(password(), Type.QString), + "encrypted" to QVariant_(encrypted(), Type.Bool) + ) + + override fun initSetChanModes(chanModes: QVariantMap) { + chanModes["A"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> + _A_channelModes[key.toCharArray().first()] = + variant.valueOr<QStringList>(::emptyList).filterNotNull().toMutableSet() + } + chanModes["B"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> + _B_channelModes[key.toCharArray().first()] = variant.value("") + } + chanModes["C"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> + _C_channelModes[key.toCharArray().first()] = variant.value("") + } + _D_channelModes = chanModes["D"].value("").toCharArray().toMutableSet() + } + + override fun initSetUserModes(usermodes: QVariantMap) { + _userModes.putAll(usermodes.entries.map { (key, value) -> + network().newIrcUser(key) to value.value("") + }.toMap()) + } + + override fun initSetProperties(properties: QVariantMap) { + setTopic(properties["topic"].value(topic())) + setPassword(properties["password"].value(password())) + setEncrypted(properties["encrypted"].value(encrypted())) + } + + fun isKnownUser(ircUser: IrcUser): Boolean { + return _userModes.contains(ircUser) + } + + fun isValidChannelUserMode(mode: String): Boolean { + return mode.length <= 1 + } + + fun name() = _name + fun topic() = _topic + fun password() = _password + fun encrypted() = _encrypted + fun network() = _network + fun ircUsers() = _userModes.keys + fun userModes(ircUser: IrcUser) = _userModes.getOr(ircUser, "") + fun userModes(nick: String) = network().ircUser(nick)?.let { userModes(it) } ?: "" + fun hasMode(mode: Char) = when (network().channelModeType(mode)) { + INetwork.ChannelModeType.A_CHANMODE -> + _A_channelModes.contains(mode) + INetwork.ChannelModeType.B_CHANMODE -> + _B_channelModes.contains(mode) + INetwork.ChannelModeType.C_CHANMODE -> + _C_channelModes.contains(mode) + INetwork.ChannelModeType.D_CHANMODE -> + _D_channelModes.contains(mode) + else -> + false + } + + fun modeValue(mode: Char) = when (network().channelModeType(mode)) { + INetwork.ChannelModeType.B_CHANMODE -> + _B_channelModes.getOr(mode, "") + INetwork.ChannelModeType.C_CHANMODE -> + _C_channelModes.getOr(mode, "") + else -> + "" + } + + fun modeValueList(mode: Char): Set<String> = when (network().channelModeType(mode)) { + INetwork.ChannelModeType.A_CHANMODE -> + _A_channelModes.getOrElse(mode, ::emptySet) + else -> + emptySet() + } + + fun channelModeString(): String { + val modeString = StringBuffer(_D_channelModes.joinToString()) + val params = mutableListOf<String>() + _C_channelModes.entries.forEach { (key, value) -> + modeString.append(key) + params.add(value) + } + _B_channelModes.entries.forEach { (key, value) -> + modeString.append(key) + params.add(value) + } + return if (modeString.isBlank()) { + "" + } else { + "+$modeString ${params.joinToString(" ")}" + } + } + + fun codecForEncoding() = _codecForEncoding + fun codecForDecoding() = _codecForDecoding + fun setCodecForEncoding(codecName: String) = setCodecForEncoding(Charset.forName(codecName)) + fun setCodecForEncoding(codec: Charset) { + _codecForEncoding = codec + } + + fun setCodecForDecoding(codecName: String) = setCodecForDecoding(Charset.forName(codecName)) + fun setCodecForDecoding(codec: Charset) { + _codecForDecoding = codec + } + + override fun setTopic(topic: String) { + if (_topic == topic) + return + _topic = topic + super.setTopic(topic) + } + + override fun setPassword(password: String) { + if (_password == password) + return + _password = password + super.setPassword(password) + } + + override fun setEncrypted(encrypted: Boolean) { + if (_encrypted == encrypted) + return + _encrypted = encrypted + super.setEncrypted(encrypted) + } + + override fun joinIrcUsers(nicks: QStringList, modes: QStringList) { + val (rawUsers, rawModes) = nicks.zip(modes) + .map { network().ircUser(it.first) to it.second } + .filter { it.first != null } + .map { Pair(it.first!!, it.second ?: "") }.unzip() + joinIrcUsersInternal(rawUsers, rawModes) + } + + private fun joinIrcUsersInternal(rawUsers: List<IrcUser>, rawModes: List<String>) { + val users = rawUsers.zip(rawModes) + val newNicks = users.filter { !_userModes.contains(it.first) } + val oldNicks = users.filter { _userModes.contains(it.first) } + for ((user, modes) in oldNicks) { + modes.forEach { mode -> + addUserMode(user, mode) + } + } + for ((user, modes) in newNicks) { + _userModes[user] = modes + user.joinChannel(this, true) + } + if (newNicks.isNotEmpty()) + super.joinIrcUsers( + newNicks.map(Pair<IrcUser, String>::first).map(IrcUser::nick), + newNicks.map(Pair<IrcUser, String>::second) + ) + } + + override fun joinIrcUser(ircuser: IrcUser) { + joinIrcUsersInternal(listOf(ircuser), listOf("")) + } + + override fun part(ircuser: IrcUser?) { + if (ircuser == null) + return + if (!isKnownUser(ircuser)) + return + _userModes.remove(ircuser) + ircuser.partChannel(this) + if (network().isMe(ircuser) || _userModes.isEmpty()) { + for (user in _userModes.keys) { + user.partChannel(this) + } + _userModes.clear() + network().removeIrcChannel(this) + proxy.stopSynchronize(this) + } + super.part(ircuser) + } + + override fun part(nick: String) { + part(network().ircUser(nick)) + } + + override fun setUserModes(ircuser: IrcUser?, modes: String) { + if (ircuser == null || !isKnownUser(ircuser)) + return + _userModes[ircuser] = modes + super.setUserModes(ircuser.nick(), modes) + } + + override fun setUserModes(nick: String, modes: String) { + setUserModes(network().ircUser(nick), modes) + } + + fun addUserMode(ircuser: IrcUser, mode: Char) { + super.addUserMode(ircuser, Character.toString(mode)) + } + + override fun addUserMode(ircuser: IrcUser?, mode: String) { + if (ircuser == null || !isKnownUser(ircuser) || !isValidChannelUserMode(mode)) + return + if (_userModes.getOr(ircuser, "").contains(mode, ignoreCase = true)) + return + _userModes[ircuser] = _userModes.getOr(ircuser, "") + mode + super.addUserMode(ircuser.nick(), mode) + } + + override fun addUserMode(nick: String, mode: String) { + addUserMode(network().ircUser(nick), mode) + } + + override fun removeUserMode(ircuser: IrcUser?, mode: String) { + if (ircuser == null || !isKnownUser(ircuser) || !isValidChannelUserMode(mode)) + return + if (_userModes.getOr(ircuser, "").contains(mode, ignoreCase = true)) + return + _userModes[ircuser] = _userModes.getOr(ircuser, "") + .replace(mode, "", ignoreCase = true) + super.addUserMode(ircuser.nick(), mode) + } + + override fun removeUserMode(nick: String, mode: String) { + removeUserMode(network().ircUser(nick), mode) + } + + override fun addChannelMode(mode: Char, value: String) { + when (network().channelModeType(mode)) { + INetwork.ChannelModeType.A_CHANMODE -> + _A_channelModes.getOrPut(mode, ::mutableSetOf).add(value) + INetwork.ChannelModeType.B_CHANMODE -> + _B_channelModes[mode] = value + INetwork.ChannelModeType.C_CHANMODE -> + _C_channelModes[mode] = value + INetwork.ChannelModeType.D_CHANMODE -> + _D_channelModes.add(mode) + INetwork.ChannelModeType.NOT_A_CHANMODE -> + throw IllegalArgumentException("Received invalid channel mode: $mode $value") + } + super.addChannelMode(mode, value) + } + + override fun removeChannelMode(mode: Char, value: String) { + when (network().channelModeType(mode)) { + INetwork.ChannelModeType.A_CHANMODE -> + _A_channelModes.getOrPut(mode, ::mutableSetOf).remove(value) + INetwork.ChannelModeType.B_CHANMODE -> + _B_channelModes.remove(mode) + INetwork.ChannelModeType.C_CHANMODE -> + _C_channelModes.remove(mode) + INetwork.ChannelModeType.D_CHANMODE -> + _D_channelModes.remove(mode) + INetwork.ChannelModeType.NOT_A_CHANMODE -> + throw IllegalArgumentException("Received invalid channel mode: $mode $value") + } + super.removeChannelMode(mode, value) + } + + private var _name: String = name + private var _topic: String = "" + private var _password: String = "" + private var _encrypted: Boolean = false + private var _userModes: MutableMap<IrcUser, String> = mutableMapOf() + private var _network: Network = network + private var _codecForEncoding: Charset? = null + private var _codecForDecoding: Charset? = null + private var _A_channelModes: MutableMap<Char, MutableSet<String>> = mutableMapOf() + private var _B_channelModes: MutableMap<Char, String> = mutableMapOf() + private var _C_channelModes: MutableMap<Char, String> = mutableMapOf() + private var _D_channelModes: MutableSet<Char> = mutableSetOf() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcListHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcListHelper.kt new file mode 100644 index 000000000..f61b65bca --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcListHelper.kt @@ -0,0 +1,21 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.NetworkId +import de.kuschku.quasseldroid_ng.protocol.QStringList +import de.kuschku.quasseldroid_ng.protocol.QVariantList +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIrcListHelper +import de.kuschku.quasseldroid_ng.session.SignalProxy + +class IrcListHelper constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "IrcListHelper"), IIrcListHelper { + override fun receiveChannelList(netId: NetworkId, channelFilters: QStringList, + data: QVariantList) { + } + + override fun reportFinishedList(netId: NetworkId) { + } + + override fun reportError(error: String) { + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcUser.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcUser.kt new file mode 100644 index 000000000..e01b208e0 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcUser.kt @@ -0,0 +1,287 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIrcUser +import de.kuschku.quasseldroid_ng.session.SignalProxy +import org.threeten.bp.Instant +import java.nio.charset.Charset + +class IrcUser( + hostmask: String, + network: Network, + proxy: SignalProxy +) : SyncableObject(proxy, "IrcUser"), IIrcUser { + override fun init() { + updateObjectName() + } + + override fun toVariantMap() = initProperties() + + override fun fromVariantMap(properties: QVariantMap) { + initSetProperties(properties) + } + + override fun initProperties(): QVariantMap = mapOf( + "user" to QVariant_(user(), Type.QString), + "host" to QVariant_(host(), Type.QString), + "nick" to QVariant_(nick(), Type.QString), + "realName" to QVariant_(realName(), Type.QString), + "account" to QVariant_(account(), Type.QString), + "away" to QVariant_(isAway(), Type.Bool), + "awayMessage" to QVariant_(awayMessage(), Type.QString), + "idleTime" to QVariant_(idleTime(), Type.QDateTime), + "loginTime" to QVariant_(loginTime(), Type.QDateTime), + "server" to QVariant_(server(), Type.QString), + "ircOperator" to QVariant_(ircOperator(), Type.QString), + "lastAwayMessage" to QVariant_(lastAwayMessage(), Type.Int), + "whoisServiceReply" to QVariant_(whoisServiceReply(), Type.QString), + "suserHost" to QVariant_(suserHost(), Type.QString), + "encrypted" to QVariant_(encrypted(), Type.Bool), + + "channels" to QVariant_(channels(), Type.QStringList), + "userModes" to QVariant_(userModes(), Type.QString) + ) + + override fun initSetProperties(properties: QVariantMap) { + setUser(properties["user"].value(user())) + setHost(properties["host"].value(host())) + setNick(properties["nick"].value(nick())) + setRealName(properties["realName"].value(realName())) + setAccount(properties["account"].value(account())) + setAway(properties["away"].value(isAway())) + setAwayMessage(properties["awayMessage"].value(awayMessage())) + setIdleTime(properties["idleTime"].value(idleTime())) + setLoginTime(properties["loginTime"].value(loginTime())) + setServer(properties["server"].value(server())) + setIrcOperator(properties["ircOperator"].value(ircOperator())) + setLastAwayMessage(properties["lastAwayMessage"].value(lastAwayMessage())) + setWhoisServiceReply(properties["whoisServiceReply"].value(whoisServiceReply())) + setSuserHost(properties["suserHost"].value(suserHost())) + setEncrypted(properties["encrypted"].value(encrypted())) + + setUserModes(properties["userModes"].value(userModes())) + } + + fun user() = _user + fun host() = _host + fun nick() = _nick + fun realName() = _realName + fun account() = _account + fun hostMask() = "${nick()}!${user()}@${host()}" + fun isAway() = _away + fun awayMessage() = _awayMessage + fun idleTime(): Instant { + if (Instant.now().epochSecond - _idleTimeSet.epochSecond > 1200) + _idleTime = Instant.EPOCH + return _idleTime + } + + fun loginTime() = _loginTime + fun server() = _server + fun ircOperator() = _ircOperator + fun lastAwayMessage() = _lastAwayMessage + fun whoisServiceReply() = _whoisServiceReply + fun suserHost() = _suserHost + fun encrypted() = _encrypted + fun network() = _network + fun userModes() = _userModes + fun channels() = _channels.map(IrcChannel::name) + fun codecForEncoding() = _codecForEncoding + fun codecForDecoding() = _codecForDecoding + fun setCodecForEncoding(codecName: String) = setCodecForEncoding(Charset.forName(codecName)) + fun setCodecForEncoding(codec: Charset) { + _codecForEncoding = codec + } + + fun setCodecForDecoding(codecName: String) = setCodecForDecoding(Charset.forName(codecName)) + fun setCodecForDecoding(codec: Charset) { + _codecForDecoding = codec + } + + override fun setUser(user: String) { + if (_user != user) { + _user = user + super.setUser(user) + } + } + + override fun setHost(host: String) { + if (_host != host) { + _host = host + super.setHost(host) + } + } + + override fun setNick(nick: String) { + if (nick.isNotBlank() && _nick != nick) { + _nick = nick + updateObjectName() + super.setNick(nick) + } + } + + override fun setRealName(realName: String) { + if (_realName != realName) { + _realName = realName + super.setRealName(realName) + } + } + + override fun setAccount(account: String) { + if (_account != account) { + _account = account + super.setAccount(account) + } + } + + override fun setAway(away: Boolean) { + if (_away != away) { + _away = away + super.setAway(away) + } + } + + override fun setAwayMessage(awayMessage: String) { + if (_awayMessage != awayMessage) { + _awayMessage = awayMessage + super.setAwayMessage(awayMessage) + } + } + + override fun setIdleTime(idleTime: Instant) { + if (_idleTime != idleTime) { + _idleTime = idleTime + _idleTimeSet = Instant.now() + super.setIdleTime(idleTime) + } + } + + override fun setLoginTime(loginTime: Instant) { + if (_loginTime != loginTime) { + _loginTime = loginTime + super.setLoginTime(loginTime) + } + } + + override fun setIrcOperator(ircOperator: String) { + if (_ircOperator != ircOperator) { + _ircOperator = ircOperator + super.setIrcOperator(ircOperator) + } + } + + override fun setLastAwayMessage(lastAwayMessage: Int) { + if (lastAwayMessage > _lastAwayMessage) { + _lastAwayMessage = lastAwayMessage + super.setLastAwayMessage(lastAwayMessage) + } + } + + override fun setWhoisServiceReply(whoisServiceReply: String) { + if (_whoisServiceReply != whoisServiceReply) { + _whoisServiceReply = whoisServiceReply + super.setWhoisServiceReply(whoisServiceReply) + } + } + + override fun setSuserHost(suserHost: String) { + if (_suserHost != suserHost) { + _suserHost = suserHost + super.setSuserHost(suserHost) + } + } + + override fun setEncrypted(encrypted: Boolean) { + if (_encrypted != encrypted) { + _encrypted = encrypted + super.setEncrypted(encrypted) + } + } + + override fun updateHostmask(mask: String) { + if (hostMask() != mask) { + val (user, host, _) = splitHostMask(mask) + setUser(user) + setHost(host) + } + } + + override fun setUserModes(modes: String) { + if (_userModes != modes) { + _userModes = modes + super.setUserModes(modes) + } + } + + override fun joinChannel(channel: IrcChannel, skip_channel_join: Boolean) { + if (!_channels.contains(channel)) { + _channels.add(channel) + if (!skip_channel_join) + channel.joinIrcUser(this) + } + } + + override fun joinChannel(channelname: String) { + joinChannel(network().newIrcChannel(channelname)) + } + + override fun partChannel(channel: IrcChannel) { + if (_channels.contains(channel)) { + _channels.remove(channel) + channel.part(this) + super.partChannel(channel.name()) + if (_channels.isEmpty() && !network().isMe(this)) + quit() + } + } + + override fun partChannel(channelname: String) { + val channel = network().ircChannel(channelname) + ?: throw IllegalArgumentException("Received part for unknown channel : $channelname") + partChannel(channel) + } + + override fun quit() { + for (channel in _channels) { + channel.part(this) + } + _channels.clear() + network().removeIrcUser(this) + super.quit() + proxy.stopSynchronize(this) + } + + override fun addUserModes(modes: String) { + super.addUserModes(modes) + } + + override fun removeUserModes(modes: String) { + super.removeUserModes(modes) + } + + fun updateObjectName() { + renameObject("${network().networkId()}/$_nick") + } + + private var _nick: String = nickFromMask(hostmask) + private var _user: String = userFromMask(hostmask) + private var _host: String = hostFromMask(hostmask) + private var _realName: String = "" + private var _account: String = "" + private var _awayMessage: String = "" + private var _away: Boolean = false + private var _server: String = "" + private var _idleTime: Instant = Instant.EPOCH + private var _idleTimeSet: Instant = Instant.EPOCH + private var _loginTime: Instant = Instant.EPOCH + private var _ircOperator: String = "" + private var _lastAwayMessage: Int = 0 + private var _whoisServiceReply: String = "" + private var _suserHost: String = "" + private var _encrypted: Boolean = false + private var _channels: MutableSet<IrcChannel> = mutableSetOf() + private var _userModes: String = "" + private var _network: Network = network + private var _codecForEncoding: Charset? = null + private var _codecForDecoding: Charset? = null +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Network.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Network.kt new file mode 100644 index 000000000..9cf27b50e --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Network.kt @@ -0,0 +1,871 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.StringSerializer +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.serializeString +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetwork +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetwork.* +import de.kuschku.quasseldroid_ng.session.SignalProxy +import de.kuschku.quasseldroid_ng.util.helpers.getOr +import java.nio.ByteBuffer +import java.nio.charset.Charset +import java.util.* + +class Network constructor( + networkId: NetworkId, + proxy: SignalProxy +) : SyncableObject(proxy, "Network"), INetwork { + override fun init() { + renameObject("$_networkId") + } + + override fun fromVariantMap(properties: QVariantMap) { + initSetCaps(properties["Caps"].valueOr(::emptyMap)) + initSetCapsEnabled(properties["CapsEnabled"].valueOr(::emptyList)) + initSetIrcUsersAndChannels(properties["IrcUsersAndChannels"].valueOr(::emptyMap)) + initSetServerList(properties["ServerList"].valueOr(::emptyList)) + initSetSupports(properties["Supports"].valueOr(::emptyMap)) + initSetProperties(properties) + } + + override fun toVariantMap(): QVariantMap = mapOf( + "Caps" to QVariant_(initCaps(), Type.QVariantMap), + "CapsEnabled" to QVariant_(initCapsEnabled(), Type.QVariantList), + "IrcUsersAndChannels" to QVariant_(initIrcUsersAndChannels(), Type.QVariantMap), + "ServerList" to QVariant_(initServerList(), Type.QVariantList), + "Supports" to QVariant_(initSupports(), Type.QVariantMap) + ) + initProperties() + + fun isMyNick(nick: String) = myNick().equals(nick, true) + fun isMe(ircUser: IrcUser) = myNick().equals(ircUser.nick(), true) + fun isChannelName(channelName: String) = when { + channelName.isBlank() -> false + supports("CHANTYPES") -> support("CHANTYPES").contains(channelName[0]) + else -> "#&!+".contains(channelName[0]) + } + + /** + * Checks if the target counts as a STATUSMSG + * + * Status messages are prefixed with one or more characters from the server-provided STATUSMSG + * if available, otherwise "@" and "+" are assumed. Generally, status messages sent to a + * channel are only visible to those with the same or higher permissions, e.g. voiced. + * + * @param target Name of destination, e.g. a channel or query + * @return True if a STATUSMSG, otherwise false + */ + fun isStatusMsg(target: String) = when { + target.isBlank() -> false + supports("STATUSMSG") -> support("STATUSMSG").contains(target[0]) + else -> "@+".contains(target[0]) + } + + fun isConnected() = _connected + fun connectionState() = _connectionState + fun prefixToMode(prefix: Char): Char? + = prefixModes().elementAtOrNull(prefixes().indexOf(prefix)) + + fun prefixesToModes(prefixes: String): String + = prefixes.toCharArray().map(this::prefixToMode).filterNotNull().joinToString() + + fun modeToPrefix(mode: Char): Char? + = prefixes().elementAtOrNull(prefixModes().indexOf(mode)) + + fun modesToPrefixes(modes: String): String + = modes.toCharArray().map(this::modeToPrefix).filterNotNull().joinToString() + + fun channelModeType(mode: Char): ChannelModeType { + if (_channelModes == null) + determineChannelModeTypes() + return _channelModes?.entries + ?.filter { (_, chars) -> chars.contains(mode) } + ?.map(Map.Entry<ChannelModeType, Set<Char>>::key) + ?.firstOrNull() ?: ChannelModeType.NOT_A_CHANMODE + } + + private fun determineChannelModeTypes() { + _channelModes = ChannelModeType.validValues + .zip( + support("CHANMODES") + .split(',', limit = ChannelModeType.validValues.size) + .map(String::toCharArray) + .map(CharArray::toSet) + ).toMap() + } + + fun networkId() = _networkId + fun networkName() = _networkName + fun currentServer() = _currentServer + fun myNick() = _myNick + fun latency() = _latency + fun me() = ircUser(myNick()) + fun identity() = _identity + fun nicks() = _ircUsers.values.map(IrcUser::nick) + fun channels(): Set<String> = _ircChannels.keys + fun caps(): Set<String> = _caps.keys + fun capsEnabled(): Set<String> = _capsEnabled + fun serverList() = _serverList + fun useRandomServer() = _useRandomServer + fun perform() = _perform + fun useAutoIdentify() = _useAutoIdentify + fun autoIdentifyService() = _autoIdentifyService + fun autoIdentifyPassword() = _autoIdentifyPassword + fun useSasl() = _useSasl + fun saslAccount() = _saslAccount + fun saslPassword() = _saslPassword + fun useAutoReconnect() = _useAutoReconnect + fun autoReconnectInterval() = _autoReconnectInterval + fun autoReconnectRetries() = _autoReconnectRetries + fun unlimitedReconnectRetries() = _unlimitedReconnectRetries + fun rejoinChannels() = _rejoinChannels + fun useCustomMessageRate() = _useCustomMessageRate + fun messageRateBurstSize() = _messageRateBurstSize + fun messageRateDelay() = _messageRateDelay + fun unlimitedMessageRate() = _unlimitedMessageRate + fun networkInfo() = NetworkInfo( + networkName = networkName(), + networkId = networkId(), + identity = identity(), + codecForServer = codecForServer(), + codecForEncoding = codecForEncoding(), + codecForDecoding = codecForDecoding(), + serverList = serverList(), + useRandomServer = useRandomServer(), + perform = perform(), + useAutoIdentify = useAutoIdentify(), + autoIdentifyService = autoIdentifyService(), + autoIdentifyPassword = autoIdentifyPassword(), + useSasl = useSasl(), + saslAccount = saslAccount(), + saslPassword = saslPassword(), + useAutoReconnect = useAutoReconnect(), + autoReconnectInterval = autoReconnectInterval(), + autoReconnectRetries = autoReconnectRetries(), + unlimitedReconnectRetries = unlimitedReconnectRetries(), + rejoinChannels = rejoinChannels(), + useCustomMessageRate = useCustomMessageRate(), + messageRateBurstSize = messageRateBurstSize(), + messageRateDelay = messageRateDelay(), + unlimitedMessageRate = unlimitedMessageRate() + ) + + fun setNetworkInfo(info: NetworkInfo) { + // we don't set our ID! + if (!info.networkName.isEmpty() && info.networkName != networkName()) + setNetworkName(info.networkName) + if (info.identity > 0 && info.identity != identity()) + setIdentity(info.identity) + if (info.codecForServer != codecForServer()) + setCodecForServer(Charset.forName(info.codecForServer)) + if (info.codecForEncoding != codecForEncoding()) + setCodecForEncoding(Charset.forName(info.codecForEncoding)) + if (info.codecForDecoding != codecForDecoding()) + setCodecForDecoding(Charset.forName(info.codecForDecoding)) + // FIXME compare components + if (info.serverList.isNotEmpty()) + setServerList(info.serverList.map { QVariant_(it, QType.Network_Server) }) + if (info.useRandomServer != useRandomServer()) + setUseRandomServer(info.useRandomServer) + if (info.perform != perform()) + setPerform(info.perform) + if (info.useAutoIdentify != useAutoIdentify()) + setUseAutoIdentify(info.useAutoIdentify) + if (info.autoIdentifyService != autoIdentifyService()) + setAutoIdentifyService(info.autoIdentifyService) + if (info.autoIdentifyPassword != autoIdentifyPassword()) + setAutoIdentifyPassword(info.autoIdentifyPassword) + if (info.useSasl != useSasl()) + setUseSasl(info.useSasl) + if (info.saslAccount != saslAccount()) + setSaslAccount(info.saslAccount) + if (info.saslPassword != saslPassword()) + setSaslPassword(info.saslPassword) + if (info.useAutoReconnect != useAutoReconnect()) + setUseAutoReconnect(info.useAutoReconnect) + if (info.autoReconnectInterval != autoReconnectInterval()) + setAutoReconnectInterval(info.autoReconnectInterval) + if (info.autoReconnectRetries != autoReconnectRetries()) + setAutoReconnectRetries(info.autoReconnectRetries) + if (info.unlimitedReconnectRetries != unlimitedReconnectRetries()) + setUnlimitedReconnectRetries(info.unlimitedReconnectRetries) + if (info.rejoinChannels != rejoinChannels()) + setRejoinChannels(info.rejoinChannels) + // Custom rate limiting + if (info.useCustomMessageRate != useCustomMessageRate()) + setUseCustomMessageRate(info.useCustomMessageRate) + if (info.messageRateBurstSize != messageRateBurstSize()) + setMessageRateBurstSize(info.messageRateBurstSize) + if (info.messageRateDelay != messageRateDelay()) + setMessageRateDelay(info.messageRateDelay) + if (info.unlimitedMessageRate != unlimitedMessageRate()) + setUnlimitedMessageRate(info.unlimitedMessageRate) + } + + fun prefixes(): Set<Char> { + if (_prefixes == null) + determinePrefixes() + return _prefixes!! + } + + fun prefixModes(): Set<Char> { + if (_prefixModes == null) + determinePrefixes() + return _prefixModes!! + } + + private fun determinePrefixes() { + // seems like we have to construct them first + val prefix = support("PREFIX") + if (prefix.startsWith("(") && prefix.contains(")")) { + val (prefixes, prefixModes) = prefix.substring(1) + .split(')', limit = 2) + .map(String::toCharArray) + .map(CharArray::toSet) + _prefixes = prefixes + _prefixModes = prefixModes + } else { + val defaultPrefixes = setOf('~', '&', '@', '%', '+') + val defaultPrefixModes = setOf('q', 'a', 'o', 'h', 'v') + if (prefix.isBlank()) { + _prefixes = defaultPrefixes + _prefixModes = defaultPrefixModes + return + } + // we just assume that in PREFIX are only prefix chars stored + val (prefixes, prefixModes) = defaultPrefixes.zip(defaultPrefixModes) + .filter { prefix.contains(it.second) } + .unzip() + _prefixes = prefixes.toSet() + _prefixModes = prefixModes.toSet() + // check for success + if (prefixes.isNotEmpty()) + return + // well... our assumption was obviously wrong... + // check if it's only prefix modes + val (prefixes2, prefixModes2) = defaultPrefixes.zip(defaultPrefixModes) + .filter { prefix.contains(it.first) } + .unzip() + _prefixes = prefixes2.toSet() + _prefixModes = prefixModes2.toSet() + // now we've done all we've could... + } + } + + fun supports(param: String) = _supports.contains(param.toUpperCase(Locale.ENGLISH)) + fun support(param: String) = _supports.getOr(param, "") + /** + * Checks if a given capability is advertised by the server. + * + * These results aren't valid if the network is disconnected or capability negotiation hasn't + * happened, and some servers might not correctly advertise capabilities. Don't treat this as a + * guarantee. + * + * @param capability Name of capability + * @return True if connected and advertised by the server, otherwise false + */ + fun capAvailable(capability: String) + = _caps.contains(capability.toLowerCase(Locale.ENGLISH)) + + /** + * Checks if a given capability is acknowledged and active. + * + * @param capability Name of capability + * @return True if acknowledged (active), otherwise false + */ + fun capEnabled(capability: String) + = _capsEnabled.contains(capability.toLowerCase(Locale.ENGLISH)) + + /** + * Gets the value of an available capability, e.g. for SASL, "EXTERNAL,PLAIN". + * + * @param capability Name of capability + * @return Value of capability if one was specified, otherwise empty string + */ + fun capValue(capability: String) + = _caps.getOr(capability.toLowerCase(Locale.ENGLISH), "") + + /** + * Check if the given authentication mechanism is likely to be supported. + * + * This depends on the server advertising SASL support and either declaring available mechanisms + * (SASL 3.2), or just indicating something is supported (SASL 3.1). + * + * @param saslMechanism Desired SASL mechanism + * @return True if mechanism supported or unknown, otherwise false + */ + fun saslMaybeSupports(saslMechanism: String): Boolean { + if (!capAvailable(IrcCap.SASL)) { + // If SASL's not advertised at all, it's likely the mechanism isn't supported, as per specs. + // Unfortunately, we don't know for sure, but Quassel won't request SASL without it being + // advertised, anyways. + // This may also occur if the network's disconnected or negotiation hasn't yet happened. + return false + } + // Get the SASL capability value + val capValue = capValue(IrcCap.SASL) + // SASL mechanisms are only specified in capability values as part of SASL 3.2. In SASL 3.1, + // it's handled differently. If we don't know via capability value, assume it's supported to + // reduce the risk of breaking existing setups. + // See: http://ircv3.net/specs/extensions/sasl-3.1.html + // And: http://ircv3.net/specs/extensions/sasl-3.2.html + return (capValue.isBlank() || capValue.contains(saslMechanism, ignoreCase = true)) + } + + fun newIrcUser(hostMask: String, initData: QVariantMap = emptyMap()): IrcUser { + val nick = nickFromMask(hostMask).toLowerCase(Locale.ENGLISH) + val user = ircUser(nick) + return if (user == null) { + val ircUser = IrcUser(hostMask, this, proxy) + ircUser.init() + if (initData.isNotEmpty()) { + ircUser.fromVariantMap(initData) + ircUser.initialized = true + } + proxy.synchronize(ircUser) + _ircUsers[nick] = ircUser + val mask = ircUser.hostMask() + super.addIrcUser(mask) + ircUser + } else { + user + } + } + + fun ircUser(nickName: String?) = _ircUsers[nickName] + fun ircUsers() = _ircUsers.values.toList() + fun ircUserCount(): UInt = _ircUsers.size + fun newIrcChannel(channelName: String, initData: QVariantMap = emptyMap()): IrcChannel { + val channel = ircChannel(channelName) + if (channel == null) { + val ircChannel = IrcChannel(channelName, this, proxy) + ircChannel.init() + if (initData.isNotEmpty()) { + ircChannel.fromVariantMap(initData) + ircChannel.initialized = true + } + proxy.synchronize(ircChannel) + _ircChannels[channelName.toLowerCase(Locale.ENGLISH)] = ircChannel + super.addIrcChannel(channelName) + return ircChannel + } else { + return channel + } + } + + fun ircChannel(channelName: String) = _ircChannels[channelName] + fun ircChannels() = _ircChannels.values.toList() + fun ircChanenlCount(): UInt = _ircChannels.size + fun codecForServer() = _codecForServer.name() + fun codecForEncoding() = _codecForEncoding.name() + fun codecForDecoding() = _codecForDecoding.name() + fun setCodecForDecoding(codec: Charset) { + _codecForDecoding = codec + super.setCodecForDecoding(Charsets.ISO_8859_1.encode(codecForDecoding())) + } + + fun setCodecForEncoding(codec: Charset) { + _codecForEncoding = codec + super.setCodecForEncoding(Charsets.ISO_8859_1.encode(codecForEncoding())) + } + + fun setCodecForServer(codec: Charset) { + _codecForServer = codec + super.setCodecForServer(Charsets.ISO_8859_1.encode(codecForServer())) + } + + fun autoAwayActive() = _autoAwayActive + fun setAutoAwayActive(active: Boolean) { + _autoAwayActive = active + } + + override fun setNetworkName(networkName: String) { + if (_networkName == networkName) + return + _networkName = networkName + super.setNetworkName(networkName) + } + + override fun setCurrentServer(currentServer: String) { + if (_currentServer == currentServer) + return + _currentServer = currentServer + super.setCurrentServer(currentServer) + } + + override fun setConnected(isConnected: Boolean) { + if (_connected == isConnected) + return + _connected = isConnected + if (!isConnected) { + setMyNick("") + setCurrentServer("") + removeChansAndUsers() + } + super.setConnected(isConnected) + } + + override fun setConnectionState(state: Int) { + val actualConnectionState = ConnectionState.of(state) + if (_connectionState == actualConnectionState) + return + _connectionState = actualConnectionState + super.setConnectionState(state) + } + + override fun setMyNick(mynick: String) { + if (_myNick == mynick) + return + _myNick = mynick + if (_myNick.isNotEmpty() && ircUser(myNick()) == null) { + newIrcUser(myNick()) + } + super.setMyNick(mynick) + } + + override fun setLatency(latency: Int) { + if (_latency == latency) + return + _latency = latency + super.setLatency(latency) + } + + override fun setIdentity(identity: IdentityId) { + if (_identity == identity) + return + _identity = identity + super.setIdentity(identity) + } + + override fun setServerList(serverList: QVariantList) { + val actualServerList = serverList.map { + it.valueOrThrow<Server>() + } + if (_serverList == actualServerList) + return + _serverList = actualServerList + super.setServerList(serverList) + } + + override fun setUseRandomServer(randomServer: Boolean) { + if (_useRandomServer == randomServer) + return + _useRandomServer = randomServer + super.setUseRandomServer(randomServer) + } + + override fun setPerform(perform: QStringList) { + val actualPerform = perform.map { it ?: "" } + if (_perform == actualPerform) + return + _perform = actualPerform + super.setPerform(perform) + } + + override fun setUseAutoIdentify(autoIdentify: Boolean) { + if (_useAutoIdentify == autoIdentify) + return + _useAutoIdentify = autoIdentify + super.setUseAutoIdentify(autoIdentify) + } + + override fun setAutoIdentifyService(service: String) { + if (_autoIdentifyService == service) + return + _autoIdentifyService = service + super.setAutoIdentifyService(service) + } + + override fun setAutoIdentifyPassword(password: String) { + if (_autoIdentifyPassword == password) + return + _autoIdentifyPassword = password + super.setAutoIdentifyPassword(password) + } + + override fun setUseSasl(sasl: Boolean) { + if (_useSasl == sasl) + return + _useSasl = sasl + super.setUseSasl(sasl) + } + + override fun setSaslAccount(account: String) { + if (_saslAccount == account) + return + _saslAccount = account + super.setSaslAccount(account) + } + + override fun setSaslPassword(password: String) { + if (_saslPassword == password) + return + _saslPassword = password + super.setSaslPassword(password) + } + + override fun setUseAutoReconnect(autoReconnect: Boolean) { + if (_useAutoReconnect == autoReconnect) + return + _useAutoReconnect = autoReconnect + super.setUseAutoReconnect(autoReconnect) + } + + override fun setAutoReconnectInterval(interval: UInt) { + if (_autoReconnectInterval == interval) + return + _autoReconnectInterval = interval + super.setAutoReconnectInterval(interval) + } + + override fun setAutoReconnectRetries(retries: UShort) { + if (_autoReconnectRetries == retries) + return + _autoReconnectRetries = retries + super.setAutoReconnectRetries(retries) + } + + override fun setUnlimitedReconnectRetries(unlimitedRetries: Boolean) { + if (_unlimitedReconnectRetries == unlimitedRetries) + return + _unlimitedReconnectRetries = unlimitedRetries + super.setUnlimitedReconnectRetries(unlimitedRetries) + } + + override fun setRejoinChannels(rejoinChannels: Boolean) { + if (_rejoinChannels == rejoinChannels) + return + _rejoinChannels = rejoinChannels + super.setRejoinChannels(rejoinChannels) + } + + /** + * Sets whether or not custom rate limiting is used. + * + * Setting limits too low may value you disconnected from the server! + * + * @param useCustomRate If true, use custom rate limits, otherwise use Quassel defaults. + */ + + override fun setUseCustomMessageRate(useCustomRate: Boolean) { + if (_useCustomMessageRate == useCustomRate) + return + _useCustomMessageRate = useCustomRate + super.setUseCustomMessageRate(useCustomRate) + } + + override fun setMessageRateBurstSize(burstSize: UInt) { + if (_messageRateBurstSize == burstSize) + return + if (burstSize < 1) + throw IllegalArgumentException("Message Burst Size must be a positive number: $burstSize") + _messageRateBurstSize = burstSize + super.setMessageRateBurstSize(burstSize) + } + + override fun setMessageRateDelay(messageDelay: UInt) { + if (_messageRateDelay == messageDelay) + return + if (messageDelay < 1) + throw IllegalArgumentException("Message Delay must be a positive number: $messageDelay") + _messageRateDelay = messageDelay + super.setMessageRateDelay(messageDelay) + } + + override fun setUnlimitedMessageRate(unlimitedRate: Boolean) { + if (_unlimitedMessageRate == unlimitedRate) + return + _unlimitedMessageRate = unlimitedRate + super.setUnlimitedMessageRate(unlimitedRate) + } + + override fun setCodecForDecoding(codecName: ByteBuffer?) { + if (codecName != null) + setCodecForDecoding(Charsets.ISO_8859_1.decode(codecName).toString()) + } + + override fun setCodecForEncoding(codecName: ByteBuffer?) { + if (codecName != null) + setCodecForEncoding(Charsets.ISO_8859_1.decode(codecName).toString()) + } + + override fun setCodecForServer(codecName: ByteBuffer?) { + if (codecName != null) + setCodecForServer(Charsets.ISO_8859_1.decode(codecName).toString()) + } + + fun setCodecForDecoding(codecName: String) { + setCodecForDecoding(Charset.forName(codecName)) + } + + fun setCodecForEncoding(codecName: String) { + setCodecForDecoding(Charset.forName(codecName)) + } + + fun setCodecForServer(codecName: String) { + setCodecForDecoding(Charset.forName(codecName)) + } + + override fun addSupport(param: String, value: String) { + _supports[param] = value + super.addSupport(param, value) + } + + override fun removeSupport(param: String) { + if (!_supports.contains(param)) + return + _supports.remove(param) + super.removeSupport(param) + } + + override fun addCap(capability: String, value: String) { + _caps[capability.toLowerCase(Locale.ENGLISH)] = value + super.addCap(capability, value) + } + + override fun acknowledgeCap(capability: String) { + val lowerCase = capability.toLowerCase(Locale.ENGLISH) + if (!_capsEnabled.contains(lowerCase)) + return + _capsEnabled.add(lowerCase) + super.acknowledgeCap(capability) + } + + override fun removeCap(capability: String) { + val lowerCase = capability.toLowerCase(Locale.ENGLISH) + if (!_caps.contains(lowerCase)) + return + _caps.remove(lowerCase) + _capsEnabled.remove(lowerCase) + super.removeCap(capability) + } + + override fun clearCaps() { + if (_caps.isEmpty() && _capsEnabled.isEmpty()) + return + _caps.clear() + _capsEnabled.clear() + super.clearCaps() + } + + override fun addIrcUser(hostmask: String) { + newIrcUser(hostmask) + } + + override fun addIrcChannel(channel: String) { + newIrcChannel(channel) + } + + override fun initSupports(): QVariantMap = _supports.entries.map { (key, value) -> + key to QVariant_(value, Type.QString) + }.toMap() + + override fun initCaps(): QVariantMap = _caps.entries.map { (key, value) -> + key to QVariant_(value, Type.QString) + }.toMap() + + override fun initCapsEnabled(): QVariantList = _capsEnabled.map { + QVariant_(it, Type.QString) + }.toList() + + override fun initServerList(): QVariantList = _serverList.map { + QVariant_(it, QType.Network_Server) + }.toList() + + override fun initIrcUsersAndChannels(): QVariantMap { + return mapOf( + "Users" to QVariant_(_ircUsers.values.map { it.toVariantMap() }.transpose().map { + QVariant_(it, Type.QVariantList) + }, Type.QVariantMap), + "Channels" to QVariant_(_ircChannels.values.map { it.toVariantMap() }.transpose().map { + QVariant_(it, Type.QVariantList) + }, Type.QVariantMap) + ) + } + + override fun initProperties(): QVariantMap = mapOf( + "networkName" to QVariant_(networkName(), Type.QString), + "currentServer" to QVariant_(currentServer(), Type.QString), + "myNick" to QVariant_(myNick(), Type.QString), + "latency" to QVariant_(latency(), Type.Int), + "codecForServer" to QVariant_(codecForServer().serializeString(StringSerializer.UTF8), Type.QByteArray), + "codecForEncoding" to QVariant_(codecForEncoding().serializeString(StringSerializer.UTF8), Type.QByteArray), + "codecForDecoding" to QVariant_(codecForDecoding().serializeString(StringSerializer.UTF8), Type.QByteArray), + "identityId" to QVariant_(identity(), QType.IdentityId), + "isConnected" to QVariant_(isConnected(), Type.Bool), + "connectionState" to QVariant_(connectionState(), Type.Int), + "useRandomServer" to QVariant_(useRandomServer(), Type.Bool), + "perform" to QVariant_(perform(), Type.QStringList), + "useAutoIdentify" to QVariant_(useAutoIdentify(), Type.Bool), + "autoIdentifyService" to QVariant_(autoIdentifyService(), Type.QString), + "autoIdentifyPassword" to QVariant_(autoIdentifyPassword(), Type.QString), + "useSasl" to QVariant_(useSasl(), Type.Bool), + "saslAccount" to QVariant_(saslAccount(), Type.QString), + "saslPassword" to QVariant_(saslPassword(), Type.QString), + "useAutoReconnect" to QVariant_(useAutoReconnect(), Type.Bool), + "autoReconnectInterval" to QVariant_(autoReconnectInterval(), Type.UInt), + "autoReconnectRetries" to QVariant_(autoReconnectRetries(), Type.UShort), + "unlimitedReconnectRetries" to QVariant_(unlimitedReconnectRetries(), Type.Bool), + "rejoinChannels" to QVariant_(rejoinChannels(), Type.Bool), + "useCustomMessageRate" to QVariant_(useCustomMessageRate(), Type.Bool), + "msgRateBurstSize" to QVariant_(messageRateBurstSize(), Type.UInt), + "msgRateMessageDelay" to QVariant_(messageRateDelay(), Type.UInt), + "unlimitedMessageRate" to QVariant_(unlimitedMessageRate(), Type.Bool) + ) + + override fun initSetSupports(supports: QVariantMap) { + supports.entries.map { (key, value) -> key to value.value("") }.toMap(_supports) + } + + override fun initSetCaps(caps: QVariantMap) { + caps.entries.map { (key, value) -> key to value.value("") }.toMap(_supports) + } + + override fun initSetCapsEnabled(capsEnabled: QVariantList) { + capsEnabled.mapNotNull { it.value<String?>() }.toCollection(_capsEnabled) + } + + override fun initSetServerList(serverList: QVariantList) { + _serverList = serverList.mapNotNull { it.value<QVariantMap?>() }.map( + Server.Companion::fromVariantMap).toMutableList() + } + + override fun initSetIrcUsersAndChannels(usersAndChannels: QVariantMap) { + if (initialized) + throw IllegalArgumentException("Received init data for network ${networkId()} after init") + usersAndChannels["Users"] + ?.valueOr<Map<String, QVariant_>>(::emptyMap) + ?.entries?.map { (key, value) -> key to value.valueOr<List<QVariant_>>(::emptyList) }?.toMap() + ?.transpose() + ?.forEach { + newIrcUser(it["nick"].value(""), it) + } + usersAndChannels["Channels"] + ?.valueOr<Map<String, QVariant_>>(::emptyMap) + ?.entries?.map { (key, value) -> key to value.valueOr<List<QVariant_>>(::emptyList) }?.toMap() + ?.transpose() + ?.forEach { + newIrcChannel(it["name"].value(""), it) + } + } + + override fun initSetProperties(properties: QVariantMap) { + setNetworkName(properties["networkName"].value(networkName())) + setCurrentServer(properties["currentServer"].value(currentServer())) + setMyNick(properties["myNick"].value(myNick())) + setLatency(properties["latency"].value(latency())) + setCodecForServer(properties["codecForServer"].value(codecForServer().serializeString(StringSerializer.UTF8))) + setCodecForEncoding(properties["codecForEncoding"].value(codecForEncoding().serializeString(StringSerializer.UTF8))) + setCodecForDecoding(properties["codecForDecoding"].value(codecForDecoding().serializeString(StringSerializer.UTF8))) + setIdentity(properties["identityId"].value(identity())) + setConnected(properties["isConnected"].value(isConnected())) + setConnectionState(properties["connectionState"].value(connectionState().value)) + setUseRandomServer(properties["useRandomServer"].value(useRandomServer())) + setPerform(properties["perform"].value(perform())) + setUseAutoIdentify(properties["useAutoIdentify"].value(useAutoIdentify())) + setAutoIdentifyService(properties["autoIdentifyService"].value(autoIdentifyService())) + setAutoIdentifyPassword(properties["autoIdentifyPassword"].value(autoIdentifyPassword())) + setUseSasl(properties["useSasl"].value(useSasl())) + setSaslAccount(properties["saslAccount"].value(saslAccount())) + setSaslPassword(properties["saslPassword"].value(saslPassword())) + setUseAutoReconnect(properties["useAutoReconnect"].value(useAutoReconnect())) + setAutoReconnectInterval(properties["autoReconnectInterval"].value(autoReconnectInterval())) + setAutoReconnectRetries(properties["autoReconnectRetries"].value(autoReconnectRetries())) + setUnlimitedReconnectRetries( + properties["unlimitedReconnectRetries"].value(unlimitedReconnectRetries())) + setRejoinChannels(properties["rejoinChannels"].value(rejoinChannels())) + setUseCustomMessageRate(properties["useCustomMessageRate"].value(useCustomMessageRate())) + setMessageRateBurstSize(properties["msgRateBurstSize"].value(messageRateBurstSize())) + setMessageRateDelay(properties["msgRateMessageDelay"].value(messageRateDelay())) + setUnlimitedMessageRate(properties["unlimitedMessageRate"].value(unlimitedMessageRate())) + } + + fun updateNickFromMask(mask: String): IrcUser { + val nick = nickFromMask(mask).toLowerCase(Locale.ENGLISH) + val user = _ircUsers[nick] + return if (user != null) { + user.updateHostmask(mask) + user + } else { + newIrcUser(mask) + } + } + + override fun ircUserNickChanged(newnick: String) { + throw RuntimeException("Look at this: $newnick") + } + + override fun emitConnectionError(error: String) { + } + + fun removeChansAndUsers() { + _ircUsers.clear() + _ircChannels.clear() + } + + fun removeIrcUser(user: IrcUser) { + _ircUsers.remove(user.nick()) + } + + fun removeIrcChannel(channel: IrcChannel) { + _ircChannels.remove(channel.name()) + } + + private var _networkId: NetworkId = networkId + private var _identity: IdentityId = -1 + private var _myNick: String = "" + private var _latency: Int = 0 + private var _networkName: String = "<not initialized>" + private var _currentServer: String = "" + private var _connected: Boolean = false + private var _connectionState: ConnectionState = ConnectionState.Disconnected + private var _prefixes: Set<Char>? = null + private var _prefixModes: Set<Char>? = null + private var _channelModes: Map<ChannelModeType, Set<Char>>? = null + // stores all known nicks for the server + private var _ircUsers: MutableMap<String, IrcUser> = mutableMapOf() + // stores all known channels + private var _ircChannels: MutableMap<String, IrcChannel> = mutableMapOf() + // stores results from RPL_ISUPPORT + private var _supports: MutableMap<String, String> = mutableMapOf() + /** + * Capabilities supported by the IRC server + * By synchronizing the supported capabilities, the client could suggest certain behaviors, e.g. + * in the Network settings dialog, recommending SASL instead of using NickServ, or warning if + * SASL EXTERNAL isn't available. + */ + private var _caps: MutableMap<String, String> = mutableMapOf() + /** + * Enabled capabilities that received 'CAP ACK' + * _capsEnabled uses the same values from the <name>=<value> pairs stored in _caps + */ + private var _capsEnabled: MutableSet<String> = mutableSetOf() + private var _serverList: List<Server> = mutableListOf() + private var _useRandomServer: Boolean = false + private var _perform: List<String> = mutableListOf() + private var _useAutoIdentify: Boolean = false + private var _autoIdentifyService: String = "" + private var _autoIdentifyPassword: String = "" + private var _useSasl: Boolean = false + private var _saslAccount: String = "" + private var _saslPassword: String = "" + private var _useAutoReconnect: Boolean = false + private var _autoReconnectInterval: UInt = 60 + private var _autoReconnectRetries: UShort = 10 + private var _unlimitedReconnectRetries = false + private var _rejoinChannels = false + // Custom rate limiting + /** If true, use custom rate limits, otherwise use defaults */ + private var _useCustomMessageRate: Boolean = false + /** Maximum number of messages to send without any delays */ + private var _messageRateBurstSize: UInt = 5 + /** Delay in ms. for messages when max. burst messages sent */ + private var _messageRateDelay: UInt = 2200 + /** If true, disable rate limiting, otherwise apply limits */ + private var _unlimitedMessageRate: Boolean = false + private var _codecForServer: Charset = Charsets.UTF_8 + private var _codecForEncoding: Charset = Charsets.UTF_8 + private var _codecForDecoding: Charset = Charsets.UTF_8 + /** when this is active handle305 and handle306 don't trigger any output */ + private var _autoAwayActive: Boolean = false +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/NetworkConfig.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/NetworkConfig.kt new file mode 100644 index 000000000..bf719e5ec --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/NetworkConfig.kt @@ -0,0 +1,102 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.protocol.value +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetworkConfig +import de.kuschku.quasseldroid_ng.session.SignalProxy + +class NetworkConfig constructor( + proxy: SignalProxy +) : SyncableObject(proxy, "NetworkConfig"), INetworkConfig { + override fun init() { + renameObject("GlobalNetworkConfig") + } + + override fun toVariantMap() = initProperties() + + override fun fromVariantMap(properties: QVariantMap) { + initSetProperties(properties) + } + + override fun initProperties(): QVariantMap = mapOf( + "pingTimeoutEnabled" to QVariant_(pingTimeoutEnabled(), Type.Bool), + "pingInterval" to QVariant_(pingInterval(), Type.Int), + "maxPingCount" to QVariant_(maxPingCount(), Type.Int), + "autoWhoEnabled" to QVariant_(autoWhoEnabled(), Type.Bool), + "autoWhoInterval" to QVariant_(autoWhoInterval(), Type.Int), + "autoWhoNickLimit" to QVariant_(autoWhoNickLimit(), Type.Int), + "autoWhoDelay" to QVariant_(autoWhoDelay(), Type.Int), + "standardCtcp" to QVariant_(standardCtcp(), Type.Bool) + ) + + override fun initSetProperties(properties: QVariantMap) { + setPingTimeoutEnabled(properties["pingTimeoutEnabled"].value(pingTimeoutEnabled())) + setPingInterval(properties["pingInterval"].value(pingInterval())) + setMaxPingCount(properties["maxPingCount"].value(maxPingCount())) + setAutoWhoEnabled(properties["autoWhoEnabled"].value(autoWhoEnabled())) + setAutoWhoInterval(properties["autoWhoInterval"].value(autoWhoInterval())) + setAutoWhoNickLimit(properties["autoWhoNickLimit"].value(autoWhoNickLimit())) + setAutoWhoDelay(properties["autoWhoDelay"].value(autoWhoDelay())) + setStandardCtcp(properties["standardCtcp"].value(standardCtcp())) + } + + fun pingTimeoutEnabled() = _pingTimeoutEnabled + fun pingInterval() = _pingInterval + fun maxPingCount() = _maxPingCount + fun autoWhoEnabled() = _autoWhoEnabled + fun autoWhoInterval() = _autoWhoInterval + fun autoWhoNickLimit() = _autoWhoNickLimit + fun autoWhoDelay() = _autoWhoDelay + fun standardCtcp() = _standardCtcp + + override fun setPingTimeoutEnabled(enabled: Boolean) { + _pingTimeoutEnabled = enabled + super.setPingTimeoutEnabled(enabled) + } + + override fun setPingInterval(interval: Int) { + _pingInterval = interval + super.setPingInterval(interval) + } + + override fun setMaxPingCount(count: Int) { + _maxPingCount = count + super.setMaxPingCount(count) + } + + override fun setAutoWhoEnabled(enabled: Boolean) { + _autoWhoEnabled = enabled + super.setAutoWhoEnabled(enabled) + } + + override fun setAutoWhoInterval(interval: Int) { + _autoWhoInterval = interval + super.setAutoWhoInterval(interval) + } + + override fun setAutoWhoNickLimit(limit: Int) { + _autoWhoNickLimit = limit + super.setAutoWhoNickLimit(limit) + } + + override fun setAutoWhoDelay(delay: Int) { + _autoWhoDelay = delay + super.setAutoWhoDelay(delay) + } + + override fun setStandardCtcp(standardCtcp: Boolean) { + _standardCtcp = standardCtcp + super.setStandardCtcp(standardCtcp) + } + + private var _pingTimeoutEnabled: Boolean = true + private var _pingInterval: Int = 30 + private var _maxPingCount: Int = 6 + private var _autoWhoEnabled: Boolean = true + private var _autoWhoInterval: Int = 90 + private var _autoWhoNickLimit: Int = 200 + private var _autoWhoDelay: Int = 5 + private var _standardCtcp: Boolean = false +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/RpcHandler.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/RpcHandler.kt new file mode 100644 index 000000000..c1a63717b --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/RpcHandler.kt @@ -0,0 +1,68 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import android.net.NetworkInfo +import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.StringSerializer +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.deserializeString +import de.kuschku.quasseldroid_ng.quassel.BufferInfo +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IRpcHandler +import de.kuschku.quasseldroid_ng.session.SignalProxy +import java.nio.ByteBuffer + +class RpcHandler(override val proxy: SignalProxy) : IRpcHandler { + override fun displayStatusMsg(net: String, msg: String) { + } + + override fun bufferInfoUpdated(bufferInfo: BufferInfo) { + } + + override fun identityCreated(identity: QVariantMap) { + } + + override fun identityRemoved(identityId: IdentityId) { + } + + override fun networkCreated(networkId: NetworkId) { + } + + override fun networkRemoved(networkId: NetworkId) { + } + + override fun passwordChanged(ignored: Long, success: Boolean) { + } + + override fun disconnectFromCore() { + } + + override fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String) { + proxy.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "", newname, oldname) + } + + override fun displayMsg(message: QuasselDatabase.RawMessage) { + println(message) + } + + override fun requestCreateIdentity(identity: QVariantMap, additional: QVariantMap) { + } + + override fun requestRemoveIdentity(identityId: IdentityId) { + } + + override fun requestCreateNetwork(networkInfo: NetworkInfo, channels: List<String>) { + } + + override fun requestRemoveNetwork(networkId: NetworkId) { + } + + override fun requestPasswordChange(peerPtr: Long, user: String, old: String, new: String) { + } + + override fun requestKickClient(id: Int) { + RPC("2requestKickClient(Int)", ARG(id, Type.Int)) + } + + override fun sendInput(bufferInfo: BufferInfo, message: String) { + RPC("2sendInput(BufferInfo,QString)", ARG(bufferInfo, QType.BufferInfo), ARG(message, Type.QString)) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/SyncableObject.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/SyncableObject.kt new file mode 100644 index 000000000..5f31fa821 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/SyncableObject.kt @@ -0,0 +1,39 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables + +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject +import de.kuschku.quasseldroid_ng.session.SignalProxy + +abstract class SyncableObject( + protected val proxy: SignalProxy, + final override val className: String +) : ISyncableObject { + final override var objectName: String = "" + private set + override var identifier: String = "$className:" + override var initialized: Boolean = false + + override fun SYNC(function: String, vararg arg: QVariant_) { + if (initialized) + proxy.callSync(className, objectName, function, arg.toList()) + } + + override fun REQUEST(function: String, vararg arg: QVariant_) { + if (initialized) + proxy.callSync(className, objectName, function, arg.toList()) + } + + protected fun renameObject(newName: String) { + val oldName = objectName + if (!initialized) { + objectName = newName + identifier = "$className:$objectName" + } else if (oldName != newName) { + objectName = newName + identifier = "$className:$objectName" + proxy.renameObject(this, newName, oldName) + } + } + + override fun toString() = identifier +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IAliasManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IAliasManager.kt new file mode 100644 index 000000000..dd716ec95 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IAliasManager.kt @@ -0,0 +1,34 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.ARG +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.SLOT +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.quassel.BufferInfo + +@Syncable(name = "AliasManager") +interface IAliasManager : ISyncableObject { + fun initAliases(): QVariantMap + fun initSetAliases(aliases: QVariantMap) + @Slot + fun addAlias(name: String, expansion: String) { + SYNC(SLOT, ARG(name, Type.QString), ARG(expansion, Type.QString)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } + + data class Alias( + val name: String, + val expansion: String + ) + + data class Command( + val buffer: BufferInfo, + val message: String + ) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBacklogManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBacklogManager.kt new file mode 100644 index 000000000..5f5b80276 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBacklogManager.kt @@ -0,0 +1,36 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type + +@Syncable(name = "BacklogManager") +interface IBacklogManager : ISyncableObject { + @Slot + fun requestBacklog(bufferId: BufferId, first: MsgId = -1, last: MsgId = -1, limit: Int = -1, + additional: Int = 0) { + REQUEST(SLOT, ARG(bufferId, QType.BufferId), ARG(first, QType.MsgId), + ARG(last, QType.MsgId), ARG(limit, Type.Int), ARG(additional, Type.Int)) + } + + @Slot + fun requestBacklogAll(first: MsgId = -1, last: MsgId = -1, limit: Int = -1, + additional: Int = 0) { + REQUEST(SLOT, ARG(first, QType.MsgId), ARG(last, QType.MsgId), + ARG(limit, Type.Int), ARG(additional, Type.Int)) + } + + @Slot + fun receiveBacklog(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int, additional: Int, + messages: QVariantList) + + @Slot + fun receiveBacklogAll(first: MsgId, last: MsgId, limit: Int, additional: Int, + messages: QVariantList) + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferSyncer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferSyncer.kt new file mode 100644 index 000000000..6eb035281 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferSyncer.kt @@ -0,0 +1,85 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type + +@Syncable(name = "BufferSyncer") +interface IBufferSyncer : ISyncableObject { + fun initActivities(): QVariantList + fun initLastSeenMsg(): QVariantList + fun initMarkerLines(): QVariantList + fun initSetActivities(data: QVariantList) + fun initSetLastSeenMsg(data: QVariantList) + fun initSetMarkerLines(data: QVariantList) + + @Slot + fun markBufferAsRead(buffer: BufferId) { + SYNC(SLOT, ARG(buffer, QType.BufferId)) + } + + @Slot + fun mergeBuffersPermanently(buffer1: BufferId, buffer2: BufferId) + + @Slot + fun removeBuffer(buffer: BufferId) + + @Slot + fun renameBuffer(buffer: BufferId, newName: String) + + @Slot + fun requestMarkBufferAsRead(buffer: BufferId) { + REQUEST(SLOT, ARG(buffer, QType.BufferId)) + } + + @Slot + fun requestMergeBuffersPermanently(buffer1: BufferId, buffer2: BufferId) { + REQUEST(SLOT, ARG(buffer1, QType.BufferId), ARG(buffer2, QType.BufferId)) + } + + @Slot + fun requestPurgeBufferIds() { + REQUEST(SLOT) + } + + @Slot + fun requestRemoveBuffer(buffer: BufferId) { + REQUEST(SLOT, ARG(buffer, QType.BufferId)) + } + + @Slot + fun requestRenameBuffer(buffer: BufferId, newName: String) { + REQUEST(SLOT, ARG(buffer, QType.BufferId), ARG(newName, Type.QString)) + } + + @Slot + fun requestSetLastSeenMsg(buffer: BufferId, msgId: MsgId) { + REQUEST(SLOT, ARG(buffer, QType.BufferId), ARG(msgId, QType.MsgId)) + } + + @Slot + fun requestSetMarkerLine(buffer: BufferId, msgId: MsgId) { + REQUEST(SLOT, ARG(buffer, QType.BufferId), ARG(msgId, QType.MsgId)) + } + + @Slot + fun setBufferActivity(buffer: BufferId, activity: Int) { + SYNC(SLOT, ARG(buffer, QType.BufferId), ARG(activity, Type.Int)) + } + + @Slot + fun setLastSeenMsg(buffer: BufferId, msgId: MsgId) { + SYNC(SLOT, ARG(buffer, QType.BufferId), ARG(msgId, QType.MsgId)) + } + + @Slot + fun setMarkerLine(buffer: BufferId, msgId: MsgId) { + SYNC(SLOT, ARG(buffer, QType.BufferId), ARG(msgId, QType.MsgId)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewConfig.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewConfig.kt new file mode 100644 index 000000000..aad8d651c --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewConfig.kt @@ -0,0 +1,111 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type + +@Syncable(name = "BufferViewConfig") +interface IBufferViewConfig : ISyncableObject { + fun initBufferList(): QVariantList + fun initRemovedBuffers(): QVariantList + fun initTemporarilyRemovedBuffers(): QVariantList + fun initSetBufferList(buffers: QVariantList) + fun initSetRemovedBuffers(buffers: QVariantList) + fun initSetTemporarilyRemovedBuffers(buffers: QVariantList) + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun addBuffer(bufferId: BufferId, pos: Int) + + @Slot + fun moveBuffer(bufferId: BufferId, pos: Int) + + @Slot + fun removeBuffer(bufferId: BufferId) + + @Slot + fun removeBufferPermanently(bufferId: BufferId) + + @Slot + fun requestAddBuffer(bufferId: BufferId, pos: Int) { + REQUEST(SLOT, ARG(bufferId, QType.BufferId), ARG(pos, Type.Int)) + } + + @Slot + fun requestMoveBuffer(bufferId: BufferId, pos: Int) { + REQUEST(SLOT, ARG(bufferId, QType.BufferId), ARG(pos, Type.Int)) + } + + @Slot + fun requestRemoveBuffer(bufferId: BufferId) { + REQUEST(SLOT, ARG(bufferId, QType.BufferId)) + } + + @Slot + fun requestRemoveBufferPermanently(bufferId: BufferId) { + REQUEST(SLOT, ARG(bufferId, QType.BufferId)) + } + + @Slot + fun requestSetBufferViewName(bufferViewName: String) { + REQUEST(SLOT, ARG(bufferViewName, Type.QString)) + } + + @Slot + fun setAddNewBuffersAutomatically(addNewBuffersAutomatically: Boolean) { + SYNC(SLOT, ARG(addNewBuffersAutomatically, Type.Bool)) + } + + @Slot + fun setAllowedBufferTypes(bufferTypes: Int) { + SYNC(SLOT, ARG(bufferTypes, Type.Int)) + } + + @Slot + fun setBufferViewName(bufferViewName: String) { + SYNC(SLOT, ARG(bufferViewName, Type.QString)) + } + + @Slot + fun setDisableDecoration(disableDecoration: Boolean) { + SYNC(SLOT, ARG(disableDecoration, Type.Bool)) + } + + @Slot + fun setHideInactiveBuffers(hideInactiveBuffers: Boolean) { + SYNC(SLOT, ARG(hideInactiveBuffers, Type.Bool)) + } + + @Slot + fun setHideInactiveNetworks(hideInactiveNetworks: Boolean) { + SYNC(SLOT, ARG(hideInactiveNetworks, Type.Bool)) + } + + @Slot + fun setMinimumActivity(activity: Int) { + SYNC(SLOT, ARG(activity, Type.Int)) + } + + @Slot + fun setNetworkId(networkId: NetworkId) { + SYNC(SLOT, ARG(networkId, QType.NetworkId)) + } + + @Slot + fun setShowSearch(showSearch: Boolean) { + SYNC(SLOT, ARG(showSearch, Type.Bool)) + } + + @Slot + fun setSortAlphabetically(sortAlphabetically: Boolean) { + SYNC(SLOT, ARG(sortAlphabetically, Type.Bool)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewManager.kt new file mode 100644 index 000000000..d3070e86b --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewManager.kt @@ -0,0 +1,50 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.syncables.BufferViewConfig + +@Syncable(name = "BufferViewManager") +interface IBufferViewManager : ISyncableObject { + fun initBufferViewIds(): QVariantList + fun initSetBufferViewIds(bufferViewIds: QVariantList) + + fun addBufferViewConfig(config: BufferViewConfig) + + @Slot + fun addBufferViewConfig(bufferViewConfigId: Int) + + @Slot + fun deleteBufferViewConfig(bufferViewConfigId: Int) + + @Slot + fun newBufferViewConfig(bufferViewConfigId: Int) { + addBufferViewConfig(bufferViewConfigId) + } + + @Slot + fun requestCreateBufferView(properties: QVariantMap) { + REQUEST(SLOT, ARG(properties, Type.QVariantMap)) + } + + @Slot + fun requestCreateBufferViews(properties: QVariantList) { + REQUEST(SLOT, ARG(properties, Type.QVariantList)) + } + + @Slot + fun requestDeleteBufferView(bufferViewId: Int) { + REQUEST(SLOT, ARG(bufferViewId, Type.Int)) + } + + @Slot + fun requestDeleteBufferViews(bufferViews: QVariantList) { + REQUEST(SLOT, ARG(bufferViews, Type.QVariantList)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICertManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICertManager.kt new file mode 100644 index 000000000..aeb559ec4 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICertManager.kt @@ -0,0 +1,31 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.ARG +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.SLOT +import de.kuschku.quasseldroid_ng.protocol.Type +import java.nio.ByteBuffer + +@Syncable(name = "CertManager") +interface ICertManager : ISyncableObject { + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun setSslCert(encoded: ByteBuffer?) { + SYNC(SLOT, ARG(encoded, Type.QByteArray)) + } + + @Slot + fun setSslKey(encoded: ByteBuffer?) { + SYNC(SLOT, ARG(encoded, Type.QByteArray)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICoreInfo.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICoreInfo.kt new file mode 100644 index 000000000..ed4b36d42 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICoreInfo.kt @@ -0,0 +1,25 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.ARG +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.SLOT +import de.kuschku.quasseldroid_ng.protocol.Type + +@Syncable(name = "CoreInfo") +interface ICoreInfo : ISyncableObject { + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun setCoreData(data: QVariantMap) { + SYNC(SLOT, ARG(data, Type.QVariantMap)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IDccConfig.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IDccConfig.kt new file mode 100644 index 000000000..d2b9ffda8 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IDccConfig.kt @@ -0,0 +1,80 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.UByte +import de.kuschku.quasseldroid_ng.protocol.UShort +import java.net.InetAddress + +@Syncable(name = "DccConfig") +interface IDccConfig : ISyncableObject { + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun setDccEnabled(enabled: Boolean) + + @Slot + fun setOutgoingIp(outgoingIp: InetAddress) + + @Slot + fun setIpDetectionMode(ipDetectionMode: IpDetectionMode) + + @Slot + fun setPortSelectionMode(portSelectionMode: PortSelectionMode) + + @Slot + fun setMinPort(port: UShort) + + @Slot + fun setMaxPort(port: UShort) + + @Slot + fun setChunkSize(chunkSize: Int) + + @Slot + fun setSendTimeout(timeout: Int) + + @Slot + fun setUsePassiveDcc(use: Boolean) + + @Slot + fun setUseFastSend(use: Boolean) + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } + + /** + * Mode for detecting the outgoing IP + */ + enum class IpDetectionMode(val value: UByte) { + /** Automatic detection (network socket or USERHOST) */ + Automatic(0x00), + /** Manually specified IP */ + Manual(0x01); + + companion object { + private val byId = IpDetectionMode.values().associateBy(IpDetectionMode::value) + fun of(value: UByte) = byId[value] ?: Automatic + } + } + + /** + * Mode for selecting the port range for DCC + */ + enum class PortSelectionMode(val value: UByte) { + /** Automatic port selection */ + Automatic(0x00), + /** Manually specified port range */ + Manual(0x01); + + companion object { + private val byId = PortSelectionMode.values().associateBy(PortSelectionMode::value) + fun of(value: UByte) = byId[value] ?: Automatic + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIdentity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIdentity.kt new file mode 100644 index 000000000..53f908d72 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIdentity.kt @@ -0,0 +1,118 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type + +@Syncable(name = "Identity") +interface IIdentity : ISyncableObject { + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun copyFrom(other: IIdentity) { + SYNC(SLOT, ARG(other, QType.Identity)) + } + + @Slot + fun setAutoAwayEnabled(enabled: Boolean) { + SYNC(SLOT, ARG(enabled, Type.Bool)) + } + + @Slot + fun setAutoAwayReason(reason: String) { + SYNC(SLOT, ARG(reason, Type.QString)) + } + + @Slot + fun setAutoAwayReasonEnabled(enabled: Boolean) { + SYNC(SLOT, ARG(enabled, Type.Bool)) + } + + @Slot + fun setAutoAwayTime(time: Int) { + SYNC(SLOT, ARG(time, Type.Int)) + } + + @Slot + fun setAwayNick(awayNick: String) { + SYNC(SLOT, ARG(awayNick, Type.QString)) + } + + @Slot + fun setAwayNickEnabled(enabled: Boolean) { + SYNC(SLOT, ARG(enabled, Type.Bool)) + } + + @Slot + fun setAwayReason(awayReason: String) { + SYNC(SLOT, ARG(awayReason, Type.QString)) + } + + @Slot + fun setAwayReasonEnabled(enabled: Boolean) { + SYNC(SLOT, ARG(enabled, Type.Bool)) + } + + @Slot + fun setDetachAwayEnabled(enabled: Boolean) { + SYNC(SLOT, ARG(enabled, Type.Bool)) + } + + @Slot + fun setDetachAwayReason(reason: String) { + SYNC(SLOT, ARG(reason, Type.QString)) + } + + @Slot + fun setDetachAwayReasonEnabled(enabled: Boolean) { + SYNC(SLOT, ARG(enabled, Type.Bool)) + } + + @Slot + fun setId(id: IdentityId) { + SYNC(SLOT, ARG(id, QType.IdentityId)) + } + + @Slot + fun setIdent(ident: String) { + SYNC(SLOT, ARG(ident, Type.QString)) + } + + @Slot + fun setIdentityName(name: String) { + SYNC(SLOT, ARG(name, Type.QString)) + } + + @Slot + fun setKickReason(reason: String) { + SYNC(SLOT, ARG(reason, Type.QString)) + } + + @Slot + fun setNicks(nicks: QStringList) { + SYNC(SLOT, ARG(nicks, Type.QStringList)) + } + + @Slot + fun setPartReason(reason: String) { + SYNC(SLOT, ARG(reason, Type.QString)) + } + + @Slot + fun setQuitReason(reason: String) { + SYNC(SLOT, ARG(reason, Type.QString)) + } + + @Slot + fun setRealName(realName: String) { + SYNC(SLOT, ARG(realName, Type.QString)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIgnoreListManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIgnoreListManager.kt new file mode 100644 index 000000000..ce3debcf2 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIgnoreListManager.kt @@ -0,0 +1,46 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.ARG +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.SLOT +import de.kuschku.quasseldroid_ng.protocol.Type + +@Syncable(name = "IgnoreListManager") +interface IIgnoreListManager : ISyncableObject { + fun initIgnoreList(): QVariantMap + fun initSetIgnoreList(ignoreList: QVariantMap) + @Slot + fun addIgnoreListItem(type: Int, ignoreRule: String, isRegEx: Boolean, strictness: Int, + scope: Int, scopeRule: String, isActive: Boolean) + + @Slot + fun removeIgnoreListItem(ignoreRule: String) + + @Slot + fun requestAddIgnoreListItem(type: Int, ignoreRule: String, isRegEx: Boolean, strictness: Int, + scope: Int, scopeRule: String, isActive: Boolean) { + REQUEST(SLOT, ARG(type, Type.Int), ARG(ignoreRule, Type.QString), ARG(isRegEx, Type.Bool), + ARG(strictness, Type.Int), ARG(scope, Type.Int), ARG(scopeRule, Type.QString), + ARG(isActive, Type.Bool)) + } + + @Slot + fun requestRemoveIgnoreListItem(ignoreRule: String) { + REQUEST(SLOT, ARG(ignoreRule, Type.QString)) + } + + @Slot + fun requestToggleIgnoreRule(ignoreRule: String) { + REQUEST(SLOT, ARG(ignoreRule, Type.QString)) + } + + @Slot + fun toggleIgnoreRule(ignoreRule: String) + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcChannel.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcChannel.kt new file mode 100644 index 000000000..be399ae13 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcChannel.kt @@ -0,0 +1,90 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.syncables.IrcUser + +@Syncable(name = "IrcChannel") +interface IIrcChannel : ISyncableObject { + fun initChanModes(): QVariantMap + fun initUserModes(): QVariantMap + fun initSetChanModes(chanModes: QVariantMap) + fun initSetUserModes(usermodes: QVariantMap) + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun addChannelMode(mode: Char, value: String) { + SYNC(SLOT, ARG(mode, Type.QChar), ARG(value, Type.QString)) + } + + fun addUserMode(ircuser: IrcUser?, mode: String) { + } + + @Slot + fun addUserMode(nick: String, mode: String) { + SYNC(SLOT, ARG(nick, Type.QString), ARG(mode, Type.QString)) + } + + @Slot + fun joinIrcUser(ircuser: IrcUser) { + SYNC(SLOT, ARG(ircuser.toVariantMap(), QType.IrcUser)) + } + + @Slot + fun joinIrcUsers(nicks: QStringList, modes: QStringList) { + SYNC(SLOT, ARG(nicks, Type.QStringList), ARG(modes, Type.QStringList)) + } + + fun part(ircuser: IrcUser?) { + } + + @Slot + fun part(nick: String) { + SYNC(SLOT, ARG(nick, Type.QString)) + } + + @Slot + fun removeChannelMode(mode: Char, value: String) { + SYNC(SLOT, ARG(mode, Type.QChar), ARG(value, Type.QString)) + } + + fun removeUserMode(ircuser: IrcUser?, mode: String) { + } + + @Slot + fun removeUserMode(nick: String, mode: String) { + SYNC(SLOT, ARG(nick, Type.QString), ARG(mode, Type.QString)) + } + + @Slot + fun setEncrypted(encrypted: Boolean) { + SYNC(SLOT, ARG(encrypted, Type.Bool)) + } + + @Slot + fun setPassword(password: String) { + SYNC(SLOT, ARG(password, Type.QString)) + } + + @Slot + fun setTopic(topic: String) { + SYNC(SLOT, ARG(topic, Type.QString)) + } + + fun setUserModes(ircuser: IrcUser?, modes: String) { + SYNC(SLOT, ARG(ircuser, QType.IrcUser), ARG(modes, Type.QString)) + } + + @Slot + fun setUserModes(nick: String, modes: String) { + SYNC(SLOT, ARG(nick, Type.QString), ARG(modes, Type.QString)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcListHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcListHelper.kt new file mode 100644 index 000000000..19e96224a --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcListHelper.kt @@ -0,0 +1,33 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.protocol.Type + +@Syncable(name = "IrcListHelper") +interface IIrcListHelper : ISyncableObject { + @Slot + fun requestChannelList(netId: NetworkId, channelFilters: QStringList): QVariantList { + REQUEST(SLOT, ARG(netId, QType.NetworkId), ARG(channelFilters, Type.QStringList)) + return emptyList() + } + + @Slot + fun receiveChannelList(netId: NetworkId, channelFilters: QStringList, data: QVariantList) + + @Slot + fun reportError(error: String) { + SYNC(SLOT, ARG(error, Type.QString)) + } + + @Slot + fun reportFinishedList(netId: NetworkId) { + SYNC(SLOT, ARG(netId, QType.NetworkId)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcUser.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcUser.kt new file mode 100644 index 000000000..894a7c2e3 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcUser.kt @@ -0,0 +1,138 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.ARG +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.SLOT +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.quassel.syncables.IrcChannel +import org.threeten.bp.Instant + +@Syncable(name = "IrcUser") +interface IIrcUser : ISyncableObject { + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun addUserModes(modes: String) { + SYNC(SLOT, ARG(modes, Type.QString)) + } + + fun joinChannel(channel: IrcChannel, skip_channel_join: Boolean = false) { + } + + @Slot + fun joinChannel(channelname: String) { + SYNC(SLOT, ARG(channelname, Type.QString)) + } + + fun partChannel(channel: IrcChannel) { + } + + @Slot + fun partChannel(channelname: String) { + SYNC(SLOT, ARG(channelname, Type.QString)) + } + + @Slot + fun quit() { + SYNC(SLOT) + } + + @Slot + fun removeUserModes(modes: String) { + SYNC(SLOT, ARG(modes, Type.QString)) + } + + @Slot + fun setAccount(account: String) { + SYNC(SLOT, ARG(account, Type.QString)) + } + + @Slot + fun setAway(away: Boolean) { + SYNC(SLOT, ARG(away, Type.Bool)) + } + + @Slot + fun setAwayMessage(awayMessage: String) { + SYNC(SLOT, ARG(awayMessage, Type.QString)) + } + + @Slot + fun setEncrypted(encrypted: Boolean) { + SYNC(SLOT, ARG(encrypted, Type.Bool)) + } + + @Slot + fun setHost(host: String) { + SYNC(SLOT, ARG(host, Type.QString)) + } + + @Slot + fun setIdleTime(idleTime: Instant) { + SYNC(SLOT, ARG(idleTime, Type.QDateTime)) + } + + @Slot + fun setIrcOperator(ircOperator: String) { + SYNC(SLOT, ARG(ircOperator, Type.QString)) + } + + @Slot + fun setLastAwayMessage(lastAwayMessage: Int) { + SYNC(SLOT, ARG(lastAwayMessage, Type.Int)) + } + + @Slot + fun setLoginTime(loginTime: Instant) { + SYNC(SLOT, ARG(loginTime, Type.QDateTime)) + } + + @Slot + fun setNick(nick: String) { + SYNC(SLOT, ARG(nick, Type.QString)) + } + + @Slot + fun setRealName(realName: String) { + SYNC(SLOT, ARG(realName, Type.QString)) + } + + @Slot + fun setServer(server: String) { + SYNC(SLOT, ARG(server, Type.QString)) + } + + @Slot + fun setSuserHost(suserHost: String) { + SYNC(SLOT, ARG(suserHost, Type.QString)) + } + + @Slot + fun setUser(user: String) { + SYNC(SLOT, ARG(user, Type.QString)) + } + + @Slot + fun setUserModes(modes: String) { + SYNC(SLOT, ARG(modes, Type.QString)) + } + + @Slot + fun setWhoisServiceReply(whoisServiceReply: String) { + SYNC(SLOT, ARG(whoisServiceReply, Type.QString)) + } + + @Slot + fun updateHostmask(mask: String) { + SYNC(SLOT, ARG(mask, Type.QString)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetwork.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetwork.kt new file mode 100644 index 000000000..35901ff72 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetwork.kt @@ -0,0 +1,485 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.util.Flag +import de.kuschku.quasseldroid_ng.util.Flags +import java.nio.ByteBuffer + +@Syncable(name = "Network") +interface INetwork : ISyncableObject { + fun initCapsEnabled(): QVariantList + fun initServerList(): QVariantList + fun initCaps(): QVariantMap + fun initIrcUsersAndChannels(): QVariantMap + fun initSupports(): QVariantMap + fun initSetCaps(caps: QVariantMap) + fun initSetCapsEnabled(capsEnabled: QVariantList) + fun initSetIrcUsersAndChannels(usersAndChannels: QVariantMap) + fun initSetServerList(serverList: QVariantList) + fun initSetSupports(supports: QVariantMap) + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun acknowledgeCap(capability: String) { + SYNC(SLOT, ARG(capability, Type.QString)) + } + + @Slot + fun addCap(capability: String, value: String = "") { + SYNC(SLOT, ARG(capability, Type.QString), ARG(value, Type.QString)) + } + + @Slot + fun addIrcChannel(channel: String) { + SYNC(SLOT, ARG(channel, Type.QString)) + } + + @Slot + fun addIrcUser(hostmask: String) { + SYNC(SLOT, ARG(hostmask, Type.QString)) + } + + @Slot + fun addSupport(param: String, value: String = String()) { + SYNC(SLOT, ARG(param, Type.QString), ARG(value, Type.QString)) + } + + @Slot + fun clearCaps() { + SYNC(SLOT) + } + + @Slot + fun emitConnectionError(error: String) { + SYNC(SLOT, ARG(error, Type.QString)) + } + + @Slot + fun ircUserNickChanged(newnick: String) + + @Slot + fun removeCap(capability: String) { + SYNC(SLOT, ARG(capability, Type.QString)) + } + + @Slot + fun removeSupport(param: String) { + SYNC(SLOT, ARG(param, Type.QString)) + } + + @Slot + fun requestConnect() { + REQUEST(SLOT) + } + + @Slot + fun requestDisconnect() { + REQUEST(SLOT) + } + + @Slot + fun requestSetNetworkInfo(info: NetworkInfo) { + REQUEST(SLOT, ARG(info, QType.NetworkInfo)) + } + + @Slot + fun setAutoIdentifyPassword(password: String) { + SYNC(SLOT, ARG(password, Type.QString)) + } + + @Slot + fun setAutoIdentifyService(service: String) { + SYNC(SLOT, ARG(service, Type.QString)) + } + + @Slot + fun setAutoReconnectInterval(interval: UInt) { + SYNC(SLOT, ARG(interval, Type.UInt)) + } + + @Slot + fun setAutoReconnectRetries(retries: UShort) { + SYNC(SLOT, ARG(retries, Type.UShort)) + } + + @Slot + fun setCodecForDecoding(codecName: ByteBuffer?) { + SYNC(SLOT, ARG(codecName, Type.QByteArray)) + } + + @Slot + fun setCodecForEncoding(codecName: ByteBuffer?) { + SYNC(SLOT, ARG(codecName, Type.QByteArray)) + } + + @Slot + fun setCodecForServer(codecName: ByteBuffer?) { + SYNC(SLOT, ARG(codecName, Type.QByteArray)) + } + + @Slot + fun setConnected(isConnected: Boolean) { + SYNC(SLOT, ARG(isConnected, Type.Bool)) + } + + @Slot + fun setConnectionState(state: Int) { + SYNC(SLOT, ARG(state, Type.Int)) + } + + @Slot + fun setCurrentServer(currentServer: String) { + SYNC(SLOT, ARG(currentServer, Type.QString)) + } + + @Slot + fun setIdentity(identity: IdentityId) { + SYNC(SLOT, ARG(identity, QType.IdentityId)) + } + + @Slot + fun setLatency(latency: Int) { + SYNC(SLOT, ARG(latency, Type.Int)) + } + + @Slot + fun setMessageRateBurstSize(burstSize: UInt) { + SYNC(SLOT, ARG(burstSize, Type.UInt)) + } + + @Slot + fun setMessageRateDelay(messageDelay: UInt) { + SYNC(SLOT, ARG(messageDelay, Type.UInt)) + } + + @Slot + fun setMyNick(mynick: String) { + SYNC(SLOT, ARG(mynick, Type.QString)) + } + + @Slot + fun setNetworkName(networkName: String) { + SYNC(SLOT, ARG(networkName, Type.QString)) + } + + @Slot + fun setPerform(perform: QStringList) { + SYNC(SLOT, ARG(perform, Type.QStringList)) + } + + @Slot + fun setRejoinChannels(rejoinChannels: Boolean) { + SYNC(SLOT, ARG(rejoinChannels, Type.Bool)) + } + + @Slot + fun setSaslAccount(account: String) { + SYNC(SLOT, ARG(account, Type.QString)) + } + + @Slot + fun setSaslPassword(password: String) { + SYNC(SLOT, ARG(password, Type.QString)) + } + + @Slot + fun setServerList(serverList: QVariantList) { + SYNC(SLOT, ARG(serverList, Type.QVariantList)) + } + + @Slot + fun setUnlimitedMessageRate(unlimitedRate: Boolean) { + SYNC(SLOT, ARG(unlimitedRate, Type.Bool)) + } + + @Slot + fun setUnlimitedReconnectRetries(unlimitedRetries: Boolean) { + SYNC(SLOT, ARG(unlimitedRetries, Type.Bool)) + } + + @Slot + fun setUseAutoIdentify(autoIdentify: Boolean) { + SYNC(SLOT, ARG(autoIdentify, Type.Bool)) + } + + @Slot + fun setUseAutoReconnect(autoReconnect: Boolean) { + SYNC(SLOT, ARG(autoReconnect, Type.Bool)) + } + + @Slot + fun setUseCustomMessageRate(useCustomRate: Boolean) { + SYNC(SLOT, ARG(useCustomRate, Type.Bool)) + } + + @Slot + fun setUseRandomServer(randomServer: Boolean) { + SYNC(SLOT, ARG(randomServer, Type.Bool)) + } + + @Slot + fun setUseSasl(sasl: Boolean) { + SYNC(SLOT, ARG(sasl, Type.Bool)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } + + enum class ConnectionState(val value: Int) { + Disconnected(0), + Connecting(1), + Initializing(2), + Initialized(3), + Reconnecting(4), + Disconnecting(5); + + companion object { + private val byId = enumValues<ConnectionState>().associateBy( + ConnectionState::value) + + fun of(value: Int) = byId[value] ?: Disconnected + } + } + + /** + * {@see http://www.irc.org/tech_docs/005.html} + * {@see http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt} + */ + enum class ChannelModeType(override val bit: Int) : Flag<ChannelModeType> { + NOT_A_CHANMODE(0x00), + A_CHANMODE(0x01), + B_CHANMODE(0x02), + C_CHANMODE(0x04), + D_CHANMODE(0x08); + + companion object : Flags.Factory<ChannelModeType> { + override val NONE = ChannelModeType.of() + val validValues = values().filter { it.bit != 0 }.toTypedArray() + override fun of(bit: Int) = Flags.of<ChannelModeType>(bit) + override fun of(vararg flags: ChannelModeType) = Flags.of(*flags) + } + } + + /** + * Default port assignments according to what many IRC networks have settled on. + * Technically not a standard, but it's fairly widespread. + * {@see https://freenode.net/news/port-6697-irc-via-tlsssl} + */ + enum class PortDefaults(val port: UInt) { + /** Default port for unencrypted connections */ + PORT_PLAINTEXT(6667), + /** Default port for encrypted connections */ + PORT_SSL(6697) + } + + data class Server( + val host: String = "", + val port: UInt = PortDefaults.PORT_PLAINTEXT.port, + val password: String = "", + val useSsl: Boolean = false, + val sslVerify: Boolean = false, + val sslVersion: Int = 0, + val useProxy: Boolean = false, + val proxyType: Int = ProxyType.Socks5Proxy.value, + val proxyHost: String = "localhost", + val proxyPort: UInt = 8080, + val proxyUser: String = "", + val proxyPass: String = "" + ) { + fun toVariantMap(): QVariantMap = mapOf( + "Host" to QVariant_(host, Type.QString), + "Port" to QVariant_(port, Type.UInt), + "Password" to QVariant_(password, Type.QString), + "UseSSL" to QVariant_(useSsl, Type.Bool), + "sslVerify" to QVariant_(sslVerify, Type.Bool), + "sslVersion" to QVariant_(sslVersion, Type.Int), + "UseProxy" to QVariant_(useProxy, Type.Bool), + "ProxyType" to QVariant_(proxyType, Type.Bool), + "ProxyHost" to QVariant_(proxyHost, Type.QString), + "ProxyPort" to QVariant_(proxyPort, Type.UInt), + "ProxyUser" to QVariant_(proxyUser, Type.QString), + "ProxyPass" to QVariant_(proxyPass, Type.QString) + ) + + companion object { + fun fromVariantMap(map: QVariantMap) = Server( + host = map["Host"].value(""), + port = map["Port"].value(PortDefaults.PORT_PLAINTEXT.port), + password = map["Password"].value(""), + useSsl = map["UseSSL"].value(false), + sslVerify = map["sslVerify"].value(false), + sslVersion = map["sslVersion"].value(0), + useProxy = map["UseProxy"].value(false), + proxyType = map["ProxyType"].value(ProxyType.Socks5Proxy.value), + proxyHost = map["ProxyHost"].value("localhost"), + proxyPort = map["ProxyPort"].value(8080), + proxyUser = map["ProxyUser"].value(""), + proxyPass = map["ProxyPass"].value("") + ) + } + } + + enum class ProxyType(val value: Int) { + DefaultProxy(0), + Socks5Proxy(1), + NoProxy(2), + HttpProxy(3), + HttpCachingProxy(4), + FtpCachingProxy(5); + + companion object { + private val byId = enumValues<ProxyType>().associateBy( + ProxyType::value) + + fun of(value: Int) = byId[value] ?: DefaultProxy + } + } + + data class NetworkInfo( + var networkId: NetworkId = -1, + var networkName: String = "", + var identity: IdentityId = -1, + // unused + var useCustomEncodings: Boolean = false, + var codecForServer: String = "UTF_8", + var codecForEncoding: String = "UTF_8", + var codecForDecoding: String = "UTF_8", + var serverList: List<INetwork.Server> = emptyList(), + var useRandomServer: Boolean = false, + var perform: List<String> = emptyList(), + var useAutoIdentify: Boolean = false, + var autoIdentifyService: String = "", + var autoIdentifyPassword: String = "", + var useSasl: Boolean = false, + var saslAccount: String = "", + var saslPassword: String = "", + var useAutoReconnect: Boolean = true, + var autoReconnectInterval: Int = 0, + var autoReconnectRetries: Short = 0, + var unlimitedReconnectRetries: Boolean = true, + var rejoinChannels: Boolean = true, + var useCustomMessageRate: Boolean = false, + var messageRateBurstSize: Int = 0, + var messageRateDelay: Int = 0, + var unlimitedMessageRate: Boolean = false + ) + + /** + * IRCv3 capability names and values + */ + object IrcCap { + // NOTE: If you add or modify the constants below, update the knownCaps list. + /** + * Account change notification. + * + * http://ircv3.net/specs/extensions/account-notify-3.1.html + */ + const val ACCOUNT_NOTIFY = "account-notify" + /** + * Magic number for WHOX, used to ignore user-requested WHOX replies from servers + * + * If a user initiates a WHOX, there's no easy way to tell what fields were requested. It's + * simpler to not attempt to parse data from user-requested WHOX replies. + */ + const val ACCOUNT_NOTIFY_WHOX_NUM = 369 + /** + * Away change notification. + * + * http://ircv3.net/specs/extensions/away-notify-3.1.html + */ + const val AWAY_NOTIFY = "away-notify" + /** + * Capability added/removed notification. + * + * This is implicitly enabled via CAP LS 302, and is here for servers that only partially + * support IRCv3.2. + * + * http://ircv3.net/specs/extensions/cap-notify-3.2.html + */ + const val CAP_NOTIFY = "cap-notify" + /** + * Hostname/user changed notification. + * + * http://ircv3.net/specs/extensions/chghost-3.2.html + */ + const val CHGHOST = "chghost" + /** + * Extended join information. + * + * http://ircv3.net/specs/extensions/extended-join-3.1.html + */ + const val EXTENDED_JOIN = "extended-join" + /** + * Multiple mode prefixes in MODE and WHO replies. + * + * http://ircv3.net/specs/extensions/multi-prefix-3.1.html + */ + const val MULTI_PREFIX = "multi-prefix" + /** + * SASL authentication. + * + * http://ircv3.net/specs/extensions/sasl-3.2.html + */ + const val SASL = "sasl" + /** + * Userhost in names replies. + * + * http://ircv3.net/specs/extensions/userhost-in-names-3.2.html + */ + const val USERHOST_IN_NAMES = "userhost-in-names" + + /** + * Vendor-specific capabilities + */ + object Vendor { + /** + * Self message support, as recognized by ZNC. + * + * Some servers (e.g. Bitlbee) assume self-message support; ZNC requires a capability + * instead. As self-message is already implemented, there's little reason to not do this. + * + * More information in the IRCv3 commit that removed the 'self-message' capability. + * + * https://github.com/ircv3/ircv3-specifications/commit/1bfba47843c2526707c902034b3395af934713c8 + */ + const val ZNC_SELF_MESSAGE = "znc.in/self-message" + } + + /** + * List of capabilities currently implemented and requested during capability negotiation. + */ + val knownCaps = listOf( + ACCOUNT_NOTIFY, + AWAY_NOTIFY, + CAP_NOTIFY, + CHGHOST, + EXTENDED_JOIN, + MULTI_PREFIX, + SASL, + USERHOST_IN_NAMES, + Vendor::ZNC_SELF_MESSAGE + ) + // NOTE: If you modify the knownCaps list, update the constants above as needed. + /** + * SASL authentication mechanisms + * + * http://ircv3.net/specs/extensions/sasl-3.1.html + */ + object SaslMech { + /** + * PLAIN authentication, e.g. hashed password + */ + const val PLAIN = "PLAIN" + /** + * EXTERNAL authentication, e.g. SSL certificate and keys + */ + const val EXTERNAL = "EXTERNAL" + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetworkConfig.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetworkConfig.kt new file mode 100644 index 000000000..a831ef7c1 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetworkConfig.kt @@ -0,0 +1,100 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.ARG +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.SLOT +import de.kuschku.quasseldroid_ng.protocol.Type + +@Syncable(name = "NetworkConfig") +interface INetworkConfig : ISyncableObject { + + fun initProperties(): QVariantMap + fun initSetProperties(properties: QVariantMap) + + @Slot + fun requestSetAutoWhoDelay(i: Int) { + REQUEST(SLOT, ARG(i, Type.Int)) + } + + @Slot + fun requestSetAutoWhoEnabled(b: Boolean) { + REQUEST(SLOT, ARG(b, Type.Bool)) + } + + @Slot + fun requestSetAutoWhoInterval(i: Int) { + REQUEST(SLOT, ARG(i, Type.Int)) + } + + @Slot + fun requestSetAutoWhoNickLimit(i: Int) { + REQUEST(SLOT, ARG(i, Type.Int)) + } + + @Slot + fun requestSetMaxPingCount(i: Int) { + REQUEST(SLOT, ARG(i, Type.Int)) + } + + @Slot + fun requestSetPingInterval(i: Int) { + REQUEST(SLOT, ARG(i, Type.Int)) + } + + @Slot + fun requestSetPingTimeoutEnabled(b: Boolean) { + REQUEST(SLOT, ARG(b, Type.Bool)) + } + + @Slot + fun requestSetStandardCtcp(b: Boolean) { + REQUEST(SLOT, ARG(b, Type.Bool)) + } + + @Slot + fun setAutoWhoDelay(delay: Int) { + SYNC(SLOT, ARG(delay, Type.Int)) + } + + @Slot + fun setAutoWhoEnabled(enabled: Boolean) { + SYNC(SLOT, ARG(enabled, Type.Bool)) + } + + @Slot + fun setAutoWhoInterval(interval: Int) { + SYNC(SLOT, ARG(interval, Type.Int)) + } + + @Slot + fun setAutoWhoNickLimit(limit: Int) { + SYNC(SLOT, ARG(limit, Type.Int)) + } + + @Slot + fun setMaxPingCount(count: Int) { + SYNC(SLOT, ARG(count, Type.Int)) + } + + @Slot + fun setPingInterval(interval: Int) { + SYNC(SLOT, ARG(interval, Type.Int)) + } + + @Slot + fun setPingTimeoutEnabled(enabled: Boolean) { + SYNC(SLOT, ARG(enabled, Type.Bool)) + } + + @Slot + fun setStandardCtcp(standardCtcp: Boolean) { + SYNC(SLOT, ARG(standardCtcp, Type.Bool)) + } + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IRpcHandler.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IRpcHandler.kt new file mode 100644 index 000000000..3b748bbce --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IRpcHandler.kt @@ -0,0 +1,57 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import android.net.NetworkInfo +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase +import de.kuschku.quasseldroid_ng.protocol.IdentityId +import de.kuschku.quasseldroid_ng.protocol.NetworkId +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.quassel.BufferInfo +import de.kuschku.quasseldroid_ng.session.SignalProxy +import java.nio.ByteBuffer + +@Syncable(name = "RpcHandler") +interface IRpcHandler { + val proxy: SignalProxy + fun RPC(function: String, vararg arg: QVariant_) = proxy.callRpc(function, arg.toList()) + + @Slot("__objectRenamed__") + fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String) + + @Slot("2displayMsg(Message)") + fun displayMsg(message: QuasselDatabase.RawMessage) + + @Slot("2displayStatusMsg(QString,QString)") + fun displayStatusMsg(net: String, msg: String) + + @Slot("2bufferInfoUpdated(BufferInfo)") + fun bufferInfoUpdated(bufferInfo: BufferInfo) + + @Slot("2identityCreated(Identity)") + fun identityCreated(identity: QVariantMap) + + @Slot("2identityRemoved(IdentityId)") + fun identityRemoved(identityId: IdentityId) + + @Slot("2networkCreated(NetworkId)") + fun networkCreated(networkId: NetworkId) + + @Slot("2networkRemoved(NetworkId)") + fun networkRemoved(networkId: NetworkId) + + @Slot("2passwordChanged(PeerPtr,bool)") + fun passwordChanged(ignored: Long, success: Boolean) + + @Slot("2disconnectFromCore()") + fun disconnectFromCore() + + fun requestCreateIdentity(identity: QVariantMap, additional: QVariantMap) + fun requestRemoveIdentity(identityId: IdentityId) + fun requestCreateNetwork(networkInfo: NetworkInfo, channels: List<String>) + fun requestRemoveNetwork(networkId: NetworkId) + fun requestPasswordChange(peerPtr: Long, user: String, old: String, new: String) + fun requestKickClient(id: Int) + fun sendInput(bufferInfo: BufferInfo, message: String) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ISyncableObject.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ISyncableObject.kt new file mode 100644 index 000000000..4a31961c8 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ISyncableObject.kt @@ -0,0 +1,25 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.quasseldroid_ng.protocol.* + +interface ISyncableObject { + val objectName: String + var identifier: String + val className: String + var initialized: Boolean + fun SYNC(function: String, vararg arg: QVariant_) + fun REQUEST(function: String, vararg arg: QVariant_) + fun requestUpdate(properties: QVariantMap = toVariantMap()) { + REQUEST(SLOT, ARG(properties, Type.QVariantMap)) + } + + fun update(properties: QVariantMap) { + fromVariantMap(properties) + SYNC(SLOT, ARG(properties, Type.QVariantMap)) + } + + fun init() {} + + fun fromVariantMap(properties: QVariantMap) = Unit + fun toVariantMap(): QVariantMap = emptyMap() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransfer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransfer.kt new file mode 100644 index 000000000..17377d42e --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransfer.kt @@ -0,0 +1,54 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import java.nio.ByteBuffer + +@Syncable(name = "Transfer") +interface ITransfer : ISyncableObject { + @Slot + fun accept(savePath: String) + + @Slot + fun reject() + + @Slot + fun requestAccepted(peer: Long) + + @Slot + fun requestRejected(peer: Long) + + @Slot + fun setStatus(status: Status) + + @Slot + fun setError(errorString: String) + + @Slot + fun dataReceived(peer: Long, data: ByteBuffer) + + @Slot + fun cleanUp() + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } + + enum class Status { + New, + Pending, + Connecting, + Transferring, + Paused, + Completed, + Failed, + Rejected + } + + enum class Direction { + Send, + Receive + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransferManager.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransferManager.kt new file mode 100644 index 000000000..7ea2862c7 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransferManager.kt @@ -0,0 +1,20 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces + +import de.kuschku.libquassel.annotations.Slot +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.protocol.QVariantMap +import java.util.* + +@Syncable(name = "TransferManager") +interface ITransferManager : ISyncableObject { + @Slot + fun setTransferIds(transferIds: List<UUID>) + + @Slot + fun onCoreTransferAdded(transferId: UUID) + + @Slot + override fun update(properties: QVariantMap) { + super.update(properties) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invoker.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invoker.kt new file mode 100644 index 000000000..0af930f18 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invoker.kt @@ -0,0 +1,11 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.invokers + +import de.kuschku.quasseldroid_ng.UnknownMethodException +import de.kuschku.quasseldroid_ng.WrongObjectTypeException +import de.kuschku.quasseldroid_ng.protocol.QVariantList + +interface Invoker<out T> { + val className: String + @Throws(WrongObjectTypeException::class, UnknownMethodException::class) + fun invoke(on: Any?, method: String, params: QVariantList) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invokers.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invokers.kt new file mode 100644 index 000000000..dec0c0a61 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invokers.kt @@ -0,0 +1,68 @@ +package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.invokers + +import de.kuschku.libquassel.annotations.Syncable +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.* +import de.kuschku.quasseldroid_ng.util.helpers.Logger +import de.kuschku.quasseldroid_ng.util.helpers.debug +import de.kuschku.quasseldroid_ng.util.helpers.warn + +object Invokers { + private val registry = mutableMapOf<String, Invoker<*>>() + fun get(name: String) = registry[name] + + val RPC: Invoker<IRpcHandler>? + + val size + get() = registry.size + + init { + register(invoker<IAliasManager>()) + register(invoker<IBacklogManager>()) + register(invoker<IBufferSyncer>()) + register(invoker<IBufferViewConfig>()) + register(invoker<IBufferViewManager>()) + register(invoker<ICertManager>()) + register(invoker<ICoreInfo>()) + register(invoker<IDccConfig>()) + register(invoker<IIdentity>()) + register(invoker<IIgnoreListManager>()) + register(invoker<IIrcChannel>()) + register(invoker<IIrcListHelper>()) + register(invoker<IIrcUser>()) + register(invoker<INetwork>()) + register(invoker<INetworkConfig>()) + register(invoker<ITransfer>()) + register(invoker<ITransferManager>()) + + RPC = invoker() + + Logger.debug("Invokers::init", "$size invokers registered") + } + + private inline fun <reified T> invoker(): Invoker<T>? = getInvoker(T::class.java) + + private fun <T> getInvoker(type: Class<T>): Invoker<T>? { + val syncable: Syncable? = type.getAnnotation(Syncable::class.java) + if (syncable == null) { + Logger.warn("Invokers::register", "Invoker not annotated: ${type.canonicalName}") + return null + } + + val packageName = "${type.`package`.name}.invokers" + val className = "${syncable.name}Invoker" + val klass = Class.forName("$packageName.$className") + val invoker = klass.getDeclaredField("INSTANCE").get(null) + if (invoker !is Invoker<*>) { + Logger.warn("Invokers::register", + "Invoker not of proper type: ${type.canonicalName} != ${invoker.javaClass.canonicalName}") + return null + } + + return invoker as Invoker<T>? + } + + private fun <T> register(invoker: Invoker<T>?) { + if (invoker != null) + registry.put(invoker.className, invoker) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java deleted file mode 100644 index e3c1d3eaa..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.service; - -import android.content.Context; -import android.support.annotation.NonNull; - -import org.acra.ACRA; -import org.greenrobot.eventbus.Subscribe; - -import java.io.IOException; -import java.net.ConnectException; -import java.net.SocketException; - -import javax.net.ssl.SSLException; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.QuasselClient; -import de.kuschku.libquassel.client.ClientData; -import de.kuschku.libquassel.client.FeatureFlags; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.events.GeneralErrorEvent; -import de.kuschku.libquassel.events.LoginRequireEvent; -import de.kuschku.libquassel.localtypes.backlogstorage.HybridBacklogStorage; -import de.kuschku.libquassel.protocols.RemotePeer; -import de.kuschku.quasseldroid_ng.ui.settings.Settings; -import de.kuschku.util.CompatibilityUtils; -import de.kuschku.util.accounts.Account; -import de.kuschku.util.accounts.AccountManager; -import de.kuschku.util.buffermetadata.SQLiteBufferMetaDataManager; -import de.kuschku.util.certificates.SQLiteCertificateManager; - -public class ClientBackgroundThread implements Runnable { - @NonNull - private static final ClientData CLIENT_DATA = new ClientData( - new FeatureFlags(true, true), - new byte[]{RemotePeer.DATASTREAM}, - "QuasselDroid-ng 0.1 | libquassel 0.3.0", - RemotePeer.PROTOCOL_VERSION_LEGACY - ); - - @NonNull - private final QuasselClient client; - - private final Settings settings; - private final AccountManager manager; - - public ClientBackgroundThread(@NonNull BusProvider provider, @NonNull Account account, @NonNull Context context) { - this.client = new QuasselClient( - provider, - CLIENT_DATA, - new SQLiteCertificateManager(context), - new HybridBacklogStorage(), - new SQLiteBufferMetaDataManager(context), - account.id.toString() - ); - this.client.connect(account.toAddress()); - this.client.provider.event.register(this); - - settings = new Settings(context); - manager = new AccountManager(context); - } - - @NonNull - public QuasselClient client() { - return client; - } - - @Override - public void run() { - try { - client.connection.open(CompatibilityUtils.deviceSupportsKeepAlive()); - } catch (IOException e) { - client.provider.sendEvent(new GeneralErrorEvent(e)); - client.client.setConnectionStatus(ConnectionChangeEvent.Status.DISCONNECTED); - } - } - - public void close() { - client.disconnect(); - } - - @Subscribe(sticky = true) - public void onEvent(LoginRequireEvent event) { - if (!event.failedLast) { - Account account = manager.account(settings.preferenceLastAccount.get()); - client().client.login(account.user, account.pass); - } - } - - @Subscribe(sticky = true) - public void onEvent(GeneralErrorEvent event) { - if (!(event.exception instanceof ConnectException) && !(event.exception instanceof SSLException) && !(event.exception instanceof SocketException)) - ACRA.getErrorReporter().handleSilentException(event.exception); - - event.exception.printStackTrace(); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java deleted file mode 100644 index e86420ffe..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.service; - -import android.app.Service; -import android.content.Intent; -import android.os.Binder; -import android.os.IBinder; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.util.accounts.Account; -import de.kuschku.util.backports.Consumer; - -public class QuasselService extends Service { - @NonNull - private final IBinder binder = new LocalBinder(); - private final Set<Consumer<ClientBackgroundThread>> consumers = new HashSet<>(); - @Nullable - private ClientBackgroundThread bgThread; - - @Override - public IBinder onBind(Intent intent) { - return binder; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - return START_STICKY; - } - - public class LocalBinder extends Binder { - public void startBackgroundThread(@NonNull BusProvider provider, @NonNull Account account) { - bgThread = new ClientBackgroundThread(provider, account, QuasselService.this); - new Thread(bgThread).start(); - notify(bgThread); - } - - @Nullable - public ClientBackgroundThread getBackgroundThread() { - return bgThread; - } - - public void stopBackgroundThread() { - if (bgThread != null) bgThread.close(); - bgThread = null; - } - - public void addCallback(Consumer<ClientBackgroundThread> consumer) { - consumers.add(consumer); - } - - public void removeCallback(Consumer<ClientBackgroundThread> consumer) { - consumers.remove(consumer); - } - - private void notify(ClientBackgroundThread thread) { - for (Consumer<ClientBackgroundThread> consumer : consumers) { - consumer.apply(thread); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt new file mode 100644 index 000000000..8f976fb89 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt @@ -0,0 +1,80 @@ +package de.kuschku.quasseldroid_ng.service + +import android.arch.lifecycle.LifecycleService +import android.arch.lifecycle.MutableLiveData +import android.arch.lifecycle.Transformations +import android.content.Intent +import android.os.Binder +import de.kuschku.quasseldroid_ng.BuildConfig +import de.kuschku.quasseldroid_ng.R +import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.session.* +import org.threeten.bp.Instant +import java.security.cert.X509Certificate +import javax.net.ssl.X509TrustManager + +class QuasselService : LifecycleService() { + private lateinit var session: Session + + private val backend = object : Backend { + override fun session() = session + + override fun connect(address: SocketAddress, user: String, pass: String) { + disconnect() + session.coreConnection = CoreConnection(session, address) + session.coreConnection?.start() + session.userData = user to pass + connection.postValue(session.coreConnection) + } + + override fun disconnect() { + session.coreConnection?.close() + session.coreConnection = null + connection.postValue(null) + ABSENT.postValue(ConnectionState.DISCONNECTED) + } + + private val connection = MutableLiveData<CoreConnection>() + + val ABSENT = MutableLiveData<ConnectionState>() + override val status = Transformations.switchMap(connection) { input: CoreConnection? -> + input?.liveState ?: ABSENT + } + } + + private lateinit var database: QuasselDatabase + + override fun onCreate() { + super.onCreate() + database = QuasselDatabase.Creator.init(application) + session = Session( + clientData = ClientData( + identifier = "${resources.getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}", + buildDate = Instant.ofEpochSecond(BuildConfig.GIT_COMMIT_DATE), + clientFeatures = Quassel_Features.of(*Quassel_Feature.values()), + protocolFeatures = Protocol_Features.of( + Protocol_Feature.Compression, + Protocol_Feature.TLS + ), + supportedProtocols = byteArrayOf(0x02) + ), + trustManager = object : X509TrustManager { + override fun checkClientTrusted(p0: Array<out X509Certificate>?, p1: String?) { + } + + override fun checkServerTrusted(p0: Array<out X509Certificate>?, p1: String?) { + } + + override fun getAcceptedIssuers(): Array<X509Certificate> = emptyArray() + } + ) + } + + override fun onBind(intent: Intent?): QuasselBinder { + super.onBind(intent) + return QuasselBinder(backend) + } + + class QuasselBinder(val backend: Backend) : Binder() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/AuthHandler.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/AuthHandler.kt new file mode 100644 index 000000000..ea244129b --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/AuthHandler.kt @@ -0,0 +1,29 @@ +package de.kuschku.quasseldroid_ng.session + +import de.kuschku.quasseldroid_ng.protocol.HandshakeMessage + +interface AuthHandler { + fun handle(function: HandshakeMessage.ClientInit) {} + fun handle(function: HandshakeMessage.ClientInitReject) {} + fun handle(function: HandshakeMessage.ClientInitAck) {} + fun handle(function: HandshakeMessage.CoreSetupData) {} + fun handle(function: HandshakeMessage.CoreSetupReject) {} + fun handle(function: HandshakeMessage.CoreSetupAck) {} + fun handle(function: HandshakeMessage.ClientLogin) {} + fun handle(function: HandshakeMessage.ClientLoginReject) {} + fun handle(function: HandshakeMessage.ClientLoginAck) {} + fun handle(function: HandshakeMessage.SessionInit) {} + + fun handle(function: HandshakeMessage) = when (function) { + is HandshakeMessage.ClientInit -> handle(function) + is HandshakeMessage.ClientInitReject -> handle(function) + is HandshakeMessage.ClientInitAck -> handle(function) + is HandshakeMessage.CoreSetupData -> handle(function) + is HandshakeMessage.CoreSetupReject -> handle(function) + is HandshakeMessage.CoreSetupAck -> handle(function) + is HandshakeMessage.ClientLogin -> handle(function) + is HandshakeMessage.ClientLoginReject -> handle(function) + is HandshakeMessage.ClientLoginAck -> handle(function) + is HandshakeMessage.SessionInit -> handle(function) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/Backend.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/Backend.kt new file mode 100644 index 000000000..b63b7458c --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/Backend.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid_ng.session + +import android.arch.lifecycle.LiveData + +interface Backend { + fun connect(address: SocketAddress, user: String, pass: String) + fun disconnect() + fun session(): Session + val status: LiveData<ConnectionState> +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ConnectionState.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/ConnectionState.kt new file mode 100644 index 000000000..4da076241 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/ConnectionState.kt @@ -0,0 +1,9 @@ +package de.kuschku.quasseldroid_ng.session + +enum class ConnectionState { + DISCONNECTED, + CONNECTING, + HANDSHAKE, + INIT, + CONNECTED, +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/CoreConnection.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/CoreConnection.kt new file mode 100644 index 000000000..934530bf3 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/CoreConnection.kt @@ -0,0 +1,224 @@ +package de.kuschku.quasseldroid_ng.session + +import android.arch.lifecycle.MutableLiveData +import android.os.Handler +import android.os.HandlerThread +import android.os.Process +import de.kuschku.quasseldroid_ng.protocol.HandshakeMessage +import de.kuschku.quasseldroid_ng.protocol.Quassel_Feature +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.protocol.SignalProxyMessage +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.HandshakeVariantMapSerializer +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.IntSerializer +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.ProtocolSerializer +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.VariantListSerializer +import de.kuschku.quasseldroid_ng.quassel.ProtocolFeature +import de.kuschku.quasseldroid_ng.util.CompatibilityUtils +import de.kuschku.quasseldroid_ng.util.hasFlag +import de.kuschku.quasseldroid_ng.util.helpers.* +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import de.kuschku.quasseldroid_ng.util.nio.WrappedChannel +import org.threeten.bp.ZoneOffset +import org.threeten.bp.format.DateTimeFormatter +import java.lang.Thread.UncaughtExceptionHandler +import java.net.Socket +import java.net.SocketException +import java.nio.ByteBuffer + +class CoreConnection( + private val session: Session, + private val address: SocketAddress +) : Thread() { + private val parseThread = HandlerThread("parse", Process.THREAD_PRIORITY_BACKGROUND) + private val writeThread = HandlerThread("write", Process.THREAD_PRIORITY_BACKGROUND) + private val backendThread = HandlerThread("backend", Process.THREAD_PRIORITY_BACKGROUND) + private lateinit var parseHandler: Handler + private lateinit var writeHandler: Handler + private lateinit var backendHandler: Handler + + private val exceptionHandler = UncaughtExceptionHandler { thread, throwable -> + Logger.error(thread.name, "", throwable) + } + + private val sizeBuffer = ByteBuffer.allocateDirect(4) + private val chainedBuffer = ChainedByteBuffer(direct = true) + val liveState = MutableLiveData<ConnectionState>() + + init { + liveState.value = ConnectionState.DISCONNECTED + } + + var state = ConnectionState.DISCONNECTED + set(value) { + field = value + Logger.debug("CoreConnection", "Connection state changed to $state") + liveState.postValue(value) + } + + private var channel: WrappedChannel? = null + + private fun connect() { + state = ConnectionState.CONNECTING + val socket = Socket() + if (CompatibilityUtils.deviceSupportsKeepAlive()) + socket.keepAlive = true + socket.connect(address.data(), 10_000) + channel = WrappedChannel.ofSocket(socket) + parseThread.uncaughtExceptionHandler = exceptionHandler + writeThread.uncaughtExceptionHandler = exceptionHandler + backendThread.uncaughtExceptionHandler = exceptionHandler + parseThread.start() + writeThread.start() + backendThread.start() + parseHandler = Handler(parseThread.looper) + writeHandler = Handler(writeThread.looper) + backendHandler = Handler(backendThread.looper) + } + + private fun sendHandshake() { + state = ConnectionState.HANDSHAKE + IntSerializer.serialize(chainedBuffer, + 0x42b33f00 or session.clientData.protocolFeatures.toInt(), + session.coreFeatures) + for (supportedProtocol in session.clientData.supportedProtocols) { + IntSerializer.serialize(chainedBuffer, supportedProtocol.toInt(), session.coreFeatures) + } + IntSerializer.serialize(chainedBuffer, 1 shl 31, session.coreFeatures) + channel?.write(chainedBuffer) + channel?.flush() + } + + private fun readHandshake() { + sizeBuffer.clear() + channel?.read(sizeBuffer) + sizeBuffer.flip() + val protocol = ProtocolSerializer.deserialize(sizeBuffer, session.coreFeatures) + + println(protocol) + + // Wrap socket in SSL context if ssl is enabled + if (protocol.flags.hasFlag(ProtocolFeature.TLS)) { + channel = channel?.withSSL(session.trustManager, address) + } + + // Wrap socket in deflater if compression is enabled + if (protocol.flags.hasFlag(ProtocolFeature.Compression)) { + channel = channel?.withCompression() + } + + // Initialize remote peer + when (protocol.version.toInt()) { + 0x02 -> { + // Send client clientData to core + dispatch(HandshakeMessage.ClientInit( + clientVersion = session.clientData.identifier, + buildDate = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss") + .format(session.clientData.buildDate.atOffset(ZoneOffset.UTC)), + clientFeatures = Quassel_Features.of(*Quassel_Feature.values()) + )) + } + else -> { + throw IllegalArgumentException("Invalid Protocol Version: $protocol") + } + } + } + + fun close() { + interrupt() + parseThread.quit() + writeThread.quit() + backendThread.quit() + val thread = Thread { + try { + channel?.close() + } catch (e: Throwable) { + Logger.warn("ConnectionClosing", "", e) + } + } + thread.start() + thread.join() + } + + fun dispatch(message: HandshakeMessage) { + parseHandler.post { + try { + val data = HandshakeMessage.serialize(message) + writeHandler.post( + MessageRunnable(data, HandshakeVariantMapSerializer, chainedBuffer, channel, + session.coreFeatures) + ) + } catch (e: Throwable) { + Logger.warn("HandshakeSerializing", "", e) + } + } + } + + fun dispatch(message: SignalProxyMessage) { + parseHandler.post { + try { + val data = SignalProxyMessage.serialize(message) + writeHandler.post( + MessageRunnable(data, VariantListSerializer, chainedBuffer, channel, session.coreFeatures) + ) + } catch (e: Throwable) { + Logger.warn("MessageSerializing", "", e) + } + } + } + + override fun run() { + try { + connect() + sendHandshake() + readHandshake() + while (!isInterrupted) { + sizeBuffer.clear() + channel?.read(sizeBuffer) + sizeBuffer.flip() + + val size = IntSerializer.deserialize(sizeBuffer, session.coreFeatures) + if (size > 64 * 1024 * 1024) + throw SocketException("Too large frame received: $size") + val dataBuffer = ByteBuffer.allocateDirect(size) + while (dataBuffer.position() < dataBuffer.limit() && channel?.read(dataBuffer) ?: -1 > 0) { + } + dataBuffer.flip() + parseHandler.post { + when (state) { + ConnectionState.HANDSHAKE -> { + try { + val msg = HandshakeMessage.deserialize( + HandshakeVariantMapSerializer.deserialize(dataBuffer, session.coreFeatures) + ) + try { + session.handle(msg) + } catch (e: Throwable) { + Logger.warn("HandshakeHandling", "", e) + } + } catch (e: Throwable) { + Logger.warn("HandshakeParsing", "", e) + } + } + else -> + try { + val msg = SignalProxyMessage.deserialize( + VariantListSerializer.deserialize(dataBuffer, session.coreFeatures) + ) + backendHandler.post { + try { + session.handle(msg) + } catch (e: Throwable) { + Logger.warn("MessageHandling", "", e) + } + } + } catch (e: Throwable) { + Logger.warn("MessageParsing", "", e) + } + } + } + } + } catch (e: Throwable) { + Logger.warn("CoreConnection", "", e) + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/MessageRunnable.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/MessageRunnable.kt new file mode 100644 index 000000000..f2449d847 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/MessageRunnable.kt @@ -0,0 +1,32 @@ +package de.kuschku.quasseldroid_ng.session + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.Serializer +import de.kuschku.quasseldroid_ng.util.helpers.Logger +import de.kuschku.quasseldroid_ng.util.helpers.warn +import de.kuschku.quasseldroid_ng.util.helpers.write +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import de.kuschku.quasseldroid_ng.util.nio.WrappedChannel +import java.nio.ByteBuffer + +class MessageRunnable<T>( + private val data: T, + private val serializer: Serializer<T>, + private val chainedBuffer: ChainedByteBuffer, + private val channel: WrappedChannel?, + private val features: Quassel_Features +) : () -> Unit { + override fun invoke() { + try { + serializer.serialize(chainedBuffer, data, features) + val sizeBuffer = ByteBuffer.allocateDirect(4) + sizeBuffer.putInt(chainedBuffer.size) + sizeBuffer.flip() + channel?.write(sizeBuffer) + channel?.write(chainedBuffer) + channel?.flush() + } catch (e: Throwable) { + Logger.warn("MessageDispatching", "", e) + } + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ObjectStorage.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/ObjectStorage.kt new file mode 100644 index 000000000..23b88d55c --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/ObjectStorage.kt @@ -0,0 +1,33 @@ +package de.kuschku.quasseldroid_ng.session + +import de.kuschku.quasseldroid_ng.ObjectNotFoundException +import de.kuschku.quasseldroid_ng.protocol.QType +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.protocol.SignalProxyMessage +import de.kuschku.quasseldroid_ng.protocol.Type +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject + +class ObjectStorage(private val proxy: SignalProxy) { + private val objectTree: MutableMap<String, ISyncableObject> = HashMap() + + fun add(obj: ISyncableObject) = objectTree.put(obj.identifier, obj) + + fun remove(obj: ISyncableObject) = objectTree.remove(obj.identifier) + + fun rename(className: String, new: String, old: String) { + val obj = get(className, old) ?: throw ObjectNotFoundException(className, old) + rename(obj, new, old) + } + + fun rename(obj: ISyncableObject, new: String, old: String) { + objectTree.put("${obj.className}:$new", obj) + objectTree.remove("${obj.className}:$old") + proxy.dispatch(SignalProxyMessage.RpcCall("__objectRenamed__", listOf( + QVariant_(obj.className, Type.QString), QVariant_(new, Type.QString), + QVariant_(old, Type.QString)) + )) + } + + fun get(className: QType, objectName: String) = get(className.typeName, objectName) + fun get(className: String, objectName: String) = objectTree["$className:$objectName"] +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ProtocolHandler.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/ProtocolHandler.kt new file mode 100644 index 000000000..2f85c8f21 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/ProtocolHandler.kt @@ -0,0 +1,150 @@ +package de.kuschku.quasseldroid_ng.session + +import de.kuschku.quasseldroid_ng.ObjectNotFoundException +import de.kuschku.quasseldroid_ng.protocol.HandshakeMessage +import de.kuschku.quasseldroid_ng.protocol.QVariant_ +import de.kuschku.quasseldroid_ng.protocol.SignalProxyMessage +import de.kuschku.quasseldroid_ng.quassel.syncables.RpcHandler +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.invokers.Invokers +import de.kuschku.quasseldroid_ng.util.helpers.Logger +import de.kuschku.quasseldroid_ng.util.helpers.debug +import de.kuschku.quasseldroid_ng.util.helpers.warn +import org.threeten.bp.Instant + +abstract class ProtocolHandler : SignalProxy, AuthHandler { + private val objectStorage: ObjectStorage = ObjectStorage(this) + protected val rpcHandler: RpcHandler = RpcHandler(this) + + private val toInit = mutableMapOf<ISyncableObject, MutableList<SignalProxyMessage.SyncMessage>>() + private val syncQueue = mutableListOf<SignalProxyMessage.SyncMessage>() + + protected var isInitializing = false + + private var currentCallClass = "" + private var currentCallSlot = "" + private var currentCallInstance = "" + + abstract fun onInitDone() + + override fun handle(f: SignalProxyMessage) { + try { + super<SignalProxy>.handle(f) + } catch (e: Throwable) { + Logger.warn("ProtocolHandler", "", e) + } + } + + override fun handle(function: HandshakeMessage) { + try { + super<AuthHandler>.handle(function) + } catch (e: Throwable) { + Logger.warn("ProtocolHandler", "", e) + } + } + + override fun handle(f: SignalProxyMessage.InitData) { + Logger.debug("<", f.toString()) + val obj: ISyncableObject = objectStorage.get(f.className, f.objectName) + ?: throw ObjectNotFoundException(f.className, f.objectName) + + obj.fromVariantMap(f.initData) + obj.initialized = true + synchronize(obj) + checkForInitDone() + toInit.remove(obj)?.forEach(this::handle) + } + + private fun checkForInitDone() { + if (isInitializing && toInit.isEmpty()) { + isInitializing = false + syncQueue.forEach(this::handle) + onInitDone() + } + } + + override fun handle(f: SignalProxyMessage.SyncMessage) { + val obj = objectStorage.get(f.className, f.objectName) + if (obj == null) { + if (isInitializing) { + syncQueue.add(f) + return + } else { + Logger.debug("<", f.toString()) + throw ObjectNotFoundException(f.className, f.objectName) + } + } + + val initQueue = toInit[obj] + if (initQueue != null) { + initQueue.add(f) + return + } + + Logger.debug("<", f.toString()) + + val invoker = Invokers.get(f.className) ?: throw IllegalArgumentException( + "Invalid classname: ${f.className}") + currentCallClass = f.className + currentCallInstance = f.objectName + currentCallSlot = f.slotName + invoker.invoke(obj, f.slotName, f.params) + currentCallClass = "" + currentCallInstance = "" + currentCallSlot = "" + } + + override fun handle(f: SignalProxyMessage.RpcCall) { + Logger.debug("<", f.toString()) + + currentCallSlot = f.slotName + Invokers.RPC?.invoke(rpcHandler, f.slotName, f.params) + currentCallSlot = "" + } + + override fun handle(f: SignalProxyMessage.HeartBeat) { + dispatch(SignalProxyMessage.HeartBeatReply(f.timestamp)) + dispatch(SignalProxyMessage.HeartBeat(Instant.now())) + } + + override fun callSync(type: String, instance: String, slot: String, params: List<QVariant_>) { + // Don’t transmit calls back that we just got from the network + if (type != currentCallClass || slot != currentCallSlot || instance != currentCallInstance) { + dispatch(SignalProxyMessage.SyncMessage(type, instance, slot, params)) + } + } + + override fun callRpc(slot: String, params: List<QVariant_>) { + // Don’t transmit calls back that we just got from the network + if (slot != currentCallSlot) { + dispatch(SignalProxyMessage.RpcCall(slot, params)) + } + } + + override fun renameObject(syncableObject: ISyncableObject, newName: String, oldName: String) { + objectStorage.rename(syncableObject, newName, oldName) + } + + override fun renameObject(className: String, newName: String, oldName: String) { + objectStorage.rename(className, newName, oldName) + } + + override fun synchronize(syncableObject: ISyncableObject, baseInit: Boolean) { + if (!syncableObject.initialized) + syncableObject.init() + + objectStorage.add(syncableObject) + + if (!syncableObject.initialized) { + if (baseInit) { + toInit.put(syncableObject, mutableListOf()) + } + dispatch(SignalProxyMessage.InitRequest(syncableObject.className, syncableObject.objectName)) + } + } + + override fun stopSynchronize(syncableObject: ISyncableObject) { + objectStorage.remove(syncableObject) + toInit.remove(syncableObject) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/Session.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/Session.kt new file mode 100644 index 000000000..f2d694334 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/Session.kt @@ -0,0 +1,109 @@ +package de.kuschku.quasseldroid_ng.session + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.QuasselFeature +import de.kuschku.quasseldroid_ng.quassel.syncables.* +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.invokers.Invokers +import de.kuschku.quasseldroid_ng.util.hasFlag +import de.kuschku.quasseldroid_ng.util.helpers.Logger +import de.kuschku.quasseldroid_ng.util.helpers.debug +import org.threeten.bp.Instant +import javax.net.ssl.X509TrustManager + +class Session( + val clientData: ClientData, + val trustManager: X509TrustManager, + var coreConnection: CoreConnection? = null +) : ProtocolHandler() { + var coreFeatures: Quassel_Features = Quassel_Feature.NONE + + var userData: Pair<String, String>? = null + + private val aliasManager = AliasManager(this) + private val backlogManager = BacklogManager(this) + private val bufferSyncer = BufferSyncer(this) + private val bufferViewManager = BufferViewManager(this) + private val certManagers = mutableMapOf<IdentityId, CertManager>() + private val coreInfo = CoreInfo(this) + private val dccConfig = DccConfig(this) + private val identities = mutableMapOf<IdentityId, Identity>() + private val ignoreListManager = IgnoreListManager(this) + private val ircListHelper = IrcListHelper(this) + private val networks = mutableMapOf<NetworkId, Network>() + private val networkConfig = NetworkConfig(this) + + init { + Logger.debug("Session", "Session created") + + // This should preload them + Invokers + } + + override fun handle(function: HandshakeMessage.ClientInitAck) { + coreFeatures = function.coreFeatures ?: Quassel_Feature.NONE + dispatch(HandshakeMessage.ClientLogin( + user = userData?.first, + password = userData?.second + )) + } + + override fun handle(function: HandshakeMessage.ClientLoginReject) { + + } + + override fun handle(function: HandshakeMessage.SessionInit) { + coreConnection?.state = ConnectionState.INIT + + function.networkIds?.forEach { + val network = Network(it.value(-1), this) + networks.put(network.networkId(), network) + } + + function.identities?.forEach { + val identity = Identity(this) + identity.fromVariantMap(it.valueOr(::emptyMap)) + identity.initialized = true + identities.put(identity.id(), identity) + + val certManager = CertManager(identity.id(), this) + certManagers.put(identity.id(), certManager) + } + + isInitializing = true + networks.values.forEach { syncableObject -> this.synchronize(syncableObject, true) } + certManagers.values.forEach { syncableObject -> this.synchronize(syncableObject, true) } + synchronize(aliasManager, true) + synchronize(bufferSyncer, true) + synchronize(bufferViewManager, true) + synchronize(coreInfo, true) + if (coreFeatures.hasFlag(QuasselFeature.DccFileTransfer)) + synchronize(dccConfig, true) + synchronize(ignoreListManager, true) + synchronize(ircListHelper, true) + synchronize(networkConfig, true) + } + + override fun onInitDone() { + coreConnection?.state = ConnectionState.CONNECTED + Logger.debug("Session", "Initialization finished") + } + + override fun handle(f: SignalProxyMessage.HeartBeatReply) { + val now = Instant.now() + val latency = now.toEpochMilli() - f.timestamp.toEpochMilli() + Logger.debug("Session", "Latency of $latency ms") + } + + override fun dispatch(message: SignalProxyMessage) { + Logger.debug(">", message.toString()) + coreConnection?.dispatch(message) + } + + override fun dispatch(message: HandshakeMessage) { + Logger.debug(">", message.toString()) + coreConnection?.dispatch(message) + } + + override fun network(id: NetworkId): Network? = networks[id] + override fun identity(id: IdentityId): Identity? = identities[id] +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/SignalProxy.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/SignalProxy.kt new file mode 100644 index 000000000..6639593fb --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/SignalProxy.kt @@ -0,0 +1,39 @@ +package de.kuschku.quasseldroid_ng.session + +import de.kuschku.quasseldroid_ng.protocol.* +import de.kuschku.quasseldroid_ng.quassel.syncables.Identity +import de.kuschku.quasseldroid_ng.quassel.syncables.Network +import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject + +interface SignalProxy { + fun handle(f: SignalProxyMessage.SyncMessage) {} + fun handle(f: SignalProxyMessage.RpcCall) {} + fun handle(f: SignalProxyMessage.InitRequest) {} + fun handle(f: SignalProxyMessage.InitData) {} + fun handle(f: SignalProxyMessage.HeartBeat) {} + fun handle(f: SignalProxyMessage.HeartBeatReply) {} + + fun handle(f: SignalProxyMessage) = when (f) { + is SignalProxyMessage.SyncMessage -> handle(f) + is SignalProxyMessage.RpcCall -> handle(f) + is SignalProxyMessage.InitRequest -> handle(f) + is SignalProxyMessage.InitData -> handle(f) + is SignalProxyMessage.HeartBeat -> handle(f) + is SignalProxyMessage.HeartBeatReply -> handle(f) + } + + fun dispatch(message: SignalProxyMessage) + fun dispatch(message: HandshakeMessage) + + fun callSync(type: String, instance: String, slot: String, params: List<QVariant_>) + fun callRpc(slot: String, params: List<QVariant_>) + + fun network(id: NetworkId): Network? + fun identity(id: IdentityId): Identity? + + fun renameObject(syncableObject: ISyncableObject, newName: String, oldName: String) + fun renameObject(className: String, newName: String, oldName: String) + fun synchronize(syncableObject: ISyncableObject, baseInit: Boolean) + fun synchronize(syncableObject: ISyncableObject) = synchronize(syncableObject, false) + fun stopSynchronize(syncableObject: ISyncableObject) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/SocketAddress.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/session/SocketAddress.kt new file mode 100644 index 000000000..ee0edcc19 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/session/SocketAddress.kt @@ -0,0 +1,7 @@ +package de.kuschku.quasseldroid_ng.session + +import java.net.InetSocketAddress + +data class SocketAddress(val host: String, val port: Short) { + fun data() = InetSocketAddress(host, port.toInt()) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/LoginActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/LoginActivity.java deleted file mode 100644 index 7f91d24d5..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/LoginActivity.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDelegate; - -import de.kuschku.libquassel.localtypes.orm.ConnectedDatabase; -import de.kuschku.quasseldroid_ng.ui.chat.MainActivity; -import de.kuschku.quasseldroid_ng.ui.chat.util.ServiceHelper; -import de.kuschku.quasseldroid_ng.ui.setup.AccountSelectActivity; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; - -public class LoginActivity extends AppCompatActivity { - public static final int REQUEST_CODE_SELECT = 8; - - static { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - } - - private final AppContext context = new AppContext(); - - private boolean firstStart = true; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - ServiceHelper.initContext(context, this); - } - - @Override - protected void onResume() { - super.onResume(); - if (!checkReady()) { - finish(); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == REQUEST_CODE_SELECT) { - if (resultCode == RESULT_OK) { - // If we select a different core than we used last time, clear the database - if (!context.settings().preferenceLastAccount.get().equals(data.getBundleExtra("extra").getString("account"))) - deleteDatabase(ConnectedDatabase.NAME); - - context.settings().preferenceLastAccount.set(data.getBundleExtra("extra").getString("account")); - checkReady(); - firstStart = true; - } else { - finish(); - } - } - } - - private boolean checkReady() { - if (context.settings().preferenceLastAccount.get().isEmpty()) { - Intent intent = new Intent(this, AccountSelectActivity.class); - startActivityForResult(intent, REQUEST_CODE_SELECT); - firstStart = true; - return true; - } else if (firstStart) { - startActivity(new Intent(this, MainActivity.class)); - firstStart = false; - return true; - } else { - return false; - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/MainActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/MainActivity.kt new file mode 100644 index 000000000..be288c70f --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/MainActivity.kt @@ -0,0 +1,125 @@ +package de.kuschku.quasseldroid_ng.ui + +import android.arch.lifecycle.LiveData +import android.arch.lifecycle.Observer +import android.os.Bundle +import android.support.design.widget.Snackbar +import android.util.Log +import android.view.Menu +import android.view.MenuItem +import android.widget.Button +import android.widget.EditText +import android.widget.TextView +import butterknife.BindView +import butterknife.ButterKnife +import de.kuschku.quasseldroid_ng.R +import de.kuschku.quasseldroid_ng.session.Backend +import de.kuschku.quasseldroid_ng.session.ConnectionState +import de.kuschku.quasseldroid_ng.session.Session +import de.kuschku.quasseldroid_ng.session.SocketAddress +import de.kuschku.quasseldroid_ng.util.helpers.Logger +import de.kuschku.quasseldroid_ng.util.helpers.stickyMapNotNull +import de.kuschku.quasseldroid_ng.util.helpers.stickySwitchMapNotNull +import org.threeten.bp.ZoneOffset +import org.threeten.bp.ZonedDateTime +import org.threeten.bp.format.DateTimeFormatter + +class MainActivity : ServiceBoundActivity() { + @BindView(R.id.host) + lateinit var host: EditText + + @BindView(R.id.port) + lateinit var port: EditText + + @BindView(R.id.user) + lateinit var user: EditText + + @BindView(R.id.pass) + lateinit var pass: EditText + + @BindView(R.id.connect) + lateinit var connect: Button + + @BindView(R.id.disconnect) + lateinit var disconnect: Button + + @BindView(R.id.clear) + lateinit var clear: Button + + @BindView(R.id.errorList) + lateinit var errorList: TextView + + private val status: LiveData<ConnectionState> + = stickySwitchMapNotNull(backend, Backend::status, ConnectionState.DISCONNECTED) + private val session: LiveData<Session?> + = stickyMapNotNull(backend, Backend::session, null) + + private var snackbar: Snackbar? = null + + private val handler = { tag: String, message: String?, throwable: Throwable? -> + runOnUiThread { + errorList.append(DateTimeFormatter.ISO_TIME.format(ZonedDateTime.now(ZoneOffset.UTC))) + errorList.append(" ") + errorList.append(tag) + errorList.append(": ") + errorList.append(message) + errorList.append("\n") + if (throwable != null) { + errorList.append(Log.getStackTraceString(throwable)) + errorList.append("\n") + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + setTheme(R.style.AppTheme) + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + ButterKnife.bind(this) + + connect.setOnClickListener { + backend.value?.connect( + SocketAddress(host.text.toString(), port.text.toString().toShort()), + user.text.toString(), + pass.text.toString() + ) + } + + disconnect.setOnClickListener { + backend.value?.disconnect() + } + + clear.setOnClickListener { + errorList.text = "" + } + + status.observe(this, Observer { + val disconnected = it == ConnectionState.DISCONNECTED + disconnect.isEnabled = !disconnected + connect.isEnabled = disconnected + + snackbar?.dismiss() + snackbar = Snackbar.make(errorList, it!!.name, Snackbar.LENGTH_SHORT) + snackbar?.show() + }) + } + + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.main, menu) + return super.onCreateOptionsMenu(menu) + } + + override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) { + else -> super.onOptionsItemSelected(item) + } + + override fun onStart() { + super.onStart() + Logger.handler = handler + } + + override fun onStop() { + Logger.handler = null + super.onStop() + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt new file mode 100644 index 000000000..0a78026f8 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt @@ -0,0 +1,43 @@ +package de.kuschku.quasseldroid_ng.ui + +import android.arch.lifecycle.MutableLiveData +import android.content.ComponentName +import android.content.Intent +import android.content.ServiceConnection +import android.os.IBinder +import android.support.v7.app.AppCompatActivity +import de.kuschku.quasseldroid_ng.service.QuasselService +import de.kuschku.quasseldroid_ng.session.Backend + +abstract class ServiceBoundActivity : AppCompatActivity() { + protected val backend = MutableLiveData<Backend?>() + + private val connection = object : ServiceConnection { + override fun onServiceDisconnected(component: ComponentName?) { + when (component) { + ComponentName(application, QuasselService::class.java) -> { + backend.value = null + } + } + } + + override fun onServiceConnected(component: ComponentName?, binder: IBinder?) { + when (component) { + ComponentName(application, QuasselService::class.java) -> + if (binder is QuasselService.QuasselBinder) { + backend.value = binder.backend + } + } + } + } + + override fun onStart() { + bindService(Intent(this, QuasselService::class.java), connection, 0) + super.onStart() + } + + override fun onStop() { + super.onStop() + unbindService(connection) + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java deleted file mode 100644 index afb336b43..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ViewIntBinder.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui; - -import android.view.View; -import android.widget.TextView; - -import com.google.common.base.Function; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.observables.callbacks.GeneralCallback; -import de.kuschku.util.observables.lists.ObservableElement; - -public class ViewIntBinder { - private final ObservableElement<Integer> field; - private final Set<GeneralCallback<Integer>> callbacks = new HashSet<>(); - - public ViewIntBinder(ObservableElement<Integer> field) { - this.field = field; - } - - public void bindBackgroundColor(View v, Function<Integer, Integer> mapper) { - v.setBackgroundColor(mapper.apply(field.get())); - GeneralCallback<Integer> callback = object -> v.setBackgroundColor(mapper.apply(object)); - callbacks.add(callback); - field.addCallback(callback); - } - - public void bindTextColor(TextView v, Function<Integer, Integer> mapper) { - v.setTextColor(mapper.apply(field.get())); - GeneralCallback<Integer> callback = object -> v.setTextColor(mapper.apply(object)); - callbacks.add(callback); - field.addCallback(callback); - } - - public void unbind() { - field.removeCallbacks(); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java deleted file mode 100644 index 85fe0971c..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat; - -import android.content.res.Resources; -import android.database.DataSetObserver; -import android.support.annotation.Nullable; -import android.support.v7.view.ContextThemeWrapper; -import android.support.v7.widget.ThemedSpinnerAdapter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.observables.callbacks.GeneralCallback; - -public class BufferViewConfigSpinnerAdapter implements ThemedSpinnerAdapter, GeneralCallback<QBufferViewManager> { - private final QBufferViewManager bufferViewManager; - private final Set<DataSetObserver> observers = new HashSet<>(); - @Nullable - private Resources.Theme theme; - - public BufferViewConfigSpinnerAdapter(QBufferViewManager bufferViewManager) { - this.bufferViewManager = bufferViewManager; - this.bufferViewManager.addObserver(this); - } - - @Nullable - @Override - public Resources.Theme getDropDownViewTheme() { - return theme; - } - - @Override - public void setDropDownViewTheme(@Nullable Resources.Theme theme) { - this.theme = theme; - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(new ContextThemeWrapper(parent.getContext(), theme)); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - QBufferViewConfig config = (QBufferViewConfig) getItem(position); - view.setText(config == null ? "" : config.bufferViewName()); - return view; - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - observers.add(observer); - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - observers.remove(observer); - } - - @Override - public int getCount() { - return bufferViewManager.bufferViewConfigs().size(); - } - - @Override - public Object getItem(int position) { - if (position >= 0 && position < bufferViewManager.bufferViewConfigs().size()) - return bufferViewManager.bufferViewConfigs().get(position); - else - return null; - } - - @Override - public long getItemId(int position) { - QBufferViewConfig bufferViewConfig = (QBufferViewConfig) getItem(position); - if (bufferViewConfig != null) - return bufferViewConfig.bufferViewId(); - else - return -1; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - QBufferViewConfig viewConfig = (QBufferViewConfig) getItem(position); - view.setText(viewConfig == null ? "" : viewConfig.bufferViewName()); - return view; - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return getCount() == 0; - } - - @Override - public void notifyChanged(QBufferViewManager o) { - for (DataSetObserver observer : observers) { - observer.onChanged(); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java deleted file mode 100644 index 186efa71b..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat; - -import android.graphics.Typeface; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.AppCompatButton; -import android.support.v7.widget.Toolbar; -import android.text.method.LinkMovementMethod; -import android.util.Log; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.TextView; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; -import de.kuschku.util.irc.chanmodes.ChanMode; -import de.kuschku.util.irc.chanmodes.IrcModeProvider; -import de.kuschku.util.irc.format.IrcFormatHelper; -import de.kuschku.util.servicebound.BoundActivity; - -public class ChannelDetailActivity extends BoundActivity { - @Bind(R.id.topic) - TextView topic; - - @Bind(R.id.modes) - LinearLayout modes; - - @Bind(R.id.edit_topic) - AppCompatButton edit_topic; - - @Bind(R.id.toolbar) - Toolbar toolbar; - - private int buffer; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - buffer = getIntent().getIntExtra("buffer", -1); - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_channel_detail); - ButterKnife.bind(this); - } - - @Override - protected void onConnectToThread(@Nullable ClientBackgroundThread thread) { - super.onConnectToThread(thread); - - Client client = context.client(); - if (client == null) return; - - ChannelBuffer buffer = (ChannelBuffer) client.bufferManager().buffer(this.buffer); - if (buffer == null) return; - - QIrcChannel channel = buffer.getChannel(); - if (channel == null) return; - - if (channel.topic() == null) { - topic.setText(R.string.labelNoTopic); - topic.setTextColor(context.themeUtil().res.colorForegroundSecondary); - topic.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC)); - } else { - topic.setText(new IrcFormatHelper(context).formatIrcMessage(context.client(), channel.topic(), buffer.getInfo(), v -> finish())); - topic.setMovementMethod(LinkMovementMethod.getInstance()); - topic.setTextColor(context.themeUtil().res.colorForeground); - topic.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL)); - } - - toolbar.setTitle(channel.name()); - setSupportActionBar(toolbar); - - modes.removeAllViews(); - IrcModeProvider provider = channel.network().modeProvider(); - - String myModes = channel.userModes(channel.network().me()); - boolean isOp = false; - for (String c : channel.network().prefixModes()) { - if (!c.equalsIgnoreCase("v") && myModes.contains(c)) { - isOp = true; - break; - } - } - - boolean topicEditable = true; - for (char c : channel.modeList()) { - ChanMode mode = provider.modeFromChar(c); - QNetwork.ChannelModeType type = channel.network().channelModeType(c); - if (mode != null) { - if (type == QNetwork.ChannelModeType.A_CHANMODE) { - // TODO: Implement a proper display for these - } else if (type == QNetwork.ChannelModeType.B_CHANMODE || type == QNetwork.ChannelModeType.C_CHANMODE || type == QNetwork.ChannelModeType.D_CHANMODE) { - View v = getLayoutInflater().inflate(R.layout.widget_channel_mode, modes, false); - TextView name = (TextView) v.findViewById(R.id.name); - TextView description = (TextView) v.findViewById(R.id.description); - TextView value = (TextView) v.findViewById(R.id.value); - - String modeName = context.themeUtil().chanModes.chanModeToName(mode); - name.setText(String.format("%s (+%s)", modeName, c)); - - String modeDescription = context.themeUtil().chanModes.chanModeToDescription(mode); - description.setText(modeDescription); - - String modeValue = channel.modeValue(c); - - if (modeValue != null && !modeValue.isEmpty()) { - value.setText(modeValue); - value.setVisibility(View.VISIBLE); - } - - modes.addView(v); - - if (mode == ChanMode.RESTRICT_TOPIC) topicEditable = isOp; - } - } else { - Log.d("libquassel", "Couldn’t find mode " + c + " for IRCd" + provider.getClass().getSimpleName()); - } - } - - edit_topic.setVisibility(topicEditable ? View.VISIBLE : View.GONE); - - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java deleted file mode 100644 index 5089d088c..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java +++ /dev/null @@ -1,657 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat; - -import android.app.SearchManager; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.view.GravityCompat; -import android.support.v4.view.MenuItemCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.AppCompatEditText; -import android.support.v7.widget.AppCompatSpinner; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SearchView; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.widget.AdapterView; -import android.widget.Toast; - -import com.afollestad.materialdialogs.MaterialDialog; -import com.jakewharton.rxbinding.support.v7.widget.RxSearchView; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.events.BufferChangeEvent; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.events.CoreSetupRequiredEvent; -import de.kuschku.libquassel.events.GeneralErrorEvent; -import de.kuschku.libquassel.events.LoginRequireEvent; -import de.kuschku.libquassel.events.UnknownCertificateEvent; -import de.kuschku.libquassel.functions.types.HandshakeFunction; -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; -import de.kuschku.libquassel.localtypes.buffers.QueryBuffer; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.objects.types.CoreSetupData; -import de.kuschku.libquassel.objects.types.SetupData; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; -import de.kuschku.quasseldroid_ng.ui.chat.dialogs.CoreInfoDialogBuilder; -import de.kuschku.quasseldroid_ng.ui.chat.drawer.ActionModeHandler; -import de.kuschku.quasseldroid_ng.ui.chat.drawer.BufferViewConfigAdapter; -import de.kuschku.quasseldroid_ng.ui.chat.fragment.ChatFragment; -import de.kuschku.quasseldroid_ng.ui.chat.fragment.LoadingFragment; -import de.kuschku.quasseldroid_ng.ui.chat.nicklist.NickListAdapter; -import de.kuschku.quasseldroid_ng.ui.chat.util.Status; -import de.kuschku.quasseldroid_ng.ui.coresettings.aliases.AliasListActivity; -import de.kuschku.quasseldroid_ng.ui.coresettings.chatlist.ChatListListActivity; -import de.kuschku.quasseldroid_ng.ui.coresettings.identity.IdentityListActivity; -import de.kuschku.quasseldroid_ng.ui.coresettings.ignore.IgnoreListActivity; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.NetworkListActivity; -import de.kuschku.quasseldroid_ng.ui.settings.SettingsActivity; -import de.kuschku.quasseldroid_ng.ui.setup.CoreSetupActivity; -import de.kuschku.util.CompatibilityUtils; -import de.kuschku.util.accounts.Account; -import de.kuschku.util.accounts.AccountManager; -import de.kuschku.util.annotationbind.AutoBinder; -import de.kuschku.util.certificates.CertificateUtils; -import de.kuschku.util.certificates.SQLiteCertificateManager; -import de.kuschku.util.observables.callbacks.ElementCallback; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.DividerItemDecoration; -import de.kuschku.util.ui.MenuTint; -import rx.android.schedulers.AndroidSchedulers; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class MainActivity extends BoundActivity { - public static final int REQUEST_CODE_CORESETUP = 1; - /** - * This object encapsulates the current status of the activity – opened bufferview, for example - */ - private final Status status = new Status(); - - /** - * Host layout for content fragment, for example showing a loader or the chat - */ - @Bind(R.id.chatList) - RecyclerView chatList; - - @Bind(R.id.nickList) - RecyclerView nickList; - - @Bind(R.id.chatListSpinner) - AppCompatSpinner chatListSpinner; - - @Bind(R.id.chatListToolbar) - Toolbar chatListToolbar; - - @Nullable - @Bind(R.id.drawer_layout) - DrawerLayout drawerLayout; - - /** - * Main ActionBar - */ - @Bind(R.id.toolbar) - Toolbar toolbar; - - private AccountManager manager; - - private ToolbarWrapper toolbarWrapper; - - private BufferViewConfigAdapter chatListAdapter; - private Fragment currentFragment; - - private Bundle coreSetupResult; - private boolean coreSetupCancelled; - private CoreInfoDialogBuilder coreInfoDialogBuilder; - private NickListAdapter nickListAdapter; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - ButterKnife.bind(this); - toolbarWrapper = new ToolbarWrapper(toolbar); - toolbarWrapper.setOnClickListener(v -> { - if (context.client() != null) { - int id = context.client().backlogManager().open(); - Buffer buffer = context.client().bufferManager().buffer(id); - if (buffer instanceof ChannelBuffer) { - Intent intent = new Intent(this, ChannelDetailActivity.class); - intent.putExtra("buffer", id); - startActivity(intent); - } - } - }); - setSupportActionBar(toolbar); - chatListAdapter = BufferViewConfigAdapter.of(context); - chatListAdapter.setBufferClickListener(buffer -> { - if (context.client() != null) { - context.client().backlogManager().open(buffer.getInfo().id); - if (drawerLayout != null) - drawerLayout.closeDrawer(GravityCompat.START); - } - }); - chatListAdapter.setActionModeHandler(new ActionModeHandler(this, R.id.cab_stub)); - chatListAdapter.setRecyclerView(chatList); - chatList.setItemAnimator(new DefaultItemAnimator()); - chatList.setLayoutManager(new LinearLayoutManager(this)); - chatList.setAdapter(chatListAdapter); - - coreInfoDialogBuilder = new CoreInfoDialogBuilder(this); - - chatListToolbar.inflateMenu(R.menu.chatlist); - MenuTint.colorIcons(chatListToolbar.getMenu(), AutoBinder.obtainColor(R.attr.colorFill, chatListToolbar.getContext().getTheme())); - chatListToolbar.setOnMenuItemClickListener(item -> { - switch (item.getItemId()) { - case R.id.action_show_all: { - item.setChecked(chatListAdapter.toggleShowAll()); - } - break; - case R.id.action_manage_chat_lists: { - startActivity(new Intent(this, ChatListListActivity.class)); - } - } - return false; - }); - - DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); - if (drawerLayout != null) { - ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.material_drawer_open, R.string.material_drawer_close); - toggle.syncState(); - drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); - } - - replaceFragment(new LoadingFragment()); - - if (savedInstanceState != null) - status.onRestoreInstanceState(savedInstanceState); - - manager = new AccountManager(this); - - nickListAdapter = new NickListAdapter(context); - nickList.setAdapter(nickListAdapter); - nickList.setLayoutManager(new LinearLayoutManager(this)); - nickList.setItemAnimator(new DefaultItemAnimator()); - nickList.addItemDecoration(new DividerItemDecoration(this)); - - setStatusBar(); - } - - private void setStatusBar() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - Window window = getWindow(); - window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); - window.setStatusBarColor(getResources().getColor(android.R.color.transparent)); - - nickList.setPadding(0, CompatibilityUtils.getStatusBarHeight(this), 0, 0); - - View viewById = findViewById(R.id.statusBarBackground); - ViewGroup.LayoutParams layoutParams = viewById.getLayoutParams(); - layoutParams.height = CompatibilityUtils.getStatusBarHeight(this); - viewById.setLayoutParams(layoutParams); - } - } - - @Override - protected void onStop() { - super.onStop(); - if (context.client() != null) { - context.client().backlogManager().setOpen(-1); - context.client().backlogStorage().markBufferUnused(context.client().backlogManager().open()); - } - } - - @Override - protected void onStart() { - super.onStart(); - if (context.client() != null) - context.client().backlogManager().open(status.bufferId); - } - - private void replaceFragment(Fragment fragment) { - try { - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - this.currentFragment = fragment; - transaction.replace(R.id.content_host, fragment); - transaction.commit(); - } catch (IllegalStateException ignored) { - } - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - assertNotNull(outState); - - super.onSaveInstanceState(outState); - status.onSaveInstanceState(outState); - } - - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) { - assertNotNull(savedInstanceState); - - super.onRestoreInstanceState(savedInstanceState); - status.onRestoreInstanceState(savedInstanceState); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.chat, menu); - final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search)); - SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE); - searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); - RxSearchView.queryTextChanges(searchView) - .debounce(400, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(charSequence -> { - if (context.client() != null && context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) - context.client().backlogStorage().getFilter(context.client().backlogManager().open()).setQuery(charSequence); - }); - return super.onCreateOptionsMenu(menu); - } - - @Override - protected void onDestroy() { - chatListAdapter.selectConfig(-1); - toolbarWrapper.setOnClickListener(null); - chatListAdapter.setBufferClickListener(null); - chatListSpinner.setOnItemSelectedListener(null); - chatListToolbar.setOnMenuItemClickListener(null); - super.onDestroy(); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_hide_events: - displayFilterDialog(); - return true; - case R.id.action_reauth: - reauth(); - return true; - case R.id.action_settings: - startActivity(new Intent(this, SettingsActivity.class)); - return true; - case R.id.action_identities: - startActivity(new Intent(this, IdentityListActivity.class)); - return true; - case R.id.action_networks: - startActivity(new Intent(this, NetworkListActivity.class)); - return true; - case R.id.action_ignorelist: - startActivity(new Intent(this, IgnoreListActivity.class)); - return true; - case R.id.action_aliaslist: - startActivity(new Intent(this, AliasListActivity.class)); - return true; - case R.id.action_coreinfo: - if (context.client() != null && context.client().coreInfo() != null) - coreInfoDialogBuilder.build(manager.account(context.settings().preferenceLastAccount.get()), context.client().coreInfo(), context.client().certificateChain()).show(); - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private void reauth() { - context.settings().preferenceLastAccount.set(""); - stopConnection(); - finish(); - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(ConnectionChangeEvent event) { - onConnectionChange(event.status); - } - - public void onConnectionChange(ConnectionChangeEvent.Status status) { - if (status == ConnectionChangeEvent.Status.CONNECTED) { - replaceFragment(new ChatFragment()); - connected(); - } else if (status == ConnectionChangeEvent.Status.DISCONNECTED) { - Toast.makeText(getApplication(), context.themeUtil().translations.statusDisconnected, Toast.LENGTH_LONG).show(); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(GeneralErrorEvent event) { - Toast.makeText(getApplication(), event.exception.getClass().getSimpleName() + ": " + event.debugInfo, Toast.LENGTH_LONG).show(); - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(BufferChangeEvent event) { - Client client = context.client(); - if (client != null) { - QBacklogManager backlogManager = client.backlogManager(); - int id = backlogManager.open(); - status.bufferId = id; - updateBuffer(id); - chatListAdapter.setOpen(id); - } - } - - private void updateBuffer(int id) { - nickListAdapter.setChannel(null); - updateTitleAndSubtitle(id); - } - - private void updateTitleAndSubtitle(int id) { - Client client = context.client(); - if (client != null) { - Buffer buffer = client.bufferManager().buffer(id); - if (buffer != null) { - toolbarWrapper.setTitle(buffer.getName()); - if (buffer instanceof QueryBuffer) { - QIrcUser user = ((QueryBuffer) buffer).getUser(); - if (user == null) { - toolbarWrapper.setSubtitle(null); - } else { - toolbarWrapper.setSubtitle(user.realName()); - } - } else if (buffer instanceof ChannelBuffer) { - QIrcChannel channel = ((ChannelBuffer) buffer).getChannel(); - nickListAdapter.setChannel(channel); - if (channel == null) { - toolbarWrapper.setSubtitle(null); - } else { - toolbarWrapper.setSubtitle(context.deserializer().formatString(channel.topic())); - } - } else { - toolbarWrapper.setSubtitle(null); - } - } - } - } - - /* - private void updateBufferViewConfigs() { - assertNotNull(context.client().bufferViewManager()); - List<QBufferViewConfig> bufferViews = context.client().bufferViewManager().bufferViewConfigs(); - accountHeader.clear(); - for (QBufferViewConfig viewConfig : bufferViews) { - if (viewConfig != null) { - if (status.bufferViewConfigId == -1) { - status.bufferViewConfigId = viewConfig.bufferViewId(); - } - accountHeader.addProfiles( - new ProfileDrawerItem() - .withName(viewConfig.bufferViewName()) - .withIdentifier(viewConfig.bufferViewId()) - ); - } - } - accountHeader.setActiveProfile(status.bufferViewConfigId, true); - } - */ - - @Override - public void onBackPressed() { - if ((currentFragment instanceof ChatFragment && ((ChatFragment) currentFragment).onBackPressed())) { - return; - } - super.onBackPressed(); - } - - protected void reconnect() { - binder.stopBackgroundThread(); - connectToServer(manager.account(context.settings().preferenceLastAccount.get())); - } - - @Override - protected void onConnectToThread(@Nullable ClientBackgroundThread thread) { - super.onConnectToThread(thread); - if (thread == null) { - Account account = manager.account(context.settings().preferenceLastAccount.get()); - if (account != null) { - connectToServer(account); - } else { - setResult(RESULT_CANCELED); - finish(); - } - } - else { - if (context.client() != null && context.client().connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) { - connected(); - } - } - } - - private void connected() { - if (drawerLayout != null) - drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); - - context.client().bufferManager().bufferIds().addCallback(new ElementCallback<Integer>() { - @Override - public void notifyItemInserted(Integer element) { - - } - - @Override - public void notifyItemRemoved(Integer element) { - - } - - @Override - public void notifyItemChanged(Integer element) { - if (element == context.client().backlogManager().open()) - updateTitleAndSubtitle(element); - } - }); - context.client().backlogManager().open(status.bufferId); - if (context.client().bufferViewManager() != null) { - chatListSpinner.setAdapter(new BufferViewConfigSpinnerAdapter(context.client().bufferViewManager())); - chatListSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { - chatListAdapter.selectConfig((int) id); - status.bufferViewConfigId = (int) id; - } - - @Override - public void onNothingSelected(AdapterView<?> parent) { - chatListAdapter.selectConfig(-1); - } - }); - } - updateBuffer(context.client().backlogManager().open()); - chatListSpinner.setSelection(chatListAdapter.indexOf(status.bufferViewConfigId)); - } - - // FIXME: Fix this ugly hack - public void displayFilterDialog() { - if (context.client() != null) { - List<Integer> filterSettings = Arrays.asList( - Message.Type.Join.value, - Message.Type.Part.value, - Message.Type.Quit.value, - Message.Type.Nick.value, - Message.Type.Mode.value, - Message.Type.Topic.value - ); - int[] filterSettingsInts = new int[filterSettings.size()]; - for (int i = 0; i < filterSettingsInts.length; i++) { - filterSettingsInts[i] = filterSettings.get(i); - } - - int bufferId = context.client().backlogManager().open(); - int oldFilters = context.client().bufferSyncer().getFilters(bufferId); - List<Integer> oldFiltersList = new ArrayList<>(); - for (int type : filterSettings) { - if ((type & oldFilters) != 0) - oldFiltersList.add(filterSettings.indexOf(type)); - } - Integer[] selectedIndices = oldFiltersList.toArray(new Integer[oldFiltersList.size()]); - new MaterialDialog.Builder(this) - .items( - "Joins", - "Parts", - "Quits", - "Nick Changes", - "Mode Changes", - "Topic Changes" - ) - .itemsIds(filterSettingsInts) - .itemsCallbackMultiChoice( - selectedIndices, - (dialog, which, text) -> false - ) - .positiveText("Select") - .negativeText("Cancel") - .onPositive((dialog, which) -> { - int filters = 0x00000000; - if (dialog.getSelectedIndices() != null) - for (int i : dialog.getSelectedIndices()) { - int settingsid = filterSettings.get(i); - filters |= settingsid; - if (settingsid == Message.Type.Quit.value) - filters |= Message.Type.NetsplitQuit.value; - else if (settingsid == Message.Type.Join.value) - filters |= Message.Type.NetsplitJoin.value; - } - context.client().bufferSyncer().setFilters(bufferId, filters); - }) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColor(context.themeUtil().res.colorBackgroundCard) - .contentColor(context.themeUtil().res.colorForeground) - .build() - .show(); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case REQUEST_CODE_CORESETUP: { - if (resultCode == RESULT_OK) { - coreSetupResult = data.getExtras(); - } else { - coreSetupCancelled = true; - } - } - break; - } - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(@NonNull UnknownCertificateEvent event) { - new MaterialDialog.Builder(this) - .content(context.themeUtil().translations.warningCertificate + "\n" + CertificateUtils.certificateToFingerprint(event.certificate, "")) - .title("Unknown Certificate") - .onPositive((dialog, which) -> { - new SQLiteCertificateManager(this).addCertificate(event.certificate, event.address); - reconnect(); - }) - .negativeColor(context.themeUtil().res.colorForeground) - .positiveText("Yes") - .negativeText("No") - .backgroundColor(context.themeUtil().res.colorBackgroundCard) - .contentColor(context.themeUtil().res.colorForeground) - .build() - .show(); - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(CoreSetupRequiredEvent event) { - if (coreSetupCancelled) { - finish(); - } else if (coreSetupResult != null) { - context.provider().event.removeStickyEvent(CoreSetupRequiredEvent.class); - - Account account = manager.account(context.settings().preferenceLastAccount.get()); - Bundle config = coreSetupResult.getBundle("config"); - Map<String, QVariant> configData = new HashMap<>(); - for (String key : config.keySet()) { - configData.put(key, new QVariant<>(config.get(key))); - } - context.provider().dispatch(new HandshakeFunction(new CoreSetupData(new SetupData( - account.user, - account.pass, - coreSetupResult.getString("selectedBackend"), - configData - )))); - } else { - Intent intent = new Intent(getApplicationContext(), CoreSetupActivity.class); - intent.putExtra("storageBackends", context.client().core().getStorageBackendsAsBundle()); - startActivityForResult(intent, REQUEST_CODE_CORESETUP); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(LoginRequireEvent event) { - if (event.failedLast) { - new MaterialDialog.Builder(this) - .title(R.string.titleLogin) - .customView(R.layout.dialog_login, false) - .onPositive((dialog1, which) -> { - View parent = dialog1.getCustomView(); - assertNotNull(parent); - AppCompatEditText usernameField = (AppCompatEditText) parent.findViewById(R.id.username); - AppCompatEditText passwordField = (AppCompatEditText) parent.findViewById(R.id.password); - String username = usernameField.getText().toString(); - String password = passwordField.getText().toString(); - - Account account = manager.account(context.settings().preferenceLastAccount.get()); - manager.update(account.withLoginData(username, password)); - }) - .cancelListener(dialog1 -> finish()) - .negativeColor(context.themeUtil().res.colorForeground) - .positiveText(R.string.actionLogin) - .negativeText(R.string.actionCancel) - .backgroundColor(context.themeUtil().res.colorBackgroundCard) - .contentColor(context.themeUtil().res.colorForeground) - .build().show(); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarWrapper.java deleted file mode 100644 index 1ad1f2fdf..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ToolbarWrapper.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat; - -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.v7.widget.Toolbar; -import android.view.View; -import android.widget.TextView; - -import de.kuschku.quasseldroid_ng.R; - -public class ToolbarWrapper { - private final TextView title; - private final TextView subtitle; - private final View actionArea; - - public ToolbarWrapper(Toolbar toolbar) { - this.title = (TextView) toolbar.findViewById(R.id.toolbar_title); - this.subtitle = (TextView) toolbar.findViewById(R.id.toolbar_subtitle); - this.actionArea = toolbar.findViewById(R.id.toolbar_action_area); - } - - public void setTitle(@StringRes int id) { - title.setText(id); - } - - public void setTitle(@Nullable CharSequence text) { - title.setText(text); - } - - public void setSubtitle(@StringRes int id) { - subtitle.setText(id); - } - - public void setSubtitle(@Nullable CharSequence text) { - subtitle.setText(text); - subtitle.setVisibility(text == null ? View.GONE : View.VISIBLE); - } - - public void setOnClickListener(View.OnClickListener listener) { - actionArea.setOnClickListener(listener); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java deleted file mode 100644 index 028db19ee..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/ChatMessageRenderer.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.chatview; - -import android.support.annotation.LayoutRes; -import android.support.annotation.NonNull; -import android.support.annotation.UiThread; - -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.message.Message; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.irc.IrcUserUtils; -import de.kuschku.util.irc.format.IrcFormatHelper; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@UiThread -public class ChatMessageRenderer { - - @NonNull - private final AppContext context; - private IrcFormatHelper helper; - - public ChatMessageRenderer(@NonNull AppContext context) { - this.context = context; - setTheme(context); - } - - public void setTheme(@NonNull AppContext context) { - this.helper = new IrcFormatHelper(context); - } - - @NonNull - private CharSequence formatNick(@NonNull String hostmask, boolean full) { - CharSequence formattedNick = helper.formatUserNick(IrcUserUtils.getNick(hostmask)); - if (full) { - return context.themeUtil().translations.formatUsername(formattedNick, IrcUserUtils.getMask(hostmask)); - } else { - return formattedNick; - } - } - - @NonNull - private CharSequence formatNick(@NonNull String hostmask) { - return formatNick(hostmask, context.settings().preferenceHostmask.or(false)); - } - - @NonNull - private CharSequence getBufferName(@NonNull Message message) { - assertNotNull(context.client()); - Buffer buffer = context.client().bufferManager().buffer(message.bufferInfo.id); - assertNotNull(buffer); - String name = buffer.getName(); - assertNotNull(name); - return name; - } - - private void onBindPlain(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText( - context.themeUtil().translations.formatPlain( - formatNick(message.sender, false), - helper.formatIrcMessage(context.client(), message) - ) - ); - } - - private void onBindNotice(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(context.themeUtil().translations.formatAction( - formatNick(message.sender, false), - helper.formatIrcMessage(context.client(), message) - )); - } - - private void onBindAction(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText( - context.themeUtil().translations.formatAction( - formatNick(message.sender, false), - helper.formatIrcMessage(context.client(), message) - ) - ); - } - - private void onBindNick(@NonNull MessageViewHolder holder, @NonNull Message message) { - // FIXME: Ugly hack to get around the issue that quasselcore doesn’t set the Self flag - boolean self = message.flags.Self || message.sender.equals(message.content); - if (self) - holder.content.setText(context.themeUtil().translations.formatNick( - formatNick(message.sender, false) - )); - else - holder.content.setText(context.themeUtil().translations.formatNick( - formatNick(message.sender, false), - helper.formatUserNick(message.content) - )); - } - - // TODO: Replace this with better display of mode changes - private void onBindMode(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(context.themeUtil().translations.formatMode( - message.content, - formatNick(message.sender, false) - )); - } - - private void onBindJoin(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(context.themeUtil().translations.formatJoin( - formatNick(message.sender), - getBufferName(message) - )); - } - - private void onBindPart(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(context.themeUtil().translations.formatPart( - formatNick(message.sender), - getBufferName(message), - message.content - )); - } - - private void onBindQuit(@NonNull MessageViewHolder holder, @NonNull Message message) { - if (message.content == null || message.content.isEmpty()) - holder.content.setText(context.themeUtil().translations.formatQuit( - formatNick(message.sender) - )); - else - holder.content.setText(context.themeUtil().translations.formatQuit( - formatNick(message.sender), - message.content - )); - } - - private void onBindKick(@NonNull MessageViewHolder holder, @NonNull Message message) { - if (message.content.contains(" ")) - holder.content.setText(context.themeUtil().translations.formatKick( - formatNick(message.sender), - message.content.substring(0, message.content.indexOf(" ")), - getBufferName(message), - message.content.substring(message.content.indexOf(" ") + 1) - )); - else - holder.content.setText(context.themeUtil().translations.formatKick( - formatNick(message.sender), - message.content, - getBufferName(message) - )); - } - - private void onBindKill(@NonNull MessageViewHolder holder, @NonNull Message message) { - if (message.content.contains(" ")) - holder.content.setText(context.themeUtil().translations.formatKill( - formatNick(message.sender), - message.content.substring(0, message.content.indexOf(" ")), - message.content.substring(message.content.indexOf(" ") + 1) - )); - else - holder.content.setText(context.themeUtil().translations.formatKill( - formatNick(message.sender), - message.content - )); - } - - private void onBindServer(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(message.content); - } - - private void onBindInfo(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(message.content); - } - - private void onBindError(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(message.content); - } - - private void onBindDayChange(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(context.themeUtil().translations.formatDayChange( - context.themeUtil().formatter.getLongDateFormatter().print(message.time) - )); - } - - private void onBindTopic(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(message.content); - } - - private void onBindNetsplitJoin(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(message.toString()); - } - - private void onBindNetsplitQuit(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(message.toString()); - } - - private void onBindInvite(@NonNull MessageViewHolder holder, @NonNull Message message) { - holder.content.setText(message.toString()); - } - - public void onBind(@NonNull MessageViewHolder holder, @NonNull Message message) { - switch (message.type) { - case Plain: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindPlain(holder, message); - break; - case Notice: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindNotice(holder, message); - break; - case Action: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindAction(holder, message); - break; - case Nick: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindNick(holder, message); - break; - case Mode: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindMode(holder, message); - break; - case Join: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindJoin(holder, message); - break; - case Part: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindPart(holder, message); - break; - case Quit: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindQuit(holder, message); - break; - case Kick: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindKick(holder, message); - break; - case Kill: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindKill(holder, message); - break; - case Server: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindServer(holder, message); - break; - case Info: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindInfo(holder, message); - break; - case Error: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindError(holder, message); - break; - case DayChange: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindDayChange(holder, message); - break; - case Topic: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindTopic(holder, message); - break; - case NetsplitJoin: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindNetsplitJoin(holder, message); - break; - case NetsplitQuit: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindNetsplitQuit(holder, message); - break; - case Invite: - holder.time.setText(context.themeUtil().formatter.getTimeFormatter().print(message.time)); - onBindInvite(holder, message); - break; - case Markerline: - holder.itemView.setBackgroundResource(R.color.md_red_700); - break; - } - } - - public - @LayoutRes - int getLayoutRes(Message.Type type) { - switch (type) { - default: - case Plain: - return R.layout.widget_chatmessage_plain; - case Action: - return R.layout.widget_chatmessage_action; - case Nick: - case Notice: - case Mode: - case Join: - case Part: - case Quit: - case Kick: - case Kill: - case Server: - case Info: - case DayChange: - case Topic: - case NetsplitJoin: - case NetsplitQuit: - case Invite: - return R.layout.widget_chatmessage_server; - case Markerline: - return R.layout.widget_chatmessage_markerline; - case Error: - return R.layout.widget_chatmessage_error; - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java deleted file mode 100644 index f058cc4f3..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageAdapter.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.chatview; - -import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.UiThread; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import de.kuschku.libquassel.message.Message; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.observables.AutoScroller; -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; -import de.kuschku.util.observables.lists.IObservableList; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@UiThread -public class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> { - @NonNull - private final ChatMessageRenderer renderer; - @NonNull - private final LayoutInflater inflater; - @NonNull - private final UICallback callback; - @NonNull - private final AppContext context; - @Nullable - private IObservableList<UICallback, Message> messageList = null; - - public MessageAdapter(@NonNull Context ctx, @NonNull AppContext context, @Nullable AutoScroller scroller) { - this.context = context; - this.inflater = LayoutInflater.from(ctx); - this.renderer = new ChatMessageRenderer(context); - this.callback = new AdapterUICallbackWrapper(this, scroller); - } - - public void setMessageList(@Nullable AndroidObservableSortedList<Message> messageList) { - if (this.messageList != null) - this.messageList.removeCallback(callback); - this.messageList = messageList; - if (this.messageList != null) - this.messageList.addCallback(callback); - notifyDataSetChanged(); - } - - @NonNull - @Override - public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - boolean highlightFlag = viewType % 2 == 1; - Message.Type actualType = Message.Type.fromId(viewType >> 1); - return new MessageViewHolder(context, inflater.inflate(renderer.getLayoutRes(actualType), parent, false), highlightFlag); - } - - @Override - public void onBindViewHolder(@NonNull MessageViewHolder holder, int position) { - Message msg = getItem(position); - assertNotNull(msg); - - renderer.onBind(holder, msg); - } - - @Override - public int getItemViewType(int position) { - Message message = getItem(position); - Message.Type type = message.type; - int highlightFlag = message.flags.Highlight ? 1 : 0; - return type.value << 1 | highlightFlag; - } - - @Override - public int getItemCount() { - return messageList != null ? messageList.size() : 0; - } - - public Message getItem(int position) { - return messageList != null ? messageList.get(position) : null; - } - - @Override - public long getItemId(int position) { - return getItem(position).id; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageViewHolder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageViewHolder.java deleted file mode 100644 index 869b8858e..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/chatview/MessageViewHolder.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.chatview; - -import android.support.annotation.NonNull; -import android.support.annotation.UiThread; -import android.support.v7.widget.RecyclerView; -import android.text.method.LinkMovementMethod; -import android.view.View; -import android.widget.TextView; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; - -@UiThread -public class MessageViewHolder extends RecyclerView.ViewHolder { - @SuppressWarnings("NullableProblems") - @NonNull - @Bind(R.id.time) - TextView time; - - @SuppressWarnings("NullableProblems") - @NonNull - @Bind(R.id.content) - TextView content; - - public MessageViewHolder(@NonNull AppContext context, @NonNull View itemView, boolean highlightFlag) { - super(itemView); - ButterKnife.bind(this, itemView); - content.setMovementMethod(LinkMovementMethod.getInstance()); - - if (highlightFlag) { - itemView.setBackgroundColor(context.themeUtil().res.colorBackgroundHighlight); - content.setTextColor(context.themeUtil().res.colorForegroundHighlight); - time.setTextColor(context.themeUtil().res.colorForegroundHighlight); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/dialogs/CoreInfoDialogBuilder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/dialogs/CoreInfoDialogBuilder.java deleted file mode 100644 index 90d06a355..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/dialogs/CoreInfoDialogBuilder.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.dialogs; - -import android.content.Context; -import android.text.Html; -import android.text.format.DateUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.TextView; - -import com.afollestad.materialdialogs.MaterialDialog; - -import org.cryptacular.x509.dn.NameReader; -import org.cryptacular.x509.dn.StandardAttributeType; - -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateEncodingException; -import java.security.cert.X509Certificate; -import java.util.Locale; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.impl.CoreInfo; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.accounts.Account; -import de.kuschku.util.certificates.CertificateUtils; - -public class CoreInfoDialogBuilder { - private Context context; - - public CoreInfoDialogBuilder(Context context) { - this.context = context; - } - - public MaterialDialog build(Account account, CoreInfo coreInfo, X509Certificate[] certificateChain) { - View view = LayoutInflater.from(context).inflate(R.layout.dialog_coreinfo, null); - CoreInfoViewHolder holder = new CoreInfoViewHolder(view); - holder.bind(account, coreInfo, certificateChain); - - return new MaterialDialog.Builder(context) - .customView(view, true) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .positiveColorAttr(R.attr.colorAccent) - .positiveText(R.string.actionClose) - .build(); - } - - private String issuerCN(X509Certificate certificate) { - return new NameReader(certificate).readIssuer().getValue(StandardAttributeType.CommonName); - } - - class CoreInfoViewHolder { - @Bind(R.id.address) - TextView address; - - @Bind(R.id.verified) - TextView verified; - - @Bind(R.id.fingerprint) - TextView fingerprint; - - @Bind(R.id.coreVersion) - TextView coreVersion; - - @Bind(R.id.coreBuildDate) - TextView coreBuildDate; - - @Bind(R.id.uptime) - TextView uptime; - - @Bind(R.id.connected) - TextView connected; - - public CoreInfoViewHolder(View view) { - ButterKnife.bind(this, view); - } - - public void bind(Account account, CoreInfo coreInfo, X509Certificate[] certificateChain) { - address.setText(String.format(Locale.US, "%s:%d", account.host, account.port)); - if (certificateChain != null) { - verified.setText(context.getString(R.string.labelCoreVerifier, issuerCN(certificateChain[0]))); - try { - fingerprint.setText(CertificateUtils.certificateToFingerprint(certificateChain[0])); - } catch (NoSuchAlgorithmException | CertificateEncodingException e) { - fingerprint.setVisibility(View.GONE); - } - } - coreVersion.setText(Html.fromHtml(coreInfo.quasselVersion())); - coreBuildDate.setText(coreInfo.quasselBuildDate()); - uptime.setText(context.getString(R.string.labelCoreUptimeValue, DateUtils.getRelativeTimeSpanString(context, coreInfo.startTime().getMillis()))); - connected.setText(context.getString(R.string.labelCoreConnectedCientsValue, coreInfo.sessionConnectedClients())); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/ActionModeHandler.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/ActionModeHandler.java deleted file mode 100644 index a6db50475..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/ActionModeHandler.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.drawer; - -import android.support.annotation.IdRes; -import android.support.v7.app.AppCompatActivity; -import android.view.Menu; -import android.view.MenuItem; - -import com.afollestad.materialcab.MaterialCab; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.quasseldroid_ng.R; - -public class ActionModeHandler implements MaterialCab.Callback { - private final AppCompatActivity activity; - private final MaterialCab cab; - private final Set<Buffer> selectedChildren = new HashSet<>(); - private final Set<NetworkItem> selectedParents = new HashSet<>(); - private Menu actionModeMenu; - - public ActionModeHandler(AppCompatActivity activity, @IdRes int stub) { - this.activity = activity; - cab = new MaterialCab(activity, stub); - } - - public boolean isActive() { - return cab.isActive(); - } - - - public void start() { - //cab.start(this); - } - - public void toggle(Buffer buffer) { - /* - if (selectedChildren.contains(buffer)) - selectedChildren.remove(buffer); - else - selectedChildren.add(buffer); - - updateSelectionType(); - */ - } - - public void toggle(NetworkItem item) { - /* - if (selectedParents.contains(item)) - selectedParents.remove(item); - else - selectedParents.add(item); - - updateSelectionType(); - */ - } - - public boolean isChecked(Buffer buffer) { - return selectedChildren.contains(buffer); - } - - public boolean isChecked(NetworkItem network) { - return selectedParents.contains(network); - } - - private void updateSelectionType() { - if (actionModeMenu != null) { - actionModeMenu.setGroupVisible(R.id.context_group_buffer, !selectedChildren.isEmpty() && selectedParents.isEmpty()); - actionModeMenu.setGroupVisible(R.id.context_group_network, !selectedParents.isEmpty() && selectedChildren.isEmpty()); - } - } - - @Override - public boolean onCabCreated(MaterialCab cab, Menu menu) { - menu.clear(); - activity.getMenuInflater().inflate(R.menu.context_buffer_network, menu); - actionModeMenu = menu; - updateSelectionType(); - return true; - } - - @Override - public boolean onCabItemClicked(MenuItem item) { - return false; - } - - @Override - public boolean onCabFinished(MaterialCab cab) { - actionModeMenu = null; - selectedChildren.clear(); - selectedParents.clear(); - return true; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java deleted file mode 100644 index 873e36801..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.drawer; - -import android.os.Parcelable; -import android.support.annotation.Nullable; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import com.bignerdranch.expandablerecyclerview.Adapter.ExpandableRecyclerAdapter; -import com.bignerdranch.expandablerecyclerview.Model.ParentListItem; - -import java.lang.ref.WeakReference; -import java.util.Comparator; -import java.util.Map; -import java.util.WeakHashMap; - -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.observables.callbacks.ElementCallback; -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.lists.ObservableElement; -import de.kuschku.util.observables.lists.ObservableSortedList; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkViewHolder, BufferViewHolder> implements OnBufferClickListener, OnBufferLongClickListener { - private final AppContext context; - private final ObservableSortedList<NetworkItem> items; - private final Map<QNetwork, NetworkItem> itemMap = new WeakHashMap<>(); - private final Map<Integer, BufferViewHolder> bufferViewHolderMap = new WeakHashMap<>(); - private final ObservableElement<Boolean> showAll = new ObservableElement<>(false); - private QBufferViewConfig config; - private final ElementCallback<QNetwork> callback = new ElementCallback<QNetwork>() { - @Override - public void notifyItemInserted(QNetwork network) { - NetworkItem networkItem = new NetworkItem(context, config, network, BufferViewConfigAdapter.this); - itemMap.put(network, networkItem); - items.add(networkItem); - } - - @Override - public void notifyItemRemoved(QNetwork network) { - items.remove(itemMap.remove(network)); - } - - @Override - public void notifyItemChanged(QNetwork network) { - if (items.contains(itemMap.get(network))) - items.notifyItemChanged(itemMap.get(network)); - } - }; - private WeakReference<RecyclerView> recyclerView = new WeakReference<>(null); - private int open; - private OnBufferClickListener bufferClickListener; - private ActionModeHandler actionModeHandler; - - private BufferViewConfigAdapter(AppContext context, ObservableSortedList<NetworkItem> items) { - super(items); - this.context = context; - this.items = items; - items.addCallback(new UICallback() { - @Override - public void notifyItemInserted(int position) { - notifyParentItemInserted(position); - if (items.get(position).isInitiallyExpanded()) - expandParent(position); - else - collapseParent(position); - } - - @Override - public void notifyItemChanged(int position) { - notifyParentItemChanged(position); - if (items.get(position).isInitiallyExpanded()) - expandParent(position); - else - collapseParent(position); - } - - @Override - public void notifyItemRemoved(int position) { - notifyParentItemRemoved(position); - } - - @Override - public void notifyItemMoved(int from, int to) { - notifyParentItemRemoved(from); - notifyParentItemInserted(to); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - for (int i = position; i < position + count; i++) { - this.notifyItemInserted(i); - } - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - for (int i = position; i < position + count; i++) { - this.notifyItemChanged(i); - } - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - for (int i = position; i < position + count; i++) { - this.notifyItemRemoved(position); - } - } - }); - } - - public static BufferViewConfigAdapter of(AppContext context) { - final ObservableSortedList<NetworkItem> networkItems = new ObservableSortedList<>((Comparator<NetworkItem>) (o1, o2) -> { - assertNotNull(o1); - assertNotNull(o2); - - QNetwork network1 = o1.getNetwork(); - QNetwork network2 = o2.getNetwork(); - - if (network1 == null && network2 == null) { - return 0; - } else if (network1 == null) { - return 1; - } else if (network2 == null) { - return -1; - } else { - String name1 = network1.networkName(); - String name2 = network2.networkName(); - - if (name1 == null && name2 == null) { - return 0; - } else if (name1 == null) { - return 1; - } else if (name2 == null) { - return -1; - } else { - return name1.compareToIgnoreCase(name2); - } - } - }); - return new BufferViewConfigAdapter(context, networkItems); - } - - public void notifyChildItemInserted(NetworkItem parentItem, int childPosition) { - super.notifyChildItemInserted(items.indexOf(parentItem), childPosition); - } - - public void notifyChildItemRemoved(NetworkItem parentItem, int childPosition) { - super.notifyChildItemRemoved(items.indexOf(parentItem), childPosition); - } - - public void notifyChildItemChanged(NetworkItem parentItem, int childPosition) { - super.notifyChildItemChanged(items.indexOf(parentItem), childPosition); - } - - @Override - public NetworkViewHolder onCreateParentViewHolder(ViewGroup parentViewGroup) { - LayoutInflater inflater = LayoutInflater.from(parentViewGroup.getContext()); - return new NetworkViewHolder(inflater.inflate(NetworkViewHolder.layout(), parentViewGroup, false)); - } - - @Override - public BufferViewHolder onCreateChildViewHolder(ViewGroup childViewGroup) { - LayoutInflater inflater = LayoutInflater.from(childViewGroup.getContext()); - return new BufferViewHolder(context, inflater.inflate(BufferViewHolder.layout(), childViewGroup, false)); - } - - @Override - public void onBindParentViewHolder(NetworkViewHolder parentViewHolder, int position, ParentListItem parentListItem) { - parentViewHolder.bind(context, (NetworkItem) parentListItem); - } - - @Override - public void onBindChildViewHolder(BufferViewHolder childViewHolder, int position, Object childListItem) { - bufferViewHolderMap.remove(childViewHolder.id); - Buffer buffer = (Buffer) childListItem; - childViewHolder.bind(this, this, buffer); - bufferViewHolderMap.put(childViewHolder.id, childViewHolder); - childViewHolder.setSelected(context.client().backlogManager().open() == childViewHolder.id); - childViewHolder.setChecked(actionModeHandler.isChecked(buffer)); - } - - @Override - public void onClick(Buffer buffer) { - if (actionModeHandler.isActive()) { - actionModeHandler.toggle(buffer); - bufferViewHolderMap.get(buffer.getInfo().id).setChecked(actionModeHandler.isChecked(buffer)); - } else { - if (bufferClickListener != null) { - bufferClickListener.onClick(buffer); - } - } - } - - public void setBufferClickListener(OnBufferClickListener bufferClickListener) { - this.bufferClickListener = bufferClickListener; - } - - public void setRecyclerView(RecyclerView recyclerView) { - this.recyclerView = new WeakReference<>(recyclerView); - } - - public void selectConfig(int id) { - if (context.client() == null || context.client().bufferViewManager() == null) - return; - - QBufferViewConfig newconfig = context.client().bufferViewManager().bufferViewConfig(id); - Parcelable state = (newconfig == config) ? saveState() : null; - - if (config != null) - config.networkList().removeCallback(callback); - config = newconfig; - for (NetworkItem item : items) item.onDestroy(); - items.clear(); - itemMap.clear(); - if (config != null) { - for (QNetwork network : config.networkList()) { - NetworkItem networkItem = new NetworkItem(context, config, network, this); - itemMap.put(network, networkItem); - items.add(networkItem); - } - config.networkList().addCallback(callback); - } - - loadState(state); - } - - private void loadState(@Nullable Parcelable state) { - if (state != null) { - RecyclerView list = recyclerView.get(); - if (list != null) { - LinearLayoutManager layoutManager = (LinearLayoutManager) list.getLayoutManager(); - layoutManager.onRestoreInstanceState(state); - } - } - } - - @Nullable - private Parcelable saveState() { - RecyclerView list = recyclerView.get(); - if (list != null) { - LinearLayoutManager layoutManager = (LinearLayoutManager) list.getLayoutManager(); - return layoutManager.onSaveInstanceState(); - } else { - return null; - } - } - - public void setOpen(int id) { - BufferViewHolder old = bufferViewHolderMap.get(open); - if (old != null) old.setSelected(false); - else bufferViewHolderMap.remove(open); - BufferViewHolder now = bufferViewHolderMap.get(id); - if (now != null) now.setSelected(true); - else bufferViewHolderMap.remove(id); - open = id; - } - - public int indexOf(int bufferViewConfigId) { - for (int i = 0; i < context.client().bufferViewManager().bufferViewConfigs().size(); i++) { - if (context.client().bufferViewManager().bufferViewConfigs().get(i).bufferViewId() == bufferViewConfigId) - return i; - } - return -1; - } - - public ObservableElement<Boolean> showAll() { - return showAll; - } - - public boolean toggleShowAll() { - boolean before = showAll.get(); - showAll.set(!before); - return !before; - } - - @Override - public boolean onLongClick(Buffer buffer) { - if (!actionModeHandler.isActive()) - actionModeHandler.start(); - - actionModeHandler.toggle(buffer); - BufferViewHolder bufferViewHolder = bufferViewHolderMap.get(buffer.getInfo().id); - if (bufferViewHolder != null) - bufferViewHolder.setChecked(actionModeHandler.isChecked(buffer)); - return false; - } - - public void setActionModeHandler(ActionModeHandler actionModeHandler) { - this.actionModeHandler = actionModeHandler; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java deleted file mode 100644 index 0754e8593..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewHolder.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.drawer; - -import android.support.annotation.LayoutRes; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.view.View; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.bignerdranch.expandablerecyclerview.ViewHolder.ChildViewHolder; -import com.google.common.base.Function; - -import java.util.Locale; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer; -import de.kuschku.libquassel.localtypes.buffers.QueryBuffer; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.ViewIntBinder; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.observables.callbacks.GeneralCallback; -import de.kuschku.util.observables.lists.ObservableElement; - -public class BufferViewHolder extends ChildViewHolder { - - private final AppContext context; - public int id; - @Bind(R.id.material_drawer_icon) - ImageView icon; - @Bind(R.id.material_drawer_badge) - TextView badge; - @Bind(R.id.material_drawer_badge_container) - LinearLayout badgeContainer; - @Bind(R.id.material_drawer_name) - TextView name; - @Bind(R.id.material_drawer_description) - TextView description; - private ObservableElement<BufferInfo.BufferStatus> status; - private GeneralCallback<BufferInfo.BufferStatus> callback; - private ViewIntBinder viewIntBinder; - private boolean selected = false; - private boolean checked = false; - - public BufferViewHolder(AppContext context, View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - this.context = context; - } - - @LayoutRes - public static int layout() { - return R.layout.widget_buffer; - } - - public void bind(OnBufferClickListener listener, OnBufferLongClickListener longClickListener, Buffer buffer) { - if (status != null) - status.removeCallback(callback); - status = buffer.getStatus(); - name.setText(buffer.getName()); - if (viewIntBinder != null) viewIntBinder.unbind(); - viewIntBinder = new ViewIntBinder(context.client().bufferSyncer().activity(buffer.getInfo().id)); - viewIntBinder.bindTextColor(name, colorFromActivityStatus(buffer)); - setDescription(context.deserializer().formatString(getDescription(buffer))); - setBadge(0); - - itemView.setOnClickListener(v -> listener.onClick(buffer)); - itemView.setOnLongClickListener(v -> longClickListener.onLongClick(buffer)); - - id = buffer.getInfo().id; - - BufferInfo.Type type = buffer.getInfo().type; - setIcon(context, type, status); - callback = object -> setIcon(context, type, status); - status.addCallback(callback); - } - - @NonNull - private Function<Integer, Integer> colorFromActivityStatus(Buffer buffer) { - return activities -> { - int filters = context.client().bufferSyncer().getFilters(buffer.getInfo().id); - activities = activities & ~filters; - if (0 != ((activities & Message.Type.Plain.value) | (activities & Message.Type.Notice.value) | (activities & Message.Type.Action.value))) - return context.themeUtil().res.colorTintMessage; - if (0 != activities) - return context.themeUtil().res.colorTintActivity; - else - return context.themeUtil().res.colorForeground; - }; - } - - public boolean isSelected() { - return selected; - } - - public void setSelected(boolean selected) { - this.selected = selected; - updateSelectionState(); - } - - public boolean isChecked() { - return checked; - } - - public void setChecked(boolean checked) { - this.checked = checked; - updateSelectionState(); - } - - private void updateSelectionState() { - itemView.setSelected(selected || checked); - } - - private void setIcon(AppContext context, BufferInfo.Type type, ObservableElement<BufferInfo.BufferStatus> status) { - icon.setImageDrawable(context.themeUtil().statusDrawables.of(type, status.get())); - } - - private void setDescription(@Nullable CharSequence description) { - if (description == null || description.length() == 0) { - this.description.setText(null); - this.description.setVisibility(View.GONE); - } else { - this.description.setText(description); - this.description.setVisibility(View.VISIBLE); - } - } - - private void setBadge(int count) { - if (count == 0) { - badgeContainer.setVisibility(View.GONE); - badge.setText("0"); - } else { - badgeContainer.setVisibility(View.VISIBLE); - badge.setText(String.format(Locale.US, "%d", count)); - } - } - - @Nullable - private String getDescription(Buffer buffer) { - if (buffer instanceof ChannelBuffer) { - ChannelBuffer channelBuffer = (ChannelBuffer) buffer; - QIrcChannel channel = channelBuffer.getChannel(); - if (channel != null) { - return channel.topic(); - } - } else if (buffer instanceof QueryBuffer) { - QueryBuffer queryBuffer = (QueryBuffer) buffer; - QIrcUser user = queryBuffer.getUser(); - if (user != null) { - return user.realName(); - } - } - return null; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java deleted file mode 100644 index f539796d9..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.drawer; - -import com.bignerdranch.expandablerecyclerview.Model.ParentListItem; - -import java.util.Comparator; -import java.util.List; - -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.irc.IrcCaseMappers; -import de.kuschku.util.observables.callbacks.ElementCallback; -import de.kuschku.util.observables.callbacks.GeneralCallback; -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.lists.ObservableSet; -import de.kuschku.util.observables.lists.ObservableSortedList; - -public class NetworkItem implements ParentListItem { - private final AppContext context; - private final QBufferViewConfig config; - private final QNetwork network; - private final BufferViewConfigAdapter bufferViewConfigAdapter; - private final ObservableSortedList<Buffer> buffers = new ObservableSortedList<>(new Comparator<Buffer>() { - @Override - public int compare(Buffer o1, Buffer o2) { - if (o1.getInfo().type == o2.getInfo().type) { - IrcCaseMappers.IrcCaseMapper ircCaseMapper = network.caseMapper(); - return ircCaseMapper.toLowerCase(o1.getName()).compareTo(ircCaseMapper.toLowerCase(o2.getName())); - } else { - if (o1.getInfo().type == BufferInfo.Type.STATUS) - return -1; - else if (o2.getInfo().type == BufferInfo.Type.STATUS) - return 1; - else if (o1.getInfo().type == BufferInfo.Type.CHANNEL) - return -1; - else if (o2.getInfo().type == BufferInfo.Type.CHANNEL) - return 1; - else if (o1.getInfo().type == BufferInfo.Type.GROUP) - return -1; - else if (o2.getInfo().type == BufferInfo.Type.GROUP) - return 1; - else - return -1; - } - } - }); - private final ElementCallback<Integer> callback = new ElementCallback<Integer>() { - @Override - public void notifyItemInserted(Integer element) { - Buffer buffer = context.client().bufferManager().buffer(element); - if (buffer != null && buffer.getInfo().networkId == network.networkId()) { - buffers.add(buffer); - } - } - - @Override - public void notifyItemRemoved(Integer element) { - Buffer buffer = context.client().bufferManager().buffer(element); - if (buffer != null && buffer.getInfo().networkId == network.networkId()) { - buffers.remove(buffer); - } - } - - @Override - public void notifyItemChanged(Integer element) { - } - }; - private final UICallback callback1; - private final ElementCallback<Integer> callback2; - private final GeneralCallback<Boolean> booleanGeneralCallback; - private ObservableSet<Integer> backingSet; - - public NetworkItem(AppContext context, QBufferViewConfig config, QNetwork network, BufferViewConfigAdapter bufferViewConfigAdapter) { - this.context = context; - this.config = config; - this.network = network; - this.bufferViewConfigAdapter = bufferViewConfigAdapter; - booleanGeneralCallback = object -> setShowAll(object); - bufferViewConfigAdapter.showAll().addCallback(booleanGeneralCallback); - setShowAll(bufferViewConfigAdapter.showAll().get()); - callback1 = new UICallback() { - @Override - public void notifyItemInserted(int position) { - bufferViewConfigAdapter.notifyChildItemInserted(NetworkItem.this, position); - } - - @Override - public void notifyItemChanged(int position) { - bufferViewConfigAdapter.notifyChildItemChanged(NetworkItem.this, position); - } - - @Override - public void notifyItemRemoved(int position) { - bufferViewConfigAdapter.notifyChildItemRemoved(NetworkItem.this, position); - } - - @Override - public void notifyItemMoved(int from, int to) { - this.notifyItemRemoved(from); - this.notifyItemInserted(to); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - for (int i = position; i < position + count; i++) { - this.notifyItemInserted(i); - } - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - for (int i = position; i < position + count; i++) { - this.notifyItemChanged(i); - } - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - for (int i = position; i < position + count; i++) { - this.notifyItemRemoved(position); - } - } - }; - this.buffers.addCallback(callback1); - callback2 = new ElementCallback<Integer>() { - @Override - public void notifyItemInserted(Integer element) { - } - - @Override - public void notifyItemRemoved(Integer element) { - } - - @Override - public void notifyItemChanged(Integer element) { - Buffer buffer = NetworkItem.this.context.client().bufferManager().buffer(element); - if (buffer != null && buffer.getInfo().networkId == NetworkItem.this.network.networkId() && buffers.contains(buffer)) { - buffers.notifyItemChanged(buffer); - } - } - }; - context.client().bufferManager().bufferIds().addCallback(callback2); - } - - public void populateList(ObservableSet<Integer> backingSet) { - if (this.backingSet != null) - this.backingSet.removeCallback(callback); - buffers.clear(); - - backingSet.addCallback(callback); - for (int id : backingSet) { - Buffer buffer = context.client().bufferManager().buffer(id); - if (buffer != null && buffer.getInfo().networkId == network.networkId()) { - buffers.add(buffer); - } - } - this.backingSet = backingSet; - } - - public void setShowAll(boolean showAll) { - populateList(showAll ? config.allBufferIds() : config.bufferIds()); - } - - @Override - public List<?> getChildItemList() { - return buffers; - } - - @Override - public boolean isInitiallyExpanded() { - return network != null && network.isConnected(); - } - - public QNetwork getNetwork() { - return network; - } - - @Override - public String toString() { - return String.valueOf(network); - } - - public void onDestroy() { - this.backingSet.removeCallback(callback); - bufferViewConfigAdapter.showAll().removeCallback(booleanGeneralCallback); - this.buffers.removeCallback(callback1); - context.client().bufferManager().bufferIds().removeCallback(callback2); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkViewHolder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkViewHolder.java deleted file mode 100644 index d83248e20..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkViewHolder.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.drawer; - -import android.support.annotation.LayoutRes; -import android.view.View; -import android.widget.TextView; - -import com.bignerdranch.expandablerecyclerview.ViewHolder.ParentViewHolder; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; - -public class NetworkViewHolder extends ParentViewHolder { - - @Bind(R.id.material_drawer_name) - TextView name; - - public NetworkViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - } - - @LayoutRes - public static int layout() { - return R.layout.widget_drawer_network; - } - - public void bind(AppContext context, NetworkItem item) { - name.setText(item.getNetwork() == null ? "" : item.getNetwork().networkName()); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/OnBufferClickListener.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/OnBufferClickListener.java deleted file mode 100644 index c5d505cf1..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/OnBufferClickListener.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.drawer; - -import de.kuschku.libquassel.localtypes.buffers.Buffer; - -public interface OnBufferClickListener { - void onClick(Buffer buffer); -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/OnBufferLongClickListener.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/OnBufferLongClickListener.java deleted file mode 100644 index 559e9d97a..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/OnBufferLongClickListener.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.drawer; - -import de.kuschku.libquassel.localtypes.buffers.Buffer; - -public interface OnBufferLongClickListener { - boolean onLongClick(Buffer buffer); -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java deleted file mode 100644 index 1b8296dc4..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.fragment; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.sothree.slidinguppanel.SlidingUpPanelLayout; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.events.BacklogReceivedEvent; -import de.kuschku.libquassel.events.BufferChangeEvent; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; -import de.kuschku.quasseldroid_ng.ui.chat.chatview.MessageAdapter; -import de.kuschku.quasseldroid_ng.ui.chat.util.SlidingPanelHandler; -import de.kuschku.util.observables.AutoScroller; -import de.kuschku.util.observables.lists.AndroidObservableComparableSortedList; -import de.kuschku.util.servicebound.BoundFragment; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class ChatFragment extends BoundFragment { - /** - * The list containing the messages to be displayed - */ - @Bind(R.id.messages) - RecyclerView messages; - - @Bind(R.id.sliding_layout) - SlidingUpPanelLayout sliderMain; - - @Bind(R.id.scroll_down) - FloatingActionButton scrollDown; - - private MessageAdapter messageAdapter; - private SlidingPanelHandler slidingPanelHandler; - private boolean loading = false; - - private int recyclerViewMeasuredHeight = 0; - private RecyclerView.OnScrollListener listener; - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_chat, container, false); - ButterKnife.bind(this, view); - slidingPanelHandler = new SlidingPanelHandler(getActivity(), sliderMain, context); - - assertNotNull(messages); - - messages.setItemAnimator(new DefaultItemAnimator()); - messages.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, true)); - messageAdapter = new MessageAdapter(getActivity(), context, new AutoScroller(messages)); - messages.setAdapter(messageAdapter); - - scrollDown.hide(); - - listener = new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - if (!loading && !recyclerView.canScrollVertically(-1)) { - Client client = context.client(); - assertNotNull(client); - QBacklogManager backlogManager = client.backlogManager(); - assertNotNull(backlogManager); - backlogManager.requestMoreBacklog(client.backlogManager().open(), 20); - loading = true; - } - if (recyclerViewMeasuredHeight == 0) - recyclerViewMeasuredHeight = recyclerView.getMeasuredHeight(); - boolean canScrollDown = recyclerView.canScrollVertically(1); - boolean isScrollingDown = dy > 0; - int scrollOffsetFromBottom = recyclerView.computeVerticalScrollRange() - recyclerView.computeVerticalScrollOffset() - recyclerViewMeasuredHeight; - boolean isMoreThanOneScreenFromBottom = scrollOffsetFromBottom > recyclerViewMeasuredHeight; - boolean smartVisibility = scrollDown.getVisibility() == View.VISIBLE || isMoreThanOneScreenFromBottom; - setScrollDownVisibility(canScrollDown && isScrollingDown && smartVisibility); - } - - private void setScrollDownVisibility(boolean visible) { - if (visible) - scrollDown.show(); - else - scrollDown.hide(); - } - }; - messages.addOnScrollListener(listener); - - scrollDown.setOnClickListener(view1 -> messages.smoothScrollToPosition(0)); - - return view; - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(BufferChangeEvent event) { - setMarkerline(); - - Client client = context.client(); - if (client != null && client.connectionStatus() == ConnectionChangeEvent.Status.CONNECTED) { - QBacklogManager backlogManager = client.backlogManager(); - int id = backlogManager.open(); - AndroidObservableComparableSortedList<Message> messageList = backlogManager.filtered(id); - messageAdapter.setMessageList(messageList); - } - } - - @Override - public void onPause() { - setMarkerline(); - super.onPause(); - } - - @Override - public void onDestroy() { - messageAdapter.setMessageList(null); - messages.removeOnScrollListener(listener); - scrollDown.setOnClickListener(null); - slidingPanelHandler.onDestroy(); - super.onDestroy(); - } - - private void setMarkerline() { - //int lastVisibleMessageId; - //context.client().bufferSyncer().setMarkerLine(context.client().backlogManager().open(), lastVisibleMessageId); - } - - @Override - protected void onConnectToThread(@Nullable ClientBackgroundThread thread) { - super.onConnectToThread(thread); - onEventMainThread(new BufferChangeEvent()); - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(BacklogReceivedEvent event) { - Client client = context.client(); - if (client != null && client.backlogManager().open() == event.bufferId) { - loading = false; - } - } - - public boolean onBackPressed() { - if (sliderMain.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { - if (slidingPanelHandler.onBackPressed()) { - return true; - } else { - sliderMain.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); - return true; - } - } else { - return false; - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/LoadingFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/LoadingFragment.java deleted file mode 100644 index 41879e6a1..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/LoadingFragment.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.fragment; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ProgressBar; -import android.widget.TextView; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.Locale; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.events.BacklogInitEvent; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.events.InitEvent; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.servicebound.BoundFragment; - -public class LoadingFragment extends BoundFragment { - @Bind(R.id.progressBar) - ProgressBar progressBar; - - @Bind(R.id.label) - TextView label; - - @Bind(R.id.count) - TextView count; - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fragment_loading, container, false); - ButterKnife.bind(this, view); - - - label.setText(context.themeUtil().translations.statusConnecting); - showProgressState(1); - - return view; - } - - public void showProgressState(int position) { - count.setText(String.format(Locale.US, "%d/%d", position, 5)); - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(ConnectionChangeEvent event) { - progressBar.setIndeterminate(true); - - label.setText(context.themeUtil().statusName(event.status)); - showProgressState(event.status.ordinal() + 1); - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(InitEvent event) { - if (context.client().connectionStatus() == ConnectionChangeEvent.Status.INITIALIZING_DATA) { - progressBar.setIndeterminate(false); - progressBar.setMax(event.max); - progressBar.setProgress(event.loaded); - - label.setText(context.themeUtil().translations.statusInitData); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) - public void onEventMainThread(BacklogInitEvent event) { - if (context.client().connectionStatus() == ConnectionChangeEvent.Status.LOADING_BACKLOG) { - progressBar.setIndeterminate(false); - progressBar.setMax(event.max); - progressBar.setProgress(event.loaded); - - label.setText(context.themeUtil().translations.statusBacklog); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/nicklist/NickListAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/nicklist/NickListAdapter.java deleted file mode 100644 index f17b57e14..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/nicklist/NickListAdapter.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.nicklist; - -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.CompatibilityUtils; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; - -public class NickListAdapter extends RecyclerView.Adapter<NickListAdapter.NickViewHolder> { - public static final int TYPE_NORMAL = 0; - public static final int TYPE_AWAY = 1; - private final AppContext context; - private final AdapterUICallbackWrapper callback; - QIrcChannel channel; - - public NickListAdapter(AppContext context) { - this.context = context; - callback = new AdapterUICallbackWrapper(this); - } - - public void setChannel(QIrcChannel channel) { - if (this.channel != null) - this.channel.users().removeCallback(callback); - this.channel = channel; - if (this.channel != null) - this.channel.users().addCallback(callback); - notifyDataSetChanged(); - } - - @Override - public NickViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(getLayoutResource(viewType), parent, false); - return new NickViewHolder(view); - } - - public int getLayoutResource(int viewType) { - switch (viewType) { - default: - case TYPE_NORMAL: - return R.layout.widget_nick; - case TYPE_AWAY: - return R.layout.widget_nick_away; - } - } - - @Override - public void onBindViewHolder(NickViewHolder holder, int position) { - holder.bind(getItem(position)); - } - - @Override - public int getItemCount() { - return this.channel != null ? this.channel.users().size() : 0; - } - - public QIrcUser getItem(int position) { - return this.channel != null ? this.channel.network().ircUser(this.channel.users().get(position)) : null; - } - - @NonNull - public String getPrefixedFromMode(String text) { - StringBuilder builder = new StringBuilder(); - for (String s : CompatibilityUtils.partStringByChar(text)) { - builder.append(channel.network().modeToPrefix(s)); - } - return builder.toString(); - } - - @Override - public int getItemViewType(int position) { - return getItem(position).isAway() ? TYPE_AWAY : TYPE_NORMAL; - } - - class NickViewHolder extends RecyclerView.ViewHolder { - @Bind(R.id.mode) - TextView mode; - - @Bind(R.id.nick) - TextView nick; - - @Bind(R.id.realname) - TextView realname; - - public NickViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - } - - public void bind(QIrcUser qIrcUser) { - nick.setText(qIrcUser.nick()); - realname.setText(qIrcUser.realName()); - String text = channel.userModes(qIrcUser); - if (text.isEmpty()) { - mode.setVisibility(View.INVISIBLE); - mode.setText(null); - } else { - mode.setVisibility(View.VISIBLE); - String prefixes = getPrefixedFromMode(text); - mode.setBackground(context.themeUtil().res.badge(channel.network().lowestModeIndex(text))); - mode.setText(prefixes); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ScrollRefreshLayout.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ScrollRefreshLayout.java deleted file mode 100644 index cdaaf8338..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ScrollRefreshLayout.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.util; - -import android.content.Context; -import android.support.v4.widget.SwipeRefreshLayout; -import android.util.AttributeSet; - -public class ScrollRefreshLayout extends SwipeRefreshLayout { - public ScrollRefreshLayout(Context context) { - super(context); - } - - public ScrollRefreshLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ServiceHelper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ServiceHelper.java deleted file mode 100644 index d99a5174e..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/ServiceHelper.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.util; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; - -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.quasseldroid_ng.service.QuasselService; -import de.kuschku.quasseldroid_ng.ui.settings.Settings; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.quasseldroid_ng.ui.theme.AppTheme; -import de.kuschku.quasseldroid_ng.ui.theme.ThemeUtil; - -public class ServiceHelper { - private ServiceHelper() { - } - - /** - * Connects to an already running QuasselService - * - * @param context The context in which the service is running - * @param connection The connection to which it should be bound - */ - public static void connectToService(Context context, ServiceConnection connection) { - Intent intent = new Intent(context, QuasselService.class); - context.bindService(intent, connection, Context.BIND_IMPORTANT); - } - - /** - * Connects to an already running QuasselService - * - * @param context The context in which the service is running - * @param connection The connection which should be disconnected - */ - public static void disconnect(Context context, ServiceConnection connection) { - context.unbindService(connection); - } - - /** - * Starts a new QuasselService, if not yet running. - * - * @param context The context in which it should run - */ - public static void startServiceIfNotRunning(Context context) { - Intent intent = new Intent(context, QuasselService.class); - context.startService(intent); - } - - public static int initContext(AppContext context, Activity activity) { - context.setSettings(new Settings(activity)); - context.bufferDisplayTypes().add(QBufferViewConfig.DisplayType.ALWAYS); - return initTheme(context, activity); - } - - public static int initTheme(AppContext context, Activity activity) { - // Load Theme from Preferences - AppTheme theme = AppTheme.themeFromString(context.settings().preferenceTheme.get()); - activity.setTheme(theme.themeId); - context.setThemeUtil(new ThemeUtil(activity, theme)); - return theme.themeId; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java deleted file mode 100644 index 21e313ae2..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/SlidingPanelHandler.java +++ /dev/null @@ -1,360 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.util; - -import android.app.Activity; -import android.support.v7.widget.ActionMenuView; -import android.support.v7.widget.AppCompatEditText; -import android.support.v7.widget.AppCompatImageButton; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ScrollView; - -import com.mikepenz.fastadapter.FastAdapter; -import com.mikepenz.fastadapter.IItem; -import com.mikepenz.fastadapter.adapters.ItemAdapter; -import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; -import com.sothree.slidinguppanel.SlidingUpPanelLayout; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.editor.AdvancedEditor; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.quasseldroid_ng.ui.theme.ThemeUtil; -import de.kuschku.util.annotationbind.AutoBinder; -import de.kuschku.util.ui.MenuTint; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class SlidingPanelHandler { - // Main Sliding Layout - final SlidingUpPanelLayout slidingLayout; - private final Activity activity; - private final AppContext context; - private final AdvancedEditor editor; - // Input History - @Bind(R.id.sliding_layout_history) - SlidingUpPanelLayout slidingLayoutHistory; - @Bind(R.id.msg_history) - RecyclerView msgHistory; - - // Advanced Formatter - @Bind(R.id.formatting_menu) - ActionMenuView formattingMenu; - @Bind(R.id.formatting_toolbar) - Toolbar formattingToolbar; - - // Input Line - @Bind(R.id.chatline) - AppCompatEditText chatline; - @Bind(R.id.send) - AppCompatImageButton send; - @Bind(R.id.chatline_scroller) - ScrollView chatlineScroller; - private ItemAdapter<IItem> previousMessages; - - private boolean expanded; - - public SlidingPanelHandler(Activity activity, SlidingUpPanelLayout slidingLayout, AppContext context) { - this.slidingLayout = slidingLayout; - ButterKnife.bind(this, slidingLayout); - this.activity = activity; - this.context = context; - this.editor = new AdvancedEditor(context, chatline); - - setupFormattingMenu(activity); - - setupHistoryFakeData(); - - bindListener(); - - chatlineScroller.setOnTouchListener((v, event) -> { - chatlineScroller.requestDisallowInterceptTouchEvent(expanded); - return true; - }); - } - - private void setupFormattingMenu(Activity activity) { - activity.getMenuInflater().inflate(R.menu.formatting, formattingMenu.getMenu()); - - MenuTint.colorIcons(formattingMenu.getMenu(), AutoBinder.obtainColor(R.attr.colorFill, formattingToolbar.getContext().getTheme())); - - formattingMenu.setOnMenuItemClickListener(item -> { - switch (item.getItemId()) { - case R.id.format_bold: - editor.toggleBold(); - return true; - case R.id.format_italic: - editor.toggleItalic(); - return true; - case R.id.format_underline: - editor.toggleUnderline(); - return true; - case R.id.action_history: - openHistory(); - return true; - - case R.id.fill_clear: - editor.toggleBackground(-1); - return true; - case R.id.fill_mircColor0: - editor.toggleBackground(0x0); - return true; - case R.id.fill_mircColor1: - editor.toggleBackground(0x1); - return true; - case R.id.fill_mircColor2: - editor.toggleBackground(0x2); - return true; - case R.id.fill_mircColor3: - editor.toggleBackground(0x3); - return true; - case R.id.fill_mircColor4: - editor.toggleBackground(0x4); - return true; - case R.id.fill_mircColor5: - editor.toggleBackground(0x5); - return true; - case R.id.fill_mircColor6: - editor.toggleBackground(0x6); - return true; - case R.id.fill_mircColor7: - editor.toggleBackground(0x7); - return true; - case R.id.fill_mircColor8: - editor.toggleBackground(0x8); - return true; - case R.id.fill_mircColor9: - editor.toggleBackground(0x9); - return true; - case R.id.fill_mircColorA: - editor.toggleBackground(0xA); - return true; - case R.id.fill_mircColorB: - editor.toggleBackground(0xB); - return true; - case R.id.fill_mircColorC: - editor.toggleBackground(0xC); - return true; - case R.id.fill_mircColorD: - editor.toggleBackground(0xD); - return true; - case R.id.fill_mircColorE: - editor.toggleBackground(0xE); - return true; - case R.id.fill_mircColorF: - editor.toggleBackground(0xF); - return true; - - case R.id.paint_clear: - editor.toggleForeground(-1); - return true; - case R.id.paint_mircColor0: - editor.toggleForeground(0x0); - return true; - case R.id.paint_mircColor1: - editor.toggleForeground(0x1); - return true; - case R.id.paint_mircColor2: - editor.toggleForeground(0x2); - return true; - case R.id.paint_mircColor3: - editor.toggleForeground(0x3); - return true; - case R.id.paint_mircColor4: - editor.toggleForeground(0x4); - return true; - case R.id.paint_mircColor5: - editor.toggleForeground(0x5); - return true; - case R.id.paint_mircColor6: - editor.toggleForeground(0x6); - return true; - case R.id.paint_mircColor7: - editor.toggleForeground(0x7); - return true; - case R.id.paint_mircColor8: - editor.toggleForeground(0x8); - return true; - case R.id.paint_mircColor9: - editor.toggleForeground(0x9); - return true; - case R.id.paint_mircColorA: - editor.toggleForeground(0xA); - return true; - case R.id.paint_mircColorB: - editor.toggleForeground(0xB); - return true; - case R.id.paint_mircColorC: - editor.toggleForeground(0xC); - return true; - case R.id.paint_mircColorD: - editor.toggleForeground(0xD); - return true; - case R.id.paint_mircColorE: - editor.toggleForeground(0xE); - return true; - case R.id.paint_mircColorF: - editor.toggleForeground(0xF); - return true; - - default: - return false; - } - }); - } - - public void setFormattingEnabled(boolean formattingEnabled) { - Menu menu = formattingMenu.getMenu(); - MenuItem[] items = new MenuItem[]{ - menu.findItem(R.id.format_bold), - menu.findItem(R.id.format_italic), - menu.findItem(R.id.format_underline), - menu.findItem(R.id.format_paint), - menu.findItem(R.id.format_fill) - }; - - for (MenuItem item : items) { - if (item != null) - item.setEnabled(!formattingEnabled); - } - } - - private void setChatlineExpanded(boolean expanded) { - assertNotNull(chatline); - assertNotNull(chatline.getLayoutParams()); - - ThemeUtil themeUtil = context.themeUtil(); - assertNotNull(themeUtil); - - int selectionStart = chatline.getSelectionStart(); - int selectionEnd = chatline.getSelectionEnd(); - - if (expanded) { - chatline.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; - } else { - chatline.getLayoutParams().height = themeUtil.res.actionBarSize; - } - chatline.setSingleLine(!expanded); - this.expanded = expanded; - chatlineScroller.setSmoothScrollingEnabled(false); - - chatline.setSelection(selectionStart, selectionEnd); - } - - private void bindListener() { - slidingLayout.setAntiDragView(R.id.card_panel); - slidingLayout.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { - @Override - public void onPanelSlide(View panel, float slideOffset) { - - } - - @Override - public void onPanelCollapsed(View panel) { - setChatlineExpanded(false); - } - - @Override - public void onPanelExpanded(View panel) { - setChatlineExpanded(true); - } - - @Override - public void onPanelAnchored(View panel) { - - } - - @Override - public void onPanelHidden(View panel) { - - } - }); - setChatlineExpanded(slidingLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED); - - send.setOnClickListener(v -> sendInput()); - chatline.setOnKeyListener((v, keyCode, event) -> { - if (event.getAction() == KeyEvent.ACTION_DOWN && (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER)) { - sendInput(); - return true; - } - - // Always return false to make sure we don’t lose focus - return false; - }); - } - - private void sendInput() { - if (context.client() == null) return; - - int bufferId = context.client().backlogManager().open(); - - if (bufferId >= 0) { - Buffer buffer = context.client().bufferManager().buffer(bufferId); - assertNotNull(buffer); - - String text = editor.toFormatString(); - context.client().sendInput(buffer.getInfo(), text); - chatline.setText(""); - chatline.requestFocus(); - previousMessages.add(new PrimaryDrawerItem().withName(text)); - } - } - - private void setupHistoryFakeData() { - FastAdapter<IItem> fastAdapter = new FastAdapter<>(); - previousMessages = new ItemAdapter<>(); - previousMessages.wrap(fastAdapter); - msgHistory.setAdapter(fastAdapter); - msgHistory.setLayoutManager(new LinearLayoutManager(activity)); - msgHistory.setItemAnimator(new DefaultItemAnimator()); - } - - private void openHistory() { - slidingLayoutHistory.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED); - } - - public boolean onBackPressed() { - if (slidingLayoutHistory.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { - slidingLayoutHistory.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); - return true; - } else { - return false; - } - } - - public void onDestroy() { - chatline.setOnKeyListener(null); - send.setOnClickListener(null); - slidingLayout.setPanelSlideListener(null); - formattingMenu.setOnMenuItemClickListener(null); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/Status.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/Status.java deleted file mode 100644 index 42171c08e..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/util/Status.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.chat.util; - -import de.kuschku.util.instancestateutil.Storable; -import de.kuschku.util.instancestateutil.Store; - -public class Status extends Storable { - @Store - public int bufferViewConfigId = -1; - @Store - public int bufferId = -1; -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/AliasEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/AliasEditActivity.java deleted file mode 100644 index 981c7db50..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/AliasEditActivity.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.aliases; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.EditText; - -import com.afollestad.materialdialogs.MaterialDialog; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.impl.AliasManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.aliases.helper.AliasSerializerHelper; -import de.kuschku.util.servicebound.BoundActivity; - -public class AliasEditActivity extends BoundActivity { - public static final int RESULT_DELETE = -2; - - @Bind(R.id.toolbar) - Toolbar toolbar; - - @Bind(R.id.name) - EditText name; - - @Bind(R.id.expansion) - EditText expansion; - - private AliasManager.Alias item; - private Bundle original; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_alias_edit); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - Intent intent = getIntent(); - if (intent != null) { - original = intent.getBundleExtra("alias"); - if (original != null) { - item = AliasSerializerHelper.deserialize(original); - - name.setText(item.name); - expansion.setText(item.expansion.replaceAll("; ?", "\n")); - } - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - if (original != null) { - getMenuInflater().inflate(R.menu.confirm_delete, menu); - } else { - getMenuInflater().inflate(R.menu.confirm, menu); - } - return super.onCreateOptionsMenu(menu); - } - - @Override - public void onBackPressed() { - if (hasChanged(build())) { - new MaterialDialog.Builder(this) - .content(R.string.confirmationUnsavedChanges) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - save(); - super.onBackPressed(); - }) - .onNegative((dialog, which) -> super.onBackPressed()) - .show(); - } else { - super.onBackPressed(); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - case R.id.action_delete: { - new MaterialDialog.Builder(this) - .content(getString(R.string.confirmationDelete, this.item.name)) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - delete(); - finish(); - }) - .build() - .show(); - } - return true; - case R.id.action_confirm: { - save(); - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private void delete() { - Intent intent = new Intent(); - intent.putExtra("original", original.getString("name")); - setResult(RESULT_DELETE, intent); - } - - private void save() { - Intent intent = new Intent(); - if (original != null) - intent.putExtra("original", original.getString("name")); - intent.putExtra("alias", build()); - setResult(RESULT_OK, intent); - } - - private boolean hasChanged(Bundle bundle) { - return this.original != null && bundle != null && !this.original.equals(bundle); - } - - private Bundle build() { - Bundle bundle = new Bundle(); - bundle.putString("name", name.getText().toString()); - bundle.putString("expansion", expansion.getText().toString().replace("\n", "; ")); - return bundle; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/AliasListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/AliasListActivity.java deleted file mode 100644 index 2c6b19144..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/AliasListActivity.java +++ /dev/null @@ -1,168 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.aliases; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.impl.AliasManager; -import de.kuschku.libquassel.syncables.types.interfaces.QAliasManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.aliases.helper.AliasSerializerHelper; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.DividerItemDecoration; - -public class AliasListActivity extends BoundActivity { - final OnAliasClickListener clickListener = alias -> { - if (alias != null) { - Intent intent = new Intent(this, AliasEditActivity.class); - intent.putExtra("alias", AliasSerializerHelper.serialize(alias)); - startActivityForResult(intent, 0, null); - } - }; - - @Bind(R.id.list) - RecyclerView list; - @Bind(R.id.add) - FloatingActionButton add; - @Bind(R.id.toolbar) - Toolbar toolbar; - AliasAdapter adapter; - private QAliasManager manager; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_network_list); - ButterKnife.bind(this); - - list.setLayoutManager(new LinearLayoutManager(this)); - list.setItemAnimator(new DefaultItemAnimator()); - list.addItemDecoration(new DividerItemDecoration(this)); - adapter = new AliasAdapter(); - list.setAdapter(adapter); - - add.setOnClickListener(view -> startActivityForResult(new Intent(this, AliasEditActivity.class), 0, null)); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - protected void onConnected() { - manager = context.client().aliasManager(); - adapter.setManager(manager); - } - - @Override - protected void onDisconnected() { - manager = null; - adapter.setManager(null); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (data != null) { - if (resultCode == RESULT_OK) { - AliasManager.Alias item = AliasSerializerHelper.deserialize(data.getBundleExtra("alias")); - if (data.getStringExtra("original") != null) - manager._removeAlias(manager.alias(data.getStringExtra("original"))); - manager._addAlias(item); - manager.requestUpdate(); - } else if (resultCode == AliasEditActivity.RESULT_DELETE) { - manager._removeAlias(manager.alias(data.getStringExtra("original"))); - manager.requestUpdate(); - } - } - } - - interface OnAliasClickListener { - void onClick(AliasManager.Alias network); - } - - private class AliasAdapter extends RecyclerView.Adapter<AliasViewHolder> { - final AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this); - QAliasManager manager; - - public void setManager(QAliasManager manager) { - if (this.manager != null) - this.manager.aliases().addCallback(wrapper); - - this.manager = manager; - - if (this.manager != null) - this.manager.aliases().addCallback(wrapper); - } - - @Override - public AliasViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(R.layout.widget_settings_alias, parent, false); - return new AliasViewHolder(view); - } - - @Override - public void onBindViewHolder(AliasViewHolder holder, int position) { - holder.bind(manager != null ? manager.aliases().get(position) : null); - } - - @Override - public int getItemCount() { - return manager == null ? 0 : manager.aliases().size(); - } - } - - class AliasViewHolder extends RecyclerView.ViewHolder { - @Bind(R.id.alias_name) - TextView name; - - @Bind(R.id.alias_description) - TextView description; - - private AliasManager.Alias alias; - - public AliasViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(view -> clickListener.onClick(alias)); - } - - public void bind(AliasManager.Alias alias) { - this.alias = alias; - name.setText(alias == null ? "" : alias.name); - description.setText(alias == null ? "" : alias.expansion); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/helper/AliasSerializerHelper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/helper/AliasSerializerHelper.java deleted file mode 100644 index e5ba9919a..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/aliases/helper/AliasSerializerHelper.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.aliases.helper; - -import android.os.Bundle; - -import de.kuschku.libquassel.syncables.types.impl.AliasManager; - -public class AliasSerializerHelper { - private AliasSerializerHelper() { - } - - public static Bundle serialize(AliasManager.Alias alias) { - Bundle bundle = new Bundle(); - bundle.putString("name", alias.name); - bundle.putString("expansion", alias.expansion); - return bundle; - } - - public static AliasManager.Alias deserialize(Bundle bundle) { - return new AliasManager.Alias( - bundle.getString("name"), - bundle.getString("expansion") - ); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java deleted file mode 100644 index d3a1bd65f..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.chatlist; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Spinner; - -import java.util.Collections; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.impl.BufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.NetworkSpinnerAdapter; -import de.kuschku.util.servicebound.BoundActivity; - -public class ChatListCreateActivity extends BoundActivity { - - @Bind(R.id.toolbar) - Toolbar toolbar; - - @Bind(R.id.name) - EditText name; - - @Bind(R.id.network) - Spinner network; - - @Bind(R.id.showChannels) - CheckBox showChannels; - - @Bind(R.id.showQueries) - CheckBox showQueries; - - @Bind(R.id.hideInactiveChats) - CheckBox hideInactiveChats; - - @Bind(R.id.hideInactiveNetworks) - CheckBox hideInactiveNetworks; - - @Bind(R.id.addAutomatically) - CheckBox addAutomatically; - - @Bind(R.id.sortAlphabetically) - CheckBox sortAlphabetically; - - @Bind(R.id.minimumActivity) - Spinner minimumActivity; - - private QBufferViewManager bufferViewManager; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_chatlist_edit); - ButterKnife.bind(this); - - network.setAdapter(new NetworkSpinnerAdapter(this)); - - minimumActivity.setAdapter(new MinimumActivityAdapter(context)); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - initializeDefaults(); - } - - private void initializeDefaults() { - - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.confirm, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_confirm: { - if (bufferViewManager != null) { - QBufferViewConfig config = new BufferViewConfig( - "", - Collections.<Integer>emptyList(), - false, - Collections.<Integer>emptyList(), - 15, - true, - false, - true, - 0, - QBufferViewConfig.MinimumActivity.NONE, - false, - Collections.<Integer>emptyList() - ); - - config._setBufferViewName(this.name.getText().toString()); - config.setBufferTypeAllowed(BufferInfo.Type.CHANNEL, this.showChannels.isChecked()); - config.setBufferTypeAllowed(BufferInfo.Type.QUERY, this.showQueries.isChecked()); - config._setHideInactiveBuffers(this.hideInactiveChats.isChecked()); - config._setHideInactiveNetworks(this.hideInactiveNetworks.isChecked()); - config._setAddNewBuffersAutomatically(this.addAutomatically.isChecked()); - config._setSortAlphabetically(this.sortAlphabetically.isChecked()); - config._setNetworkId((int) network.getSelectedItemId()); - config._setMinimumActivity(QBufferViewConfig.MinimumActivity.fromId((int) minimumActivity.getSelectedItemId())); - - bufferViewManager.createBufferView(config); - } - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - protected void onConnected() { - bufferViewManager = context.client().bufferViewManager(); - } - - @Override - protected void onDisconnected() { - bufferViewManager = null; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListEditActivity.java deleted file mode 100644 index 57d169705..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListEditActivity.java +++ /dev/null @@ -1,253 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.chatlist; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Spinner; - -import com.afollestad.materialdialogs.MaterialDialog; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.NetworkSpinnerAdapter; -import de.kuschku.util.backports.Objects; -import de.kuschku.util.servicebound.BoundActivity; - -public class ChatListEditActivity extends BoundActivity { - - @Bind(R.id.toolbar) - Toolbar toolbar; - - @Bind(R.id.name) - EditText name; - - @Bind(R.id.network) - Spinner network; - - @Bind(R.id.showChannels) - CheckBox showChannels; - - @Bind(R.id.showQueries) - CheckBox showQueries; - - @Bind(R.id.hideInactiveChats) - CheckBox hideInactiveChats; - - @Bind(R.id.hideInactiveNetworks) - CheckBox hideInactiveNetworks; - - @Bind(R.id.addAutomatically) - CheckBox addAutomatically; - - @Bind(R.id.sortAlphabetically) - CheckBox sortAlphabetically; - - @Bind(R.id.minimumActivity) - Spinner minimumActivity; - - private int id; - private QBufferViewConfig config; - private NetworkSpinnerAdapter networkSpinnerAdapter; - private MinimumActivityAdapter minimumActivityAdapter; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent intent = getIntent(); - if (intent == null) { - finish(); - return; - } - - id = intent.getIntExtra("id", -1); - - setContentView(R.layout.activity_chatlist_edit); - ButterKnife.bind(this); - - networkSpinnerAdapter = new NetworkSpinnerAdapter(this); - network.setAdapter(networkSpinnerAdapter); - - minimumActivityAdapter = new MinimumActivityAdapter(context); - minimumActivity.setAdapter(minimumActivityAdapter); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.confirm_delete, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public void onBackPressed() { - if (hasChanged()) { - new MaterialDialog.Builder(this) - .content(R.string.confirmationUnsavedChanges) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - save(); - super.onBackPressed(); - }) - .onNegative((dialog, which) -> super.onBackPressed()) - .show(); - } else { - super.onBackPressed(); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - case R.id.action_delete: { - new MaterialDialog.Builder(this) - .content(getString(R.string.confirmationDelete, config.bufferViewName())) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - finish(); - context.client().bufferViewManager().deleteBufferView(config.bufferViewId()); - }) - .build() - .show(); - } - return true; - case R.id.action_confirm: { - save(); - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private void save() { - if (config != null) { - String name = this.name.getText().toString(); - if (!Objects.equals(name, config.bufferViewName())) - config.setBufferViewName(name); - - if (config.networkId() != (int) network.getSelectedItemId()) - config.setNetworkId((int) network.getSelectedItemId()); - - if (config.minimumActivity() != QBufferViewConfig.MinimumActivity.fromId((int) minimumActivity.getSelectedItemId())) - config.setMinimumActivity(QBufferViewConfig.MinimumActivity.fromId((int) minimumActivity.getSelectedItemId())); - - int allowedBufferTypes = config.allowedBufferTypes(); - config.setBufferTypeAllowed(BufferInfo.Type.CHANNEL, this.showChannels.isChecked()); - config.setBufferTypeAllowed(BufferInfo.Type.QUERY, this.showQueries.isChecked()); - if (config.allowedBufferTypes() != allowedBufferTypes) - config.setAllowedBufferTypes(allowedBufferTypes); - - boolean hideInactiveChats = this.hideInactiveChats.isChecked(); - if (hideInactiveChats != config.hideInactiveBuffers()) - config.setHideInactiveBuffers(hideInactiveChats); - - boolean hideInactiveNetworks = this.hideInactiveNetworks.isChecked(); - if (hideInactiveNetworks != config.hideInactiveNetworks()) - config.setHideInactiveNetworks(hideInactiveNetworks); - - boolean addAutomatically = this.addAutomatically.isChecked(); - if (addAutomatically != config.addNewBuffersAutomatically()) - config.setAddNewBuffersAutomatically(addAutomatically); - - boolean sortAlphabetically = this.sortAlphabetically.isChecked(); - if (sortAlphabetically != config.sortAlphabetically()) - config.setSortAlphabetically(sortAlphabetically); - } - } - - private boolean hasChanged() { - return !Objects.equals(name.getText().toString(), config.bufferViewName()) || - config.networkId() != (int) network.getSelectedItemId() || - config.minimumActivity() != QBufferViewConfig.MinimumActivity.fromId((int) minimumActivity.getSelectedItemId()) || - config.isBufferTypeAllowed(BufferInfo.Type.CHANNEL) != this.showChannels.isChecked() || - config.isBufferTypeAllowed(BufferInfo.Type.QUERY) != this.showQueries.isChecked() || - this.hideInactiveChats.isChecked() != config.hideInactiveBuffers() || - this.hideInactiveNetworks.isChecked() != config.hideInactiveNetworks() || - this.addAutomatically.isChecked() != config.addNewBuffersAutomatically() || - this.sortAlphabetically.isChecked() != config.sortAlphabetically(); - } - - @Override - protected void onConnected() { - networkSpinnerAdapter.setNetworkManager(context.client().networkManager()); - setConfig(context.client().bufferViewManager().bufferViewConfig(id)); - } - - private void setConfig(QBufferViewConfig config) { - this.config = config; - - if (config != null) { - name.setText(config.bufferViewName()); - network.setSelection(getSelectedNetworkIndex(config)); - showChannels.setChecked(config.isBufferTypeAllowed(BufferInfo.Type.CHANNEL)); - showQueries.setChecked(config.isBufferTypeAllowed(BufferInfo.Type.QUERY)); - hideInactiveChats.setChecked(config.hideInactiveBuffers()); - hideInactiveNetworks.setChecked(config.hideInactiveNetworks()); - addAutomatically.setChecked(config.addNewBuffersAutomatically()); - sortAlphabetically.setChecked(config.sortAlphabetically()); - minimumActivity.setSelection(minimumActivityAdapter.indexOf(config.minimumActivity())); - } - } - - private int getSelectedNetworkIndex(QBufferViewConfig config) { - QNetwork network; - if (context.client() == null) { - return 0; - } else if ((network = context.client().networkManager().network(config.networkId())) == null) { - return 0; - } else { - return context.client().networkManager().networks().indexOf(network) + 1; - } - } - - @Override - protected void onDisconnected() { - networkSpinnerAdapter.setNetworkManager(null); - setConfig(null); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListListActivity.java deleted file mode 100644 index 5551746d7..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListListActivity.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.chatlist; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.DividerItemDecoration; - -public class ChatListListActivity extends BoundActivity { - - final OnQBufferViewConfigClickListener clickListener = config -> { - if (config != null) { - Intent intent = new Intent(this, ChatListEditActivity.class); - intent.putExtra("id", config.bufferViewId()); - startActivity(intent); - } - }; - QBufferViewManager manager; - @Bind(R.id.list) - RecyclerView list; - @Bind(R.id.add) - FloatingActionButton add; - @Bind(R.id.toolbar) - Toolbar toolbar; - ChatListAdapter adapter; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_chatlist_list); - ButterKnife.bind(this); - - list.setLayoutManager(new LinearLayoutManager(this)); - list.setItemAnimator(new DefaultItemAnimator()); - adapter = new ChatListAdapter(); - list.setAdapter(adapter); - list.addItemDecoration(new DividerItemDecoration(this)); - - add.setOnClickListener(view -> startActivity(new Intent(this, ChatListCreateActivity.class))); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - protected void onConnected() { - manager = context.client().bufferViewManager(); - adapter.setManager(manager); - } - - @Override - protected void onDisconnected() { - manager = null; - adapter.setManager(null); - } - - interface OnQBufferViewConfigClickListener { - void onClick(QBufferViewConfig config); - } - - private class ChatListAdapter extends RecyclerView.Adapter<ChatListViewHolder> { - final AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this); - QBufferViewManager manager; - - public void setManager(QBufferViewManager manager) { - if (this.manager != null) - this.manager.bufferViewConfigs().removeCallback(wrapper); - - this.manager = manager; - - if (this.manager != null) - this.manager.bufferViewConfigs().addCallback(wrapper); - } - - @Override - public ChatListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(R.layout.widget_chatlist, parent, false); - return new ChatListViewHolder(view); - } - - @Override - public void onBindViewHolder(ChatListViewHolder holder, int position) { - holder.bind(manager != null ? manager.bufferViewConfigs().get(position) : null); - } - - @Override - public int getItemCount() { - return manager == null ? 0 : manager.bufferViewConfigs().size(); - } - } - - class ChatListViewHolder extends RecyclerView.ViewHolder { - - @Bind(R.id.chatlist_name) - TextView name; - - private QBufferViewConfig config; - - public ChatListViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(view -> clickListener.onClick(config)); - } - - public void bind(QBufferViewConfig config) { - this.config = config; - name.setText(config == null ? "" : config.bufferViewName()); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/MinimumActivityAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/MinimumActivityAdapter.java deleted file mode 100644 index 3db708bff..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/MinimumActivityAdapter.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.chatlist; - -import android.database.DataSetObserver; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.SpinnerAdapter; -import android.widget.TextView; - -import java.util.Arrays; -import java.util.List; - -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; - -class MinimumActivityAdapter implements SpinnerAdapter { - final List<QBufferViewConfig.MinimumActivity> list = Arrays.asList(QBufferViewConfig.MinimumActivity.values()); - private final AppContext context; - - public MinimumActivityAdapter(AppContext context) { - this.context = context; - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - QBufferViewConfig.MinimumActivity minimumActivity = getItem(position); - view.setText(minimumActivity == null ? "" : context.themeUtil().translations.minimumActivity(minimumActivity)); - return view; - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - - } - - @Override - public int getCount() { - return list.size(); - } - - @Override - public QBufferViewConfig.MinimumActivity getItem(int position) { - return list.get(position); - } - - @Override - public long getItemId(int position) { - return getItem(position).id; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_inline, parent, false); - QBufferViewConfig.MinimumActivity minimumActivity = getItem(position); - view.setText(minimumActivity == null ? "" : context.themeUtil().translations.minimumActivity(minimumActivity)); - return view; - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return list.isEmpty(); - } - - public int indexOf(QBufferViewConfig.MinimumActivity minimumActivity) { - return list.indexOf(minimumActivity); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityCreateActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityCreateActivity.java deleted file mode 100644 index 8eb5b4fb6..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityCreateActivity.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.identity; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.SwitchCompat; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.CompoundButton; -import android.widget.EditText; - -import java.util.ArrayList; -import java.util.Collections; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.impl.Identity; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.identity.nick.IdentityNickListActivity; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.AnimationHelper; - -public class IdentityCreateActivity extends BoundActivity { - - private final QIdentity identity = Identity.createDefault(); - @Bind(R.id.toolbar) - Toolbar toolbar; - @Bind(R.id.identityName) - EditText identityName; - @Bind(R.id.realName) - EditText realName; - @Bind(R.id.ident) - EditText ident; - @Bind(R.id.nicks) - Button nicks; - @Bind(R.id.kickReason) - EditText kickReason; - @Bind(R.id.partReason) - EditText partReason; - @Bind(R.id.quitReason) - EditText quitReason; - @Bind(R.id.awayReason) - EditText awayReason; - @Bind(R.id.useAwayOnDetach) - SwitchCompat useAwayOnDetach; - @Bind(R.id.groupAwayOnDetach) - ViewGroup groupAwayOnDetach; - @Bind(R.id.awayOnDetachReason) - EditText awayOnDetachReason; - private ArrayList<String> nickList; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_identity_edit); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - useAwayOnDetach.setOnCheckedChangeListener(this::updateAwayOnDetachReasonVisible); - updateAwayOnDetachReasonVisible(null, useAwayOnDetach.isChecked()); - - nicks.setOnClickListener(v -> { - Intent intent1 = new Intent(IdentityCreateActivity.this, IdentityNickListActivity.class); - intent1.putStringArrayListExtra("nicks", nickList); - startActivityForResult(intent1, 0, null); - }); - - initializeDefaults(); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (data != null) { - ArrayList<String> nickList = data.getStringArrayListExtra("nicks"); - if (nickList != null) - this.nickList = nickList; - } - } - - private void updateAwayOnDetachReasonVisible(CompoundButton button, boolean visible) { - awayOnDetachReason.setEnabled(visible); - - IdentityCreateActivity.this.updateViewGroupStatus(groupAwayOnDetach, visible); - } - - private void updateViewGroupStatus(ViewGroup group, boolean visible) { - if (visible) { - AnimationHelper.expand(group); - } else { - AnimationHelper.collapse(group); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.confirm, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_confirm: { - if (identity != null) { - Identity newIdentity = Identity.createDefault(); - newIdentity._copyFrom(identity); - - if (!identity.identityName().equals(identityName.getText().toString())) - newIdentity._setIdentityName(identityName.getText().toString()); - - if (!identity.realName().equals(realName.getText().toString())) - newIdentity._setRealName(realName.getText().toString()); - - if (!identity.ident().equals(ident.getText().toString())) - newIdentity._setIdent(ident.getText().toString()); - - if (!identity.nicks().equals(nickList)) - newIdentity._setNicks(nickList); - - if (!identity.kickReason().equals(kickReason.getText().toString())) - newIdentity._setKickReason(kickReason.getText().toString()); - - if (!identity.partReason().equals(partReason.getText().toString())) - newIdentity._setPartReason(partReason.getText().toString()); - - if (!identity.quitReason().equals(quitReason.getText().toString())) - newIdentity._setQuitReason(quitReason.getText().toString()); - - if (!identity.awayReason().equals(awayReason.getText().toString())) - newIdentity._setAwayReason(awayReason.getText().toString()); - - if (!identity.detachAwayEnabled() == useAwayOnDetach.isChecked()) - newIdentity._setDetachAwayEnabled(useAwayOnDetach.isChecked()); - - if (!identity.detachAwayReason().equals(awayOnDetachReason.getText().toString())) - newIdentity._setDetachAwayReason(awayOnDetachReason.getText().toString()); - - context.client().createIdentity(newIdentity, Collections.emptyMap()); - - finish(); - } - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private void initializeDefaults() { - this.identityName.setText(identity.identityName()); - this.realName.setText(identity.realName()); - this.ident.setText(identity.ident()); - this.nickList = new ArrayList<>(identity.nicks()); - this.kickReason.setText(identity.kickReason()); - this.partReason.setText(identity.partReason()); - this.quitReason.setText(identity.quitReason()); - this.awayReason.setText(identity.awayReason()); - this.useAwayOnDetach.setChecked(identity.detachAwayEnabled()); - this.awayOnDetachReason.setText(identity.detachAwayReason()); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityEditActivity.java deleted file mode 100644 index ff861908e..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityEditActivity.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.identity; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.SwitchCompat; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.CompoundButton; -import android.widget.EditText; - -import com.afollestad.materialdialogs.MaterialDialog; - -import java.util.ArrayList; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.impl.Identity; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.identity.nick.IdentityNickListActivity; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.AnimationHelper; - -public class IdentityEditActivity extends BoundActivity { - - @Bind(R.id.toolbar) - Toolbar toolbar; - - @Bind(R.id.identityName) - EditText identityName; - - @Bind(R.id.realName) - EditText realName; - - @Bind(R.id.ident) - EditText ident; - - @Bind(R.id.nicks) - Button nicks; - - @Bind(R.id.kickReason) - EditText kickReason; - - @Bind(R.id.partReason) - EditText partReason; - - @Bind(R.id.quitReason) - EditText quitReason; - - @Bind(R.id.awayReason) - EditText awayReason; - - @Bind(R.id.useAwayOnDetach) - SwitchCompat useAwayOnDetach; - - @Bind(R.id.groupAwayOnDetach) - ViewGroup groupAwayOnDetach; - - @Bind(R.id.awayOnDetachReason) - EditText awayOnDetachReason; - - int id; - private QIdentity identity; - private ArrayList<String> nickList; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent intent = getIntent(); - if (intent == null) { - finish(); - return; - } - - id = intent.getIntExtra("id", -1); - - setContentView(R.layout.activity_identity_edit); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - useAwayOnDetach.setOnCheckedChangeListener(this::updateAwayOnDetachReasonVisible); - updateAwayOnDetachReasonVisible(null, useAwayOnDetach.isChecked()); - - nicks.setOnClickListener(v -> { - Intent intent1 = new Intent(IdentityEditActivity.this, IdentityNickListActivity.class); - intent1.putStringArrayListExtra("nicks", nickList); - startActivityForResult(intent1, 0, null); - }); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (data != null) { - ArrayList<String> nickList = data.getStringArrayListExtra("nicks"); - if (nickList != null) - this.nickList = nickList; - } - } - - private void updateAwayOnDetachReasonVisible(CompoundButton button, boolean visible) { - awayOnDetachReason.setEnabled(visible); - - IdentityEditActivity.this.updateViewGroupStatus(groupAwayOnDetach, visible); - } - - private void updateViewGroupStatus(ViewGroup group, boolean visible) { - if (visible) { - AnimationHelper.expand(group); - } else { - AnimationHelper.collapse(group); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.confirm_delete, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public void onBackPressed() { - if (hasChanged(build())) { - new MaterialDialog.Builder(this) - .content(R.string.confirmationUnsavedChanges) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - save(); - super.onBackPressed(); - }) - .onNegative((dialog, which) -> super.onBackPressed()) - .show(); - } else { - super.onBackPressed(); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - case R.id.action_delete: { - new MaterialDialog.Builder(this) - .content(getString(R.string.confirmationDelete, identity.identityName())) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - finish(); - context.client().removeIdentity(identity.id()); - }) - .build() - .show(); - } - return true; - case R.id.action_confirm: { - save(); - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private void save() { - Identity after = build(); - if (hasChanged(after)) - identity.update(after); - } - - private boolean hasChanged(Identity identity) { - return this.identity != null && identity != null && !this.identity.equals(identity); - } - - private Identity build() { - if (identity == null) { - return null; - } else { - Identity newIdentity = Identity.createDefault(); - newIdentity._copyFrom(identity); - - if (!identity.identityName().equals(identityName.getText().toString())) - newIdentity._setIdentityName(identityName.getText().toString()); - - if (!identity.realName().equals(realName.getText().toString())) - newIdentity._setRealName(realName.getText().toString()); - - if (!identity.ident().equals(ident.getText().toString())) - newIdentity._setIdent(ident.getText().toString()); - - if (!identity.nicks().equals(nickList)) - newIdentity._setNicks(nickList); - - if (!identity.kickReason().equals(kickReason.getText().toString())) - newIdentity._setKickReason(kickReason.getText().toString()); - - if (!identity.partReason().equals(partReason.getText().toString())) - newIdentity._setPartReason(partReason.getText().toString()); - - if (!identity.quitReason().equals(quitReason.getText().toString())) - newIdentity._setQuitReason(quitReason.getText().toString()); - - if (!identity.awayReason().equals(awayReason.getText().toString())) - newIdentity._setAwayReason(awayReason.getText().toString()); - - if (!identity.detachAwayEnabled() == useAwayOnDetach.isChecked()) - newIdentity._setDetachAwayEnabled(useAwayOnDetach.isChecked()); - - if (!identity.detachAwayReason().equals(awayOnDetachReason.getText().toString())) - newIdentity._setDetachAwayReason(awayOnDetachReason.getText().toString()); - - return newIdentity; - } - } - - @Override - protected void onConnected() { - setIdentity(context.client().identityManager().identity(id)); - } - - private void setIdentity(QIdentity identity) { - QIdentity oldIdentity = this.identity; - this.identity = identity; - - if (identity != null) { - - if (oldIdentity == null || identityName.getText().toString().equals(oldIdentity.identityName())) - this.identityName.setText(identity.identityName()); - - if (oldIdentity == null || realName.getText().toString().equals(oldIdentity.realName())) - this.realName.setText(identity.realName()); - - if (oldIdentity == null || ident.getText().toString().equals(oldIdentity.ident())) - this.ident.setText(identity.ident()); - - if (oldIdentity == null || nickList.equals(new ArrayList<>(oldIdentity.nicks()))) - this.nickList = new ArrayList<>(identity.nicks()); - - if (oldIdentity == null || kickReason.getText().toString().equals(oldIdentity.kickReason())) - this.kickReason.setText(identity.kickReason()); - - if (oldIdentity == null || partReason.getText().toString().equals(oldIdentity.partReason())) - this.partReason.setText(identity.partReason()); - - if (oldIdentity == null || quitReason.getText().toString().equals(oldIdentity.quitReason())) - this.quitReason.setText(identity.quitReason()); - - if (oldIdentity == null || awayReason.getText().toString().equals(oldIdentity.awayReason())) - this.awayReason.setText(identity.awayReason()); - - if (oldIdentity == null || useAwayOnDetach.isChecked() == oldIdentity.detachAwayEnabled()) - this.useAwayOnDetach.setChecked(identity.detachAwayEnabled()); - - if (oldIdentity == null || awayOnDetachReason.getText().toString().equals(oldIdentity.identityName())) - this.awayOnDetachReason.setText(identity.detachAwayReason()); - } - } - - @Override - protected void onDisconnected() { - setIdentity(null); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityListActivity.java deleted file mode 100644 index 6042a3e86..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentityListActivity.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.identity; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.client.IdentityManager; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.DividerItemDecoration; - -public class IdentityListActivity extends BoundActivity { - - final OnQIdentityClickListener clickListener = identity -> { - if (identity != null) { - Intent intent = new Intent(this, IdentityEditActivity.class); - intent.putExtra("id", identity.id()); - startActivity(intent); - } - }; - IdentityManager manager; - @Bind(R.id.list) - RecyclerView list; - @Bind(R.id.add) - FloatingActionButton add; - @Bind(R.id.toolbar) - Toolbar toolbar; - IdentityAdapter adapter; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_network_list); - ButterKnife.bind(this); - - list.setLayoutManager(new LinearLayoutManager(this)); - list.setItemAnimator(new DefaultItemAnimator()); - list.addItemDecoration(new DividerItemDecoration(this)); - adapter = new IdentityAdapter(); - list.setAdapter(adapter); - - add.setOnClickListener(view -> startActivity(new Intent(this, IdentityCreateActivity.class))); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - protected void onConnected() { - manager = context.client().identityManager(); - adapter.setManager(manager); - } - - @Override - protected void onDisconnected() { - manager = null; - adapter.setManager(null); - } - - interface OnQIdentityClickListener { - void onClick(QIdentity network); - } - - private class IdentityAdapter extends RecyclerView.Adapter<IdentityViewHolder> { - final AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this); - IdentityManager manager; - - public void setManager(IdentityManager manager) { - if (this.manager != null) - this.manager.identities().addCallback(wrapper); - - this.manager = manager; - - if (this.manager != null) - this.manager.identities().addCallback(wrapper); - } - - @Override - public IdentityViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(R.layout.widget_settings_network, parent, false); - return new IdentityViewHolder(view); - } - - @Override - public void onBindViewHolder(IdentityViewHolder holder, int position) { - holder.bind(manager != null ? manager.identities().get(position) : null); - } - - @Override - public int getItemCount() { - return manager == null ? 0 : manager.identities().size(); - } - } - - class IdentityViewHolder extends RecyclerView.ViewHolder { - - @Bind(R.id.network_name) - TextView name; - - private QIdentity identity; - - public IdentityViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(view -> clickListener.onClick(identity)); - } - - public void bind(QIdentity identity) { - this.identity = identity; - name.setText(identity == null ? "" : identity.identityName()); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentitySpinnerAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentitySpinnerAdapter.java deleted file mode 100644 index 27ca73fbe..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/IdentitySpinnerAdapter.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.identity; - -import android.content.res.Resources; -import android.database.DataSetObserver; -import android.support.annotation.Nullable; -import android.support.v7.view.ContextThemeWrapper; -import android.support.v7.widget.ThemedSpinnerAdapter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.libquassel.client.IdentityManager; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.observables.callbacks.GeneralCallback; -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -public class IdentitySpinnerAdapter implements ThemedSpinnerAdapter, GeneralCallback { - private final Set<DataSetObserver> observers = new HashSet<>(); - private AndroidObservableSortedList<QIdentity> identities; - @Nullable - private Resources.Theme theme; - - public void setIdentityManager(IdentityManager identityManager) { - if (identityManager != null) { - this.identities = identityManager.identities(); - this.identities.addCallback(new UICallback() { - @Override - public void notifyItemInserted(int position) { - notifyChanged(null); - } - - @Override - public void notifyItemChanged(int position) { - notifyChanged(null); - } - - @Override - public void notifyItemRemoved(int position) { - notifyChanged(null); - } - - @Override - public void notifyItemMoved(int from, int to) { - notifyChanged(null); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - notifyChanged(null); - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - notifyChanged(null); - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - notifyChanged(null); - } - }); - } else { - this.identities = null; - } - notifyChanged(null); - } - - @Nullable - @Override - public Resources.Theme getDropDownViewTheme() { - return theme; - } - - @Override - public void setDropDownViewTheme(@Nullable Resources.Theme theme) { - this.theme = theme; - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(new ContextThemeWrapper(parent.getContext(), theme)); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - QIdentity config = getItem(position); - view.setText(config == null ? "" : config.identityName()); - return view; - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - observers.add(observer); - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - observers.remove(observer); - } - - @Override - public int getCount() { - return identities == null ? 0 : identities.size(); - } - - @Override - public QIdentity getItem(int position) { - if (position >= 0 && identities != null && position < identities.size()) - return identities.get(position); - else - return null; - } - - @Override - public long getItemId(int position) { - QIdentity identity = getItem(position); - if (identity != null) - return identity.id(); - else - return -1; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_inline, parent, false); - QIdentity identity = getItem(position); - view.setText(identity == null ? "" : identity.identityName()); - return view; - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return getCount() == 0; - } - - @Override - public void notifyChanged(Object o) { - for (DataSetObserver observer : observers) { - observer.onChanged(); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickAdapter.java deleted file mode 100644 index 552350bda..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickAdapter.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.identity.nick; - -import android.graphics.Color; -import android.support.v4.view.MotionEventCompat; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import java.util.Collections; -import java.util.List; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.ItemTouchHelperAdapter; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.ItemTouchHelperViewHolder; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.OnStartDragListener; -import de.kuschku.util.annotationbind.AutoBinder; - -public class IdentityNickAdapter - extends RecyclerView.Adapter<IdentityNickAdapter.IdentityNickViewHolder> implements ItemTouchHelperAdapter { - - private final List<String> nicks; - private final OnStartDragListener dragStartListener; - private IdentityNickListActivity.OnIdentityNickClickListener onItemClickListener; - - public IdentityNickAdapter(List<String> nicks, OnStartDragListener dragStartListener) { - this.nicks = nicks; - this.dragStartListener = dragStartListener; - } - - @Override - public IdentityNickViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(R.layout.widget_identitynick, parent, false); - return new IdentityNickViewHolder(view); - } - - @Override - public void onBindViewHolder(IdentityNickViewHolder holder, int position) { - holder.bind(nicks.get(position)); - holder.drag_handle.setOnTouchListener((v, event) -> { - if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { - dragStartListener.onStartDrag(holder); - holder.itemView.setSelected(true); - } - return false; - }); - } - - @Override - public int getItemCount() { - return nicks.size(); - } - - @Override - public boolean onItemMove(int fromPosition, int toPosition) { - Collections.swap(nicks, fromPosition, toPosition); - notifyItemMoved(fromPosition, toPosition); - return true; - } - - public void setOnItemClickListener(IdentityNickListActivity.OnIdentityNickClickListener onItemClickListener) { - this.onItemClickListener = onItemClickListener; - } - - class IdentityNickViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder { - - @Bind(R.id.text) - TextView text; - - @Bind(R.id.drag_handle) - ImageView drag_handle; - - private String nick; - - public IdentityNickViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(v -> onItemClickListener.onClick(nick)); - } - - public void bind(String nick) { - this.nick = nick; - text.setText(nick == null ? "" : nick); - } - - @Override - public void onItemSelected() { - itemView.setBackgroundColor(AutoBinder.obtainColor(R.attr.colorBackground, itemView.getContext().getTheme())); - } - - @Override - public void onItemClear() { - itemView.setBackgroundColor(Color.TRANSPARENT); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickListActivity.java deleted file mode 100644 index ff212968a..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/identity/nick/IdentityNickListActivity.java +++ /dev/null @@ -1,171 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.identity.nick; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.support.v7.widget.helper.ItemTouchHelper; -import android.view.Menu; -import android.view.MenuItem; - -import com.afollestad.materialdialogs.MaterialDialog; - -import java.util.ArrayList; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.OnStartDragListener; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.SimpleItemTouchHelperCallback; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; -import de.kuschku.util.observables.lists.ObservableList; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.DividerItemDecoration; - -public class IdentityNickListActivity extends BoundActivity implements OnStartDragListener { - - @Bind(R.id.list) - RecyclerView list; - - @Bind(R.id.add) - FloatingActionButton add; - - @Bind(R.id.toolbar) - Toolbar toolbar; - - IdentityNickAdapter adapter; - ItemTouchHelper itemTouchHelper; - ObservableList<String> nicks; - final OnIdentityNickClickListener clickListener = nick -> { - MaterialDialog dialog = new MaterialDialog.Builder(this) - .input("", nick, false, (dialog1, input) -> { - - }) - .positiveText("Save") - .negativeText("Cancel") - .neutralText("Delete") - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .neutralColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog1, which) -> { - String text = dialog1.getInputEditText().getText().toString().trim(); - nicks.set(nicks.indexOf(nick), text); - }) - .onNeutral((dialog1, which) -> nicks.remove(nick)) - .build(); - dialog.show(); - }; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_network_list); - ButterKnife.bind(this); - - Intent intent = getIntent(); - ArrayList<String> nickList; - if (intent != null && (nickList = intent.getStringArrayListExtra("nicks")) != null) { - nicks = new ObservableList<>(nickList); - } else { - nicks = new ObservableList<>(); - } - - adapter = new IdentityNickAdapter(nicks, this); - nicks.addCallback(new AdapterUICallbackWrapper(adapter)); - - list.setAdapter(adapter); - list.setHasFixedSize(true); - list.setLayoutManager(new LinearLayoutManager(this)); - list.addItemDecoration(new DividerItemDecoration(this)); - adapter.setOnItemClickListener(clickListener); - - ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter); - itemTouchHelper = new ItemTouchHelper(callback); - itemTouchHelper.attachToRecyclerView(list); - - add.setOnClickListener(v -> { - MaterialDialog dialog = new MaterialDialog.Builder(this) - .input("", "", false, (dialog1, input) -> { - - }) - .positiveText("Save") - .negativeText("Cancel") - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog1, which) -> { - String nick = dialog1.getInputEditText().getText().toString().trim(); - if (!nicks.contains(nick)) - nicks.add(nick); - }) - .build(); - dialog.show(); - }); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.confirm, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - case R.id.action_confirm: { - Intent intent = new Intent(); - intent.putStringArrayListExtra("nicks", nicks); - setResult(RESULT_OK, intent); - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - protected void onPause() { - super.onPause(); - } - - @Override - public void onStartDrag(RecyclerView.ViewHolder viewHolder) { - itemTouchHelper.startDrag(viewHolder); - } - - interface OnIdentityNickClickListener { - void onClick(String nick); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/IgnoreListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/IgnoreListActivity.java deleted file mode 100644 index da244a808..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/IgnoreListActivity.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.ignore; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SwitchCompat; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.impl.IgnoreListManager; -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper.IgnoreRuleSerializerHelper; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.DividerItemDecoration; - -public class IgnoreListActivity extends BoundActivity { - final OnIgnoreRuleClickListener clickListener = ignoreRule -> { - if (ignoreRule != null) { - Intent intent = new Intent(this, IgnoreRuleEditActivity.class); - intent.putExtra("rule", IgnoreRuleSerializerHelper.serialize(ignoreRule)); - startActivityForResult(intent, 0, null); - } - }; - QIgnoreListManager manager; - final OnIgnoreRuleActiveListener activeListener = (ignoreRule, active) -> { - if (ignoreRule != null) { - manager._toggleIgnoreRule(ignoreRule, active); - manager.requestUpdate(); - } - }; - - @Bind(R.id.list) - RecyclerView list; - @Bind(R.id.add) - FloatingActionButton add; - @Bind(R.id.toolbar) - Toolbar toolbar; - IgnoreRuleAdapter adapter; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_network_list); - ButterKnife.bind(this); - - list.setLayoutManager(new LinearLayoutManager(this)); - list.setItemAnimator(new DefaultItemAnimator()); - list.addItemDecoration(new DividerItemDecoration(this)); - adapter = new IgnoreRuleAdapter(); - list.setAdapter(adapter); - - add.setOnClickListener(view -> startActivityForResult(new Intent(this, IgnoreRuleEditActivity.class), 0, null)); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - protected void onConnected() { - manager = context.client().ignoreListManager(); - adapter.setManager(manager); - } - - @Override - protected void onDisconnected() { - manager = null; - adapter.setManager(null); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (data != null) { - if (resultCode == RESULT_OK) { - IgnoreListManager.IgnoreListItem item = IgnoreRuleSerializerHelper.deserialize(data.getBundleExtra("rule")); - if (data.getStringExtra("original") != null) - manager._removeIgnoreListItem(data.getStringExtra("original")); - manager._addIgnoreListItem(item); - manager.requestUpdate(); - } else if (resultCode == IgnoreRuleEditActivity.RESULT_DELETE) { - manager._removeIgnoreListItem(data.getStringExtra("original")); - manager.requestUpdate(); - } - } - } - - interface OnIgnoreRuleClickListener { - void onClick(IgnoreListManager.IgnoreListItem network); - } - - interface OnIgnoreRuleActiveListener { - void onChange(IgnoreListManager.IgnoreListItem network, boolean active); - } - - private class IgnoreRuleAdapter extends RecyclerView.Adapter<IgnoreRuleViewHolder> { - final AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this); - QIgnoreListManager manager; - - public void setManager(QIgnoreListManager manager) { - if (this.manager != null) - this.manager.ignoreList().addCallback(wrapper); - - this.manager = manager; - - if (this.manager != null) - this.manager.ignoreList().addCallback(wrapper); - } - - @Override - public IgnoreRuleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(R.layout.widget_settings_ignorerule, parent, false); - return new IgnoreRuleViewHolder(view); - } - - @Override - public void onBindViewHolder(IgnoreRuleViewHolder holder, int position) { - holder.bind(manager != null ? manager.ignoreList().get(position) : null); - } - - @Override - public int getItemCount() { - return manager == null ? 0 : manager.ignoreList().size(); - } - } - - class IgnoreRuleViewHolder extends RecyclerView.ViewHolder { - @Bind(R.id.text) - TextView name; - - @Bind(R.id.active) - SwitchCompat active; - - private IgnoreListManager.IgnoreListItem ignoreRule; - - public IgnoreRuleViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(view -> clickListener.onClick(ignoreRule)); - active.setOnCheckedChangeListener((view, checked) -> activeListener.onChange(ignoreRule, checked)); - } - - public void bind(IgnoreListManager.IgnoreListItem ignoreRule) { - this.ignoreRule = ignoreRule; - name.setText(ignoreRule == null ? "" : ignoreRule.getIgnoreRule().rule()); - active.setChecked(ignoreRule.isActive()); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/IgnoreRuleEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/IgnoreRuleEditActivity.java deleted file mode 100644 index 98ab05672..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/IgnoreRuleEditActivity.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.ignore; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.AppCompatSpinner; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.CheckBox; -import android.widget.EditText; - -import com.afollestad.materialdialogs.MaterialDialog; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.syncables.types.impl.IgnoreListManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper.IgnoreRuleSerializerHelper; -import de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper.IgnoreTypeAdapter; -import de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper.ScopeTypeAdapter; -import de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper.StrictnessTypeAdapter; -import de.kuschku.util.servicebound.BoundActivity; - -public class IgnoreRuleEditActivity extends BoundActivity { - public static final int RESULT_DELETE = -2; - - @Bind(R.id.toolbar) - Toolbar toolbar; - - @Bind(R.id.strictness) - AppCompatSpinner strictness; - - @Bind(R.id.type) - AppCompatSpinner type; - - @Bind(R.id.ignoreRule) - EditText ignoreRule; - - @Bind(R.id.isRegEx) - CheckBox isRegEx; - - @Bind(R.id.scopeType) - AppCompatSpinner scopeType; - - @Bind(R.id.scope) - EditText scope; - - private IgnoreListManager.IgnoreListItem item; - private Bundle original; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_ignorerule_edit); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - StrictnessTypeAdapter strictnessTypeAdapter = new StrictnessTypeAdapter(context); - strictness.setAdapter(strictnessTypeAdapter); - - IgnoreTypeAdapter ignoreTypeAdapter = new IgnoreTypeAdapter(context); - type.setAdapter(ignoreTypeAdapter); - - ScopeTypeAdapter scopeTypeAdapter = new ScopeTypeAdapter(context); - scopeType.setAdapter(scopeTypeAdapter); - - Intent intent = getIntent(); - if (intent != null) { - original = intent.getBundleExtra("rule"); - if (original != null) { - item = IgnoreRuleSerializerHelper.deserialize(original); - - strictness.setSelection(strictnessTypeAdapter.indexOf(item.getStrictness())); - type.setSelection(ignoreTypeAdapter.indexOf(item.getType())); - ignoreRule.setText(item.getIgnoreRule().rule()); - isRegEx.setChecked(item.isRegEx()); - scopeType.setSelection(scopeTypeAdapter.indexOf(item.getScope())); - scope.setText(item.getScopeRule()); - } - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - if (original != null) { - getMenuInflater().inflate(R.menu.confirm_delete, menu); - } else { - getMenuInflater().inflate(R.menu.confirm, menu); - } - return super.onCreateOptionsMenu(menu); - } - - @Override - public void onBackPressed() { - if (hasChanged(build())) { - new MaterialDialog.Builder(this) - .content(R.string.confirmationUnsavedChanges) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - save(); - super.onBackPressed(); - }) - .onNegative((dialog, which) -> super.onBackPressed()) - .show(); - } else { - super.onBackPressed(); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - case R.id.action_delete: { - new MaterialDialog.Builder(this) - .content(getString(R.string.confirmationDelete, this.item.getIgnoreRule().rule())) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - delete(); - finish(); - }) - .build() - .show(); - } - return true; - case R.id.action_confirm: { - save(); - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private void delete() { - Intent intent = new Intent(); - intent.putExtra("original", original.getString("ignoreRule")); - setResult(RESULT_DELETE, intent); - } - - private void save() { - Intent intent = new Intent(); - if (original != null) - intent.putExtra("original", original.getString("ignoreRule")); - intent.putExtra("rule", build()); - setResult(RESULT_OK, intent); - } - - private boolean hasChanged(Bundle bundle) { - return this.original != null && bundle != null && !this.original.equals(bundle); - } - - private Bundle build() { - Bundle bundle = new Bundle(); - bundle.putInt("strictness", (int) strictness.getSelectedItemId()); - bundle.putInt("type", (int) type.getSelectedItemId()); - bundle.putString("ignoreRule", ignoreRule.getText().toString()); - bundle.putBoolean("isRegEx", isRegEx.isChecked()); - bundle.putInt("scopeType", (int) scopeType.getSelectedItemId()); - bundle.putString("scope", scope.getText().toString()); - return bundle; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/IgnoreRuleSerializerHelper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/IgnoreRuleSerializerHelper.java deleted file mode 100644 index dfb90ef05..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/IgnoreRuleSerializerHelper.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper; - -import android.os.Bundle; - -import de.kuschku.libquassel.syncables.types.impl.IgnoreListManager; - -public class IgnoreRuleSerializerHelper { - private IgnoreRuleSerializerHelper() { - } - - public static Bundle serialize(IgnoreListManager.IgnoreListItem ignoreRule) { - Bundle bundle = new Bundle(); - bundle.putInt("type", ignoreRule.getType().value); - bundle.putString("ignoreRule", ignoreRule.getIgnoreRule().rule()); - bundle.putBoolean("isRegEx", ignoreRule.isRegEx()); - bundle.putInt("strictness", ignoreRule.getStrictness().value); - bundle.putInt("scope", ignoreRule.getScope().value); - bundle.putString("scopeRule", ignoreRule.getScopeRule()); - bundle.putBoolean("isActive", ignoreRule.isActive()); - return bundle; - } - - public static IgnoreListManager.IgnoreListItem deserialize(Bundle bundle) { - return new IgnoreListManager.IgnoreListItem( - bundle.getInt("type"), - bundle.getString("ignoreRule"), - bundle.getBoolean("isRegEx"), - bundle.getInt("strictness"), - bundle.getInt("scope"), - bundle.getString("scopeRule"), - bundle.getBoolean("isActive") - ); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/IgnoreTypeAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/IgnoreTypeAdapter.java deleted file mode 100644 index 9bf3e16a9..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/IgnoreTypeAdapter.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper; - -import android.database.DataSetObserver; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.SpinnerAdapter; -import android.widget.TextView; - -import java.util.Arrays; -import java.util.List; - -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; - -public class IgnoreTypeAdapter implements SpinnerAdapter { - final List<QIgnoreListManager.IgnoreType> list = Arrays.asList(QIgnoreListManager.IgnoreType.values()); - private final AppContext context; - - public IgnoreTypeAdapter(AppContext context) { - this.context = context; - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - QIgnoreListManager.IgnoreType minimumActivity = getItem(position); - view.setText(minimumActivity == null ? "" : context.themeUtil().translations.ignoreType(minimumActivity)); - return view; - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - - } - - @Override - public int getCount() { - return list.size(); - } - - @Override - public QIgnoreListManager.IgnoreType getItem(int position) { - return list.get(position); - } - - @Override - public long getItemId(int position) { - return getItem(position).value; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_inline, parent, false); - QIgnoreListManager.IgnoreType ignoreType = getItem(position); - view.setText(ignoreType == null ? "" : context.themeUtil().translations.ignoreType(ignoreType)); - return view; - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return list.isEmpty(); - } - - public int indexOf(QIgnoreListManager.IgnoreType ignoreType) { - return list.indexOf(ignoreType); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/ScopeTypeAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/ScopeTypeAdapter.java deleted file mode 100644 index 6a12181ff..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/ScopeTypeAdapter.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper; - -import android.database.DataSetObserver; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.SpinnerAdapter; -import android.widget.TextView; - -import java.util.Arrays; -import java.util.List; - -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; - -public class ScopeTypeAdapter implements SpinnerAdapter { - final List<QIgnoreListManager.ScopeType> list = Arrays.asList(QIgnoreListManager.ScopeType.values()); - private final AppContext context; - - public ScopeTypeAdapter(AppContext context) { - this.context = context; - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - QIgnoreListManager.ScopeType minimumActivity = getItem(position); - view.setText(minimumActivity == null ? "" : context.themeUtil().translations.scopeType(minimumActivity)); - return view; - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - - } - - @Override - public int getCount() { - return list.size(); - } - - @Override - public QIgnoreListManager.ScopeType getItem(int position) { - return list.get(position); - } - - @Override - public long getItemId(int position) { - return getItem(position).value; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_inline, parent, false); - QIgnoreListManager.ScopeType scopeType = getItem(position); - view.setText(scopeType == null ? "" : context.themeUtil().translations.scopeType(scopeType)); - return view; - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return list.isEmpty(); - } - - public int indexOf(QIgnoreListManager.ScopeType scopeType) { - return list.indexOf(scopeType); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/StrictnessTypeAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/StrictnessTypeAdapter.java deleted file mode 100644 index ef22f8e5f..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/ignore/helper/StrictnessTypeAdapter.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.ignore.helper; - -import android.database.DataSetObserver; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.SpinnerAdapter; -import android.widget.TextView; - -import java.util.Arrays; -import java.util.List; - -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; - -public class StrictnessTypeAdapter implements SpinnerAdapter { - final List<QIgnoreListManager.StrictnessType> list = Arrays.asList( - QIgnoreListManager.StrictnessType.SoftStrictness, - QIgnoreListManager.StrictnessType.HardStrictness - ); - private final AppContext context; - - public StrictnessTypeAdapter(AppContext context) { - this.context = context; - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - QIgnoreListManager.StrictnessType minimumActivity = getItem(position); - view.setText(minimumActivity == null ? "" : context.themeUtil().translations.strictnessType(minimumActivity)); - return view; - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - - } - - @Override - public int getCount() { - return list.size(); - } - - @Override - public QIgnoreListManager.StrictnessType getItem(int position) { - return list.get(position); - } - - @Override - public long getItemId(int position) { - return getItem(position).value; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_inline, parent, false); - QIgnoreListManager.StrictnessType strictnessType = getItem(position); - view.setText(strictnessType == null ? "" : context.themeUtil().translations.strictnessType(strictnessType)); - return view; - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return list.isEmpty(); - } - - public int indexOf(QIgnoreListManager.StrictnessType strictnessType) { - return list.indexOf(strictnessType); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/AllNetworksItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/AllNetworksItem.java deleted file mode 100644 index db4e40448..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/AllNetworksItem.java +++ /dev/null @@ -1,749 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network; - -import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.List; - -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.syncables.types.impl.IrcChannel; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.irc.IrcCaseMappers; -import de.kuschku.util.irc.chanmodes.IrcModeProvider; -import de.kuschku.util.observables.callbacks.GeneralCallback; - -class AllNetworksItem implements QNetwork { - private final Context context; - - public AllNetworksItem(Context context) { - this.context = context; - } - - @Override - public int networkId() { - return 0; - } - - @Override - public boolean isMyNick(String nick) { - return false; - } - - @Override - public boolean isMe(QIrcUser ircuser) { - return false; - } - - @Override - public boolean isChannelName(String channelname) { - return false; - } - - @Override - public boolean isConnected() { - return false; - } - - @Override - public void setConnected(boolean isConnected) { - - } - - @Override - public ConnectionState connectionState() { - return null; - } - - @Override - public String prefixToMode(char prefix) { - return null; - } - - @Override - public String prefixToMode(String prefix) { - return null; - } - - @Override - public String modeToPrefix(char mode) { - return null; - } - - @Override - public String modeToPrefix(String mode) { - return null; - } - - @Override - public int modeToIndex(String mode) { - return 0; - } - - @Override - public int lowestModeIndex(String mode) { - return 0; - } - - @NonNull - @Override - public ChannelModeType channelModeType(char mode) { - return null; - } - - @NonNull - @Override - public ChannelModeType channelModeType(String mode) { - return null; - } - - @Override - public String networkName() { - return context.getString(R.string.labelAllNetworks); - } - - @Override - public String currentServer() { - return null; - } - - @Override - public String myNick() { - return null; - } - - @Override - public int latency() { - return 0; - } - - @Override - public QIrcUser me() { - return null; - } - - @Override - public int identity() { - return 0; - } - - @NonNull - @Override - public List<String> nicks() { - return null; - } - - @NonNull - @Override - public List<String> channels() { - return null; - } - - @Override - public List<NetworkServer> serverList() { - return null; - } - - @Override - public boolean useRandomServer() { - return false; - } - - @Override - public List<String> perform() { - return null; - } - - @Override - public boolean useAutoIdentify() { - return false; - } - - @Override - public String autoIdentifyService() { - return null; - } - - @Override - public String autoIdentifyPassword() { - return null; - } - - @Override - public boolean useSasl() { - return false; - } - - @Override - public String saslAccount() { - return null; - } - - @Override - public String saslPassword() { - return null; - } - - @Override - public boolean useAutoReconnect() { - return false; - } - - @Override - public int autoReconnectInterval() { - return 0; - } - - @Override - public short autoReconnectRetries() { - return 0; - } - - @Override - public boolean unlimitedReconnectRetries() { - return false; - } - - @Override - public boolean rejoinChannels() { - return false; - } - - @Override - public NetworkInfo networkInfo() { - return null; - } - - @Override - public List<String> prefixes() { - return null; - } - - @Override - public List<String> prefixModes() { - return null; - } - - @Override - public IrcModeProvider modeProvider() { - return null; - } - - @Override - public void determinePrefixes() { - - } - - @Override - public boolean supports(String param) { - return false; - } - - @Override - public String support(String param) { - return null; - } - - @Override - public QIrcUser ircUser(String nickname) { - return null; - } - - @NonNull - @Override - public List<QIrcUser> ircUsers() { - return null; - } - - @Override - public int ircUserCount() { - return 0; - } - - @Override - public QIrcChannel newIrcChannel(String channelname) { - return null; - } - - @Nullable - @Override - public QIrcChannel ircChannel(String channelname) { - return null; - } - - @NonNull - @Override - public List<QIrcChannel> ircChannels() { - return null; - } - - @Override - public int ircChannelCount() { - return 0; - } - - @Override - public String codecForServer() { - return null; - } - - @Override - public String codecForEncoding() { - return null; - } - - @Override - public String codecForDecoding() { - return null; - } - - @Override - public String defaultCodecForServer() { - return null; - } - - @Override - public String defaultCodecForEncoding() { - return null; - } - - @Override - public String defaultCodecForDecoding() { - return null; - } - - @Override - public void setDefaultCodecForServer(String name) { - - } - - @Override - public void setDefaultCodecForEncoding(String name) { - - } - - @Override - public void setDefaultCodecForDecoding(String name) { - - } - - @Override - public boolean autoAwayActive() { - return false; - } - - @Override - public void setAutoAwayActive(boolean active) { - - } - - @Override - public void _setAutoAwayActive(boolean active) { - - } - - @Override - public void setNetworkName(String networkName) { - - } - - @Override - public void _setNetworkName(String networkName) { - - } - - @Override - public void setCurrentServer(String currentServer) { - - } - - @Override - public void _setCurrentServer(String currentServer) { - - } - - @Override - public void _setConnected(boolean isConnected) { - - } - - @Override - public void setConnectionState(int state) { - - } - - @Override - public void _setConnectionState(int state) { - - } - - @Override - public void setMyNick(String mynick) { - - } - - @Override - public void _setMyNick(String mynick) { - - } - - @Override - public void setLatency(int latency) { - - } - - @Override - public void _setLatency(int latency) { - - } - - @Override - public void setIdentity(int identityId) { - - } - - @Override - public void _setIdentity(int identityId) { - - } - - @Override - public void setServerList(List<NetworkServer> serverList) { - - } - - @Override - public void _setServerList(List<NetworkServer> serverList) { - - } - - @Override - public void setUseRandomServer(boolean useRandomServer) { - - } - - @Override - public void _setUseRandomServer(boolean useRandomServer) { - - } - - @Override - public void setPerform(List<String> performs) { - - } - - @Override - public void _setPerform(List<String> performs) { - - } - - @Override - public void setUseAutoIdentify(boolean useAutoIdentify) { - - } - - @Override - public void _setUseAutoIdentify(boolean useAutoIdentify) { - - } - - @Override - public void setAutoIdentifyService(String autoIdentifyService) { - - } - - @Override - public void _setAutoIdentifyService(String autoIdentifyService) { - - } - - @Override - public void setAutoIdentifyPassword(String autoIdentifyPassword) { - - } - - @Override - public void _setAutoIdentifyPassword(String autoIdentifyPassword) { - - } - - @Override - public void setUseSasl(boolean useSasl) { - - } - - @Override - public void _setUseSasl(boolean useSasl) { - - } - - @Override - public void setSaslAccount(String saslAccount) { - - } - - @Override - public void _setSaslAccount(String saslAccount) { - - } - - @Override - public void setSaslPassword(String saslPassword) { - - } - - @Override - public void _setSaslPassword(String saslPassword) { - - } - - @Override - public void setUseAutoReconnect(boolean useAutoReconnect) { - - } - - @Override - public void _setUseAutoReconnect(boolean useAutoReconnect) { - - } - - @Override - public void setAutoReconnectInterval(int autoReconnectInterval) { - - } - - @Override - public void _setAutoReconnectInterval(int autoReconnectInterval) { - - } - - @Override - public void setAutoReconnectRetries(short autoReconnectRetries) { - - } - - @Override - public void _setAutoReconnectRetries(short autoReconnectRetries) { - - } - - @Override - public void setUnlimitedReconnectRetries(boolean unlimitedReconnectRetries) { - - } - - @Override - public void _setUnlimitedReconnectRetries(boolean unlimitedReconnectRetries) { - - } - - @Override - public void setRejoinChannels(boolean rejoinChannels) { - - } - - @Override - public void _setRejoinChannels(boolean rejoinChannels) { - - } - - @Override - public void setCodecForServer(String codecName) { - - } - - @Override - public void _setCodecForServer(String codecName) { - - } - - @Override - public void setCodecForEncoding(String codecName) { - - } - - @Override - public void _setCodecForEncoding(String codecName) { - - } - - @Override - public void setCodecForDecoding(String codecName) { - - } - - @Override - public void _setCodecForDecoding(String codecName) { - - } - - @Override - public void addSupport(String param) { - - } - - @Override - public void _addSupport(String param) { - - } - - @Override - public void addSupport(String param, String value) { - - } - - @Override - public void _addSupport(String param, String value) { - - } - - @Override - public void removeSupport(String param) { - - } - - @Override - public void _removeSupport(String param) { - - } - - @Override - public void addIrcUser(String hostmask) { - - } - - @Override - public void _addIrcUser(String hostmask) { - - } - - @Override - public void addIrcChannel(String channel) { - - } - - @Override - public void _addIrcChannel(String channel) { - - } - - @Override - public QIrcUser updateNickFromMask(String mask) { - return null; - } - - @Override - public QIrcUser _updateNickFromMask(String mask) { - return null; - } - - @Override - public void ircUserNickChanged(String oldNick, String newnick) { - - } - - @Override - public void connect() { - - } - - @Override - public void _connect() { - - } - - @Override - public void disconnect() { - - } - - @Override - public void _disconnect() { - - } - - @Override - public void setNetworkInfo(NetworkInfo info) { - - } - - @Override - public void _setNetworkInfo(NetworkInfo info) { - - } - - @Override - public void removeIrcUser(QIrcUser ircuser) { - - } - - @Override - public void _removeIrcUser(QIrcUser ircuser) { - - } - - @Override - public void removeIrcChannel(QIrcChannel ircChannel) { - - } - - @Override - public void _removeIrcChannel(QIrcChannel ircChannel) { - - } - - @Override - public void removeChansAndUsers() { - - } - - @Override - public void _removeChansAndUsers() { - - } - - @Override - public void _addIrcChannel(IrcChannel ircChannel) { - - } - - @Override - public IrcCaseMappers.IrcCaseMapper caseMapper() { - return null; - } - - @Override - public void addObserver(GeneralCallback<QNetwork> o) { - - } - - @Override - public void deleteObserver(GeneralCallback<QNetwork> o) { - - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/FakeNetworksWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/FakeNetworksWrapper.java deleted file mode 100644 index 6dc69af1b..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/FakeNetworksWrapper.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network; - -import android.content.Context; -import android.database.DataSetObserver; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.lists.AndroidObservableSortedList; - -public class FakeNetworksWrapper { - private final QNetwork fakeNetwork; - private final Set<DataSetObserver> observers = new HashSet<>(); - private final UICallback callback = new UICallback() { - @Override - public void notifyItemInserted(int position) { - notifyChanged(); - } - - @Override - public void notifyItemChanged(int position) { - notifyChanged(); - } - - @Override - public void notifyItemRemoved(int position) { - notifyChanged(); - } - - @Override - public void notifyItemMoved(int from, int to) { - notifyChanged(); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - notifyChanged(); - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - notifyChanged(); - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - notifyChanged(); - } - }; - private AndroidObservableSortedList<QNetwork> base; - - public FakeNetworksWrapper(Context context) { - this.fakeNetwork = new AllNetworksItem(context); - } - - public void setBase(AndroidObservableSortedList<QNetwork> base) { - if (this.base != null) - this.base.removeCallback(callback); - this.base = base; - if (this.base != null) - this.base.addCallback(callback); - notifyChanged(); - } - - public QNetwork get(int position) { - if (position == 0) - return fakeNetwork; - else if (position > 0 && position <= base.size() && base != null) - return base.get(position - 1); - else - return null; - } - - public int getCount() { - return base == null ? 1 : base.size() + 1; - } - - public void addObserver(DataSetObserver observer) { - observers.add(observer); - } - - public void removeObserver(DataSetObserver observer) { - observers.remove(observer); - } - - public void notifyChanged() { - for (DataSetObserver observer : observers) { - observer.onChanged(); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java deleted file mode 100644 index 779312e4d..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java +++ /dev/null @@ -1,281 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network; - -import android.content.Intent; -import android.os.Bundle; -import android.os.Parcelable; -import android.support.annotation.Nullable; -import android.support.v7.widget.SwitchCompat; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.EditText; -import android.widget.Spinner; - -import java.util.Collections; -import java.util.List; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.identity.IdentitySpinnerAdapter; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.NetworkServerListActivity; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.NetworkServerSerializeHelper; -import de.kuschku.util.backports.NumberHelper; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.AnimationHelper; - -public class NetworkCreateActivity extends BoundActivity { - - private static final int REQUEST_SERVER_LIST = 1; - private static final int REQUEST_PERFORM = 2; - final IdentitySpinnerAdapter spinnerAdapter = new IdentitySpinnerAdapter(); - @Bind(R.id.toolbar) - Toolbar toolbar; - @Bind(R.id.networkName) - EditText networkName; - @Bind(R.id.identity) - Spinner identity; - @Bind(R.id.rejoinChannels) - CheckBox rejoinChannels; - @Bind(R.id.servers) - Button servers; - @Bind(R.id.useCustomCodecs) - SwitchCompat useCustomCodecs; - @Bind(R.id.groupCustomCodecs) - ViewGroup groupCustomCodecs; - @Bind(R.id.codecForServer) - EditText codecForServer; - @Bind(R.id.codecForEncoding) - EditText codecForEncoding; - @Bind(R.id.codecForDecoding) - EditText codecForDecoding; - @Bind(R.id.useAutoIdentify) - SwitchCompat useAutoIdentify; - @Bind(R.id.groupAutoIdentify) - ViewGroup groupAutoIdentify; - @Bind(R.id.autoIdentifyService) - EditText autoIdentifyService; - @Bind(R.id.autoIdentifyPassword) - EditText autoIdentifyPassword; - @Bind(R.id.useSasl) - SwitchCompat useSasl; - @Bind(R.id.groupSasl) - ViewGroup groupSasl; - @Bind(R.id.saslAccount) - EditText saslAccount; - @Bind(R.id.saslPassword) - EditText saslPassword; - @Bind(R.id.useAutoReconnect) - SwitchCompat useAutoReconnect; - @Bind(R.id.groupAutoReconnect) - ViewGroup groupAutoReconnect; - @Bind(R.id.autoReconnectInterval) - EditText autoReconnectInterval; - @Bind(R.id.autoReconnectRetries) - EditText autoReconnectRetries; - @Bind(R.id.unlimitedAutoReconnectRetries) - CheckBox unlimitedAutoReconnectRetries; - int id; - private List<NetworkServer> serverList = null; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent intent = getIntent(); - if (intent == null) { - finish(); - return; - } - - id = intent.getIntExtra("id", -1); - - setContentView(R.layout.activity_network_edit); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - identity.setAdapter(spinnerAdapter); - - useCustomCodecs.setOnCheckedChangeListener(this::updateCustomCodecsVisible); - updateCustomCodecsVisible(null, useCustomCodecs.isChecked()); - - useAutoIdentify.setOnCheckedChangeListener(this::updateAutoIdentifyVisible); - updateAutoIdentifyVisible(null, useAutoIdentify.isChecked()); - - useSasl.setOnCheckedChangeListener(this::updateSaslVisible); - updateSaslVisible(null, useSasl.isChecked()); - - useAutoReconnect.setOnCheckedChangeListener(this::updateAutoReconnectVisible); - updateAutoReconnectVisible(null, useAutoReconnect.isChecked()); - - unlimitedAutoReconnectRetries.setOnCheckedChangeListener(this::updateAutoReconnectRetriesUnlimited); - updateAutoReconnectRetriesUnlimited(null, unlimitedAutoReconnectRetries.isChecked()); - - servers.setOnClickListener(v -> { - Intent intent1 = new Intent(NetworkCreateActivity.this, NetworkServerListActivity.class); - if (serverList != null) - intent1.putExtra("servers", NetworkServerSerializeHelper.serialize(serverList)); - startActivityForResult(intent1, REQUEST_SERVER_LIST, null); - }); - - initializeWithDefaults(); - } - - public void initializeWithDefaults() { - useAutoReconnect.setChecked(true); - autoReconnectRetries.setText("20"); - autoReconnectInterval.setText("60"); - rejoinChannels.setChecked(true); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (data != null) { - switch (requestCode) { - case REQUEST_PERFORM: { - - } - break; - case REQUEST_SERVER_LIST: { - Parcelable[] servers = data.getParcelableArrayExtra("servers"); - if (servers != null) { - serverList = NetworkServerSerializeHelper.deserialize(servers); - } - } - break; - } - } - } - - - private void updateCustomCodecsVisible(CompoundButton button, boolean visible) { - codecForServer.setEnabled(visible); - codecForEncoding.setEnabled(visible); - codecForDecoding.setEnabled(visible); - - updateViewGroupStatus(groupCustomCodecs, visible); - } - - private void updateAutoIdentifyVisible(CompoundButton button, boolean visible) { - autoIdentifyService.setEnabled(visible); - autoIdentifyPassword.setEnabled(visible); - - updateViewGroupStatus(groupAutoIdentify, visible); - } - - private void updateSaslVisible(CompoundButton button, boolean visible) { - saslAccount.setEnabled(visible); - saslPassword.setEnabled(visible); - - updateViewGroupStatus(groupSasl, visible); - } - - private void updateAutoReconnectVisible(CompoundButton button, boolean visible) { - autoReconnectInterval.setEnabled(visible); - autoReconnectRetries.setEnabled(visible); - unlimitedAutoReconnectRetries.setEnabled(visible); - - updateViewGroupStatus(this.groupAutoReconnect, visible); - } - - private void updateAutoReconnectRetriesUnlimited(CompoundButton button, boolean visible) { - autoReconnectRetries.setEnabled(!visible); - } - - private void updateViewGroupStatus(ViewGroup group, boolean visible) { - if (visible) { - AnimationHelper.expand(group); - } else { - AnimationHelper.collapse(group); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.confirm, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_confirm: { - NetworkInfo after = new NetworkInfo( - 0, - networkName.getText().toString(), - (int) identity.getSelectedItemId(), - useCustomCodecs.isChecked() ? this.codecForServer.getText().toString() : null, - useCustomCodecs.isChecked() ? this.codecForEncoding.getText().toString() : null, - useCustomCodecs.isChecked() ? this.codecForDecoding.getText().toString() : null, - serverList == null ? Collections.emptyList() : serverList, - true, - Collections.emptyList(), - useAutoIdentify.isChecked(), - autoIdentifyService.getText().toString(), - autoIdentifyPassword.getText().toString(), - useSasl.isChecked(), - saslAccount.getText().toString(), - saslPassword.getText().toString(), - useAutoReconnect.isChecked(), - NumberHelper.parseInt(autoReconnectInterval.getText().toString(), 0), - NumberHelper.parseShort(autoReconnectRetries.getText().toString(), (short) 0), - unlimitedAutoReconnectRetries.isChecked(), - rejoinChannels.isChecked() - ); - if (context.client() != null) - context.client().createNetwork(after); - - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - protected void onConnected() { - QIdentity identity = (QIdentity) this.identity.getSelectedItem(); - spinnerAdapter.setIdentityManager(context.client().identityManager()); - this.identity.setSelection(getIdentityPosition(identity)); - } - - private int getIdentityPosition(QIdentity identity) { - return context.client().identityManager().identities().indexOf(identity); - } - - @Override - protected void onDisconnected() { - spinnerAdapter.setIdentityManager(null); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java deleted file mode 100644 index c2708c20c..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java +++ /dev/null @@ -1,394 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network; - -import android.content.Intent; -import android.os.Bundle; -import android.os.Parcelable; -import android.support.annotation.Nullable; -import android.support.v7.widget.SwitchCompat; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuItem; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.EditText; -import android.widget.Spinner; - -import com.afollestad.materialdialogs.MaterialDialog; - -import java.util.List; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.syncables.types.impl.NetworkInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIdentity; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.identity.IdentitySpinnerAdapter; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.NetworkServerListActivity; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.NetworkServerSerializeHelper; -import de.kuschku.util.backports.NumberHelper; -import de.kuschku.util.backports.Objects; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.AnimationHelper; - -public class NetworkEditActivity extends BoundActivity { - - private static final int REQUEST_SERVER_LIST = 1; - private static final int REQUEST_PERFORM = 2; - final IdentitySpinnerAdapter spinnerAdapter = new IdentitySpinnerAdapter(); - @Bind(R.id.toolbar) - Toolbar toolbar; - @Bind(R.id.networkName) - EditText networkName; - @Bind(R.id.identity) - Spinner identity; - @Bind(R.id.rejoinChannels) - CheckBox rejoinChannels; - @Bind(R.id.servers) - Button servers; - @Bind(R.id.useCustomCodecs) - SwitchCompat useCustomCodecs; - @Bind(R.id.groupCustomCodecs) - ViewGroup groupCustomCodecs; - @Bind(R.id.codecForServer) - EditText codecForServer; - @Bind(R.id.codecForEncoding) - EditText codecForEncoding; - @Bind(R.id.codecForDecoding) - EditText codecForDecoding; - @Bind(R.id.useAutoIdentify) - SwitchCompat useAutoIdentify; - @Bind(R.id.groupAutoIdentify) - ViewGroup groupAutoIdentify; - @Bind(R.id.autoIdentifyService) - EditText autoIdentifyService; - @Bind(R.id.autoIdentifyPassword) - EditText autoIdentifyPassword; - @Bind(R.id.useSasl) - SwitchCompat useSasl; - @Bind(R.id.groupSasl) - ViewGroup groupSasl; - @Bind(R.id.saslAccount) - EditText saslAccount; - @Bind(R.id.saslPassword) - EditText saslPassword; - @Bind(R.id.useAutoReconnect) - SwitchCompat useAutoReconnect; - @Bind(R.id.groupAutoReconnect) - ViewGroup groupAutoReconnect; - @Bind(R.id.autoReconnectInterval) - EditText autoReconnectInterval; - @Bind(R.id.autoReconnectRetries) - EditText autoReconnectRetries; - @Bind(R.id.unlimitedAutoReconnectRetries) - CheckBox unlimitedAutoReconnectRetries; - int id; - private QNetwork network; - - private List<NetworkServer> serverList = null; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent intent = getIntent(); - if (intent == null) { - finish(); - return; - } - - id = intent.getIntExtra("id", -1); - - setContentView(R.layout.activity_network_edit); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - identity.setAdapter(spinnerAdapter); - - useCustomCodecs.setOnCheckedChangeListener(this::updateCustomCodecsVisible); - updateCustomCodecsVisible(null, useCustomCodecs.isChecked()); - - useAutoIdentify.setOnCheckedChangeListener(this::updateAutoIdentifyVisible); - updateAutoIdentifyVisible(null, useAutoIdentify.isChecked()); - - useSasl.setOnCheckedChangeListener(this::updateSaslVisible); - updateSaslVisible(null, useSasl.isChecked()); - - useAutoReconnect.setOnCheckedChangeListener(this::updateAutoReconnectVisible); - updateAutoReconnectVisible(null, useAutoReconnect.isChecked()); - - unlimitedAutoReconnectRetries.setOnCheckedChangeListener(this::updateAutoReconnectRetriesUnlimited); - updateAutoReconnectRetriesUnlimited(null, unlimitedAutoReconnectRetries.isChecked()); - - servers.setOnClickListener(v -> { - Intent intent1 = new Intent(NetworkEditActivity.this, NetworkServerListActivity.class); - intent1.putExtra("servers", NetworkServerSerializeHelper.serialize(network.serverList())); - startActivityForResult(intent1, REQUEST_SERVER_LIST, null); - }); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (data != null) { - switch (requestCode) { - case REQUEST_PERFORM: { - - } - break; - case REQUEST_SERVER_LIST: { - Parcelable[] servers = data.getParcelableArrayExtra("servers"); - if (servers != null) { - serverList = NetworkServerSerializeHelper.deserialize(servers); - } - } - break; - } - } - } - - private void updateCustomCodecsVisible(CompoundButton button, boolean visible) { - codecForServer.setEnabled(visible); - codecForEncoding.setEnabled(visible); - codecForDecoding.setEnabled(visible); - - NetworkEditActivity.this.updateViewGroupStatus(groupCustomCodecs, visible); - } - - private void updateAutoIdentifyVisible(CompoundButton button, boolean visible) { - autoIdentifyService.setEnabled(visible); - autoIdentifyPassword.setEnabled(visible); - - updateViewGroupStatus(groupAutoIdentify, visible); - } - - private void updateSaslVisible(CompoundButton button, boolean visible) { - saslAccount.setEnabled(visible); - saslPassword.setEnabled(visible); - - updateViewGroupStatus(groupSasl, visible); - } - - private void updateAutoReconnectRetriesUnlimited(CompoundButton button, boolean visible) { - autoReconnectRetries.setEnabled(!visible); - } - - private void updateAutoReconnectVisible(CompoundButton button, boolean visible) { - autoReconnectInterval.setEnabled(visible); - autoReconnectRetries.setEnabled(visible); - unlimitedAutoReconnectRetries.setEnabled(visible); - - updateViewGroupStatus(this.groupAutoReconnect, visible); - } - - private void updateViewGroupStatus(ViewGroup group, boolean visible) { - if (visible) { - AnimationHelper.expand(group); - } else { - AnimationHelper.collapse(group); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.confirm_delete, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public void onBackPressed() { - if (hasChanged(build())) { - new MaterialDialog.Builder(this) - .content(R.string.confirmationUnsavedChanges) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - save(); - super.onBackPressed(); - }) - .onNegative((dialog, which) -> super.onBackPressed()) - .show(); - } else { - super.onBackPressed(); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - case R.id.action_delete: { - new MaterialDialog.Builder(this) - .content(getString(R.string.confirmationDelete, network.networkName())) - .positiveText(R.string.actionYes) - .negativeText(R.string.actionNo) - .positiveColor(context.themeUtil().res.colorAccent) - .negativeColor(context.themeUtil().res.colorForeground) - .backgroundColorAttr(R.attr.colorBackgroundDialog) - .onPositive((dialog, which) -> { - finish(); - context.client().removeNetwork(network.networkId()); - }) - .build() - .show(); - } - return true; - case R.id.action_confirm: { - save(); - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private void save() { - NetworkInfo info = build(); - if (hasChanged(info)) - network.setNetworkInfo(info); - } - - private boolean hasChanged(NetworkInfo info) { - return network != null && network.networkInfo() != null && info != null && !Objects.equals(network.networkInfo(), info); - } - - private NetworkInfo build() { - NetworkInfo networkInfo = this.network.networkInfo(); - if (networkInfo == null) { - return null; - } else { - return new NetworkInfo( - networkInfo.networkId(), - networkName.getText().toString(), - (int) identity.getSelectedItemId(), - useCustomCodecs.isChecked() ? this.codecForServer.getText().toString() : null, - useCustomCodecs.isChecked() ? this.codecForEncoding.getText().toString() : null, - useCustomCodecs.isChecked() ? this.codecForDecoding.getText().toString() : null, - serverList == null ? networkInfo.serverList() : serverList, - networkInfo.useRandomServer(), - //FIXME: IMPLEMENT - networkInfo.perform(), - useAutoIdentify.isChecked(), - autoIdentifyService.getText().toString(), - autoIdentifyPassword.getText().toString(), - useSasl.isChecked(), - saslAccount.getText().toString(), - saslPassword.getText().toString(), - useAutoReconnect.isChecked(), - NumberHelper.parseInt(autoReconnectInterval.getText().toString(), 0), - NumberHelper.parseShort(autoReconnectRetries.getText().toString(), (short) 0), - unlimitedAutoReconnectRetries.isChecked(), - rejoinChannels.isChecked() - ); - } - } - - @Override - protected void onConnected() { - spinnerAdapter.setIdentityManager(context.client().identityManager()); - setNetwork(context.client().networkManager().network(id)); - } - - private void setNetwork(QNetwork network) { - NetworkInfo oldInfo = this.network == null ? null : this.network.networkInfo(); - this.network = network; - - if (network != null) { - NetworkInfo networkInfo = this.network.networkInfo(); - if (networkInfo != null) { - if (oldInfo == null || oldInfo.networkName().equals(networkName.getText().toString())) - networkName.setText(networkInfo.networkName()); - - if (oldInfo == null || getIdentityPosition(oldInfo) == identity.getSelectedItemPosition()) - identity.setSelection(getIdentityPosition(networkInfo)); - - if (oldInfo == null || (oldInfo.codecForServer() != null || oldInfo.codecForEncoding() != null || oldInfo.codecForDecoding() != null) == useCustomCodecs.isChecked()) - useCustomCodecs.setChecked(networkInfo.codecForServer() != null || networkInfo.codecForEncoding() != null || networkInfo.codecForDecoding() != null); - - if (oldInfo == null || oldInfo.codecForServer().equals(codecForServer.getText().toString())) - codecForServer.setText(networkInfo.codecForServer()); - - if (oldInfo == null || oldInfo.codecForEncoding().equals(codecForEncoding.getText().toString())) - codecForEncoding.setText(networkInfo.codecForEncoding()); - - if (oldInfo == null || oldInfo.codecForDecoding().equals(codecForDecoding.getText().toString())) - codecForDecoding.setText(networkInfo.codecForDecoding()); - - if (oldInfo == null || oldInfo.useAutoIdentify() == useAutoIdentify.isChecked()) - useAutoIdentify.setChecked(networkInfo.useAutoIdentify()); - - if (oldInfo == null || oldInfo.autoIdentifyService().equals(autoIdentifyService.getText().toString())) - autoIdentifyService.setText(networkInfo.autoIdentifyService()); - - if (oldInfo == null || oldInfo.autoIdentifyPassword().equals(autoIdentifyPassword.getText().toString())) - autoIdentifyPassword.setText(networkInfo.autoIdentifyPassword()); - - if (oldInfo == null || oldInfo.useSasl() == useSasl.isChecked()) - useSasl.setChecked(networkInfo.useSasl()); - - if (oldInfo == null || oldInfo.saslAccount().equals(saslAccount.getText().toString())) - saslAccount.setText(networkInfo.saslAccount()); - - if (oldInfo == null || oldInfo.saslPassword().equals(saslPassword.getText().toString())) - saslPassword.setText(networkInfo.saslPassword()); - - if (oldInfo == null || oldInfo.useAutoReconnect() == useAutoReconnect.isChecked()) - useAutoReconnect.setChecked(networkInfo.useAutoReconnect()); - - if (oldInfo == null || oldInfo.autoReconnectInterval() == NumberHelper.parseInt(autoReconnectInterval.getText().toString(), 0)) - autoReconnectInterval.setText(String.valueOf(networkInfo.autoReconnectInterval())); - - if (oldInfo == null || oldInfo.autoReconnectRetries() == NumberHelper.parseInt(autoReconnectRetries.getText().toString(), 0)) - autoReconnectRetries.setText(String.valueOf(networkInfo.autoReconnectRetries())); - - if (oldInfo == null || oldInfo.unlimitedReconnectRetries() == unlimitedAutoReconnectRetries.isChecked()) - unlimitedAutoReconnectRetries.setChecked(networkInfo.unlimitedReconnectRetries()); - - if (oldInfo == null || oldInfo.rejoinChannels() == rejoinChannels.isChecked()) - rejoinChannels.setChecked(networkInfo.rejoinChannels()); - } - } - } - - private int getIdentityPosition(NetworkInfo networkInfo) { - QIdentity identity = context.client().identityManager().identity(networkInfo.identity()); - return context.client().identityManager().identities().indexOf(identity); - } - - @Override - protected void onDisconnected() { - spinnerAdapter.setIdentityManager(null); - setNetwork(null); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java deleted file mode 100644 index 2fd7bda3c..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.client.NetworkManager; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.DividerItemDecoration; - -public class NetworkListActivity extends BoundActivity { - - final OnQNetworkClickListener clickListener = network -> { - if (network != null) { - Intent intent = new Intent(this, NetworkEditActivity.class); - intent.putExtra("id", network.networkId()); - startActivity(intent); - } - }; - NetworkManager manager; - @Bind(R.id.list) - RecyclerView list; - @Bind(R.id.add) - FloatingActionButton add; - @Bind(R.id.toolbar) - Toolbar toolbar; - NetworkAdapter adapter; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_network_list); - ButterKnife.bind(this); - - list.setLayoutManager(new LinearLayoutManager(this)); - list.setItemAnimator(new DefaultItemAnimator()); - adapter = new NetworkAdapter(); - list.setAdapter(adapter); - list.addItemDecoration(new DividerItemDecoration(this)); - - add.setOnClickListener(view -> startActivity(new Intent(this, NetworkCreateActivity.class))); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - protected void onConnected() { - manager = context.client().networkManager(); - adapter.setManager(manager); - } - - @Override - protected void onDisconnected() { - manager = null; - adapter.setManager(null); - } - - interface OnQNetworkClickListener { - void onClick(QNetwork network); - } - - private class NetworkAdapter extends RecyclerView.Adapter<NetworkViewHolder> { - final AdapterUICallbackWrapper wrapper = new AdapterUICallbackWrapper(this); - NetworkManager manager; - - public void setManager(NetworkManager manager) { - if (this.manager != null) - this.manager.networks().addCallback(wrapper); - - this.manager = manager; - - if (this.manager != null) - this.manager.networks().addCallback(wrapper); - } - - @Override - public NetworkViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(R.layout.widget_settings_network, parent, false); - return new NetworkViewHolder(view); - } - - @Override - public void onBindViewHolder(NetworkViewHolder holder, int position) { - holder.bind(manager != null ? manager.networks().get(position) : null); - } - - @Override - public int getItemCount() { - return manager == null ? 0 : manager.networks().size(); - } - } - - class NetworkViewHolder extends RecyclerView.ViewHolder { - - @Bind(R.id.network_name) - TextView name; - - private QNetwork network; - - public NetworkViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(view -> clickListener.onClick(network)); - } - - public void bind(QNetwork network) { - this.network = network; - name.setText(network == null ? "" : network.networkName()); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkSpinnerAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkSpinnerAdapter.java deleted file mode 100644 index 5ad2ef240..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkSpinnerAdapter.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network; - -import android.content.Context; -import android.content.res.Resources; -import android.database.DataSetObserver; -import android.support.annotation.Nullable; -import android.support.v7.view.ContextThemeWrapper; -import android.support.v7.widget.ThemedSpinnerAdapter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import de.kuschku.libquassel.client.NetworkManager; -import de.kuschku.libquassel.syncables.types.interfaces.QNetwork; -import de.kuschku.quasseldroid_ng.R; - -public class NetworkSpinnerAdapter implements ThemedSpinnerAdapter { - private final FakeNetworksWrapper wrapper; - @Nullable - private Resources.Theme theme; - - public NetworkSpinnerAdapter(Context context) { - wrapper = new FakeNetworksWrapper(context); - } - - - public void setNetworkManager(NetworkManager networkManager) { - wrapper.setBase(networkManager.networks()); - } - - @Nullable - @Override - public Resources.Theme getDropDownViewTheme() { - return theme; - } - - @Override - public void setDropDownViewTheme(@Nullable Resources.Theme theme) { - this.theme = theme; - } - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(new ContextThemeWrapper(parent.getContext(), theme)); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - QNetwork networks = getItem(position); - view.setText(networks == null ? "" : networks.networkName()); - return view; - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - wrapper.addObserver(observer); - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - wrapper.removeObserver(observer); - } - - @Override - public int getCount() { - return wrapper.getCount(); - } - - @Override - public QNetwork getItem(int position) { - return wrapper.get(position); - } - - @Override - public long getItemId(int position) { - QNetwork network = getItem(position); - if (network != null) - return network.networkId(); - else - return -1; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_inline, parent, false); - QNetwork networks = getItem(position); - view.setText(networks == null ? "" : networks.networkName()); - return view; - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return getCount() == 0; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerAdapter.java deleted file mode 100644 index d9a565de8..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerAdapter.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network.server; - -import android.graphics.Color; -import android.graphics.drawable.Drawable; -import android.support.v4.content.res.ResourcesCompat; -import android.support.v4.view.MotionEventCompat; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import java.util.Collections; -import java.util.List; -import java.util.Locale; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.ItemTouchHelperAdapter; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.ItemTouchHelperViewHolder; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.OnStartDragListener; -import de.kuschku.util.annotationbind.AutoBinder; - -public class NetworkServerAdapter - extends RecyclerView.Adapter<NetworkServerAdapter.NetworkServerViewHolder> implements ItemTouchHelperAdapter { - - private final List<NetworkServer> servers; - private final OnStartDragListener dragStartListener; - private NetworkServerListActivity.OnNetworkServerClickListener onItemClickListener; - - public NetworkServerAdapter(List<NetworkServer> servers, OnStartDragListener dragStartListener) { - this.servers = servers; - this.dragStartListener = dragStartListener; - } - - @Override - public NetworkServerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - View view = inflater.inflate(R.layout.widget_networkserver, parent, false); - return new NetworkServerViewHolder(view); - } - - @Override - public void onBindViewHolder(NetworkServerViewHolder holder, int position) { - holder.bind(servers.get(position)); - holder.drag_handle.setOnTouchListener((v, event) -> { - if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) { - dragStartListener.onStartDrag(holder); - holder.itemView.setSelected(true); - } - return false; - }); - } - - @Override - public int getItemCount() { - return servers.size(); - } - - @Override - public boolean onItemMove(int fromPosition, int toPosition) { - Collections.swap(servers, fromPosition, toPosition); - notifyItemMoved(fromPosition, toPosition); - return true; - } - - public void setOnItemClickListener(NetworkServerListActivity.OnNetworkServerClickListener onItemClickListener) { - this.onItemClickListener = onItemClickListener; - } - - class NetworkServerViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder { - - @Bind(R.id.text) - TextView text; - - @Bind(R.id.lock) - ImageView lock; - - @Bind(R.id.drag_handle) - ImageView drag_handle; - private NetworkServer server; - - public NetworkServerViewHolder(View itemView) { - super(itemView); - ButterKnife.bind(this, itemView); - itemView.setOnClickListener(v -> onItemClickListener.onClick(server)); - } - - public void bind(NetworkServer server) { - this.server = server; - text.setText(server == null ? "" : String.format(Locale.US, "%s:%d", server.host, server.port)); - Drawable drawable = ResourcesCompat.getDrawable(itemView.getContext().getResources(), server != null && server.useSSL ? R.drawable.ic_lock : R.drawable.ic_lock_open, itemView.getContext().getTheme()); - lock.setImageDrawable(drawable); - } - - @Override - public void onItemSelected() { - itemView.setBackgroundColor(AutoBinder.obtainColor(R.attr.colorBackground, itemView.getContext().getTheme())); - } - - @Override - public void onItemClear() { - itemView.setBackgroundColor(Color.TRANSPARENT); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerEditActivity.java deleted file mode 100644 index c864b1d35..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerEditActivity.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network.server; - -import android.content.Intent; -import android.database.DataSetObserver; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.SwitchCompat; -import android.support.v7.widget.Toolbar; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; -import android.widget.TextView; - -import java.util.Arrays; -import java.util.List; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.NetworkServerSerializeHelper; -import de.kuschku.util.backports.NumberHelper; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.AnimationHelper; - -public class NetworkServerEditActivity extends BoundActivity { - - public static final int RESULT_DELETE = -2; - - @Bind(R.id.toolbar) - Toolbar toolbar; - - - @Bind(R.id.host) - EditText host; - - @Bind(R.id.port) - EditText port; - - @Bind(R.id.useSSL) - CheckBox useSSL; - - @Bind(R.id.password) - EditText password; - - - @Bind(R.id.useProxy) - SwitchCompat useProxy; - @Bind(R.id.groupProxy) - ViewGroup groupProxy; - @Bind(R.id.proxyHost) - EditText proxyHost; - @Bind(R.id.proxyPort) - EditText proxyPort; - @Bind(R.id.proxyType) - Spinner proxyType; - @Bind(R.id.proxyUser) - EditText proxyUser; - @Bind(R.id.proxyPassword) - EditText proxyPassword; - - int id; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - setContentView(R.layout.activity_networkserver_edit); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - useProxy.setOnCheckedChangeListener(this::updateProxyVisible); - updateProxyVisible(null, useProxy.isChecked()); - - ProxyTypeAdapter adapter = new ProxyTypeAdapter(); - proxyType.setAdapter(adapter); - - Intent intent; - Bundle bundle = null; - if ((intent = getIntent()) != null) { - id = intent.getIntExtra("id", -1); - - bundle = intent.getBundleExtra("server"); - } - - if (bundle != null) { - NetworkServer server = NetworkServerSerializeHelper.deserialize(bundle); - - host.setText(server.host); - port.setText(String.valueOf(server.port)); - useSSL.setChecked(server.useSSL); - password.setText(server.password); - useProxy.setChecked(server.useProxy); - proxyHost.setText(server.proxyHost); - proxyPort.setText(String.valueOf(server.proxyPort)); - proxyUser.setText(server.proxyUser); - proxyPassword.setText(server.proxyPass); - proxyType.setSelection(adapter.indexOf(server.proxyType)); - } else { - port.setText("6667"); - } - - useSSL.setOnCheckedChangeListener((buttonView, isChecked) -> { - if (isChecked) { - if (port.getText().toString().trim().equals("6667")) - port.setText("6697"); - } else { - if (port.getText().toString().trim().equals("6697")) - port.setText("6667"); - } - }); - } - - private void updateProxyVisible(CompoundButton button, boolean visible) { - proxyHost.setEnabled(visible); - proxyPort.setEnabled(visible); - proxyUser.setEnabled(visible); - proxyPassword.setEnabled(visible); - - updateViewGroupStatus(groupProxy, visible); - } - - private void updateViewGroupStatus(ViewGroup group, boolean visible) { - if (visible) { - AnimationHelper.expand(group); - } else { - AnimationHelper.collapse(group); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - if (id == -1) - getMenuInflater().inflate(R.menu.confirm, menu); - else - getMenuInflater().inflate(R.menu.confirm_delete, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_delete: { - Intent intent = new Intent(); - intent.putExtra("id", id); - setResult(RESULT_DELETE, intent); - finish(); - } - return true; - case R.id.action_confirm: { - Intent intent = new Intent(); - intent.putExtra("server", NetworkServerSerializeHelper.serialize(new NetworkServer( - useSSL.isChecked(), - 0, - host.getText().toString(), - NumberHelper.parseInt(port.getText().toString(), 0), - password.getText().toString(), - useProxy.isChecked(), - NetworkServer.ProxyType.fromId((int) proxyType.getSelectedItemId()), - proxyHost.getText().toString(), - NumberHelper.parseInt(proxyPort.getText().toString(), 0), - proxyUser.getText().toString(), - proxyPassword.getText().toString() - ))); - intent.putExtra("id", id); - setResult(RESULT_OK, intent); - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - private class ProxyTypeAdapter implements SpinnerAdapter { - final List<NetworkServer.ProxyType> list = Arrays.asList( - NetworkServer.ProxyType.Socks5Proxy, - NetworkServer.ProxyType.HttpProxy - ); - - @Override - public View getDropDownView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_toolbar, parent, false); - NetworkServer.ProxyType type = getItem(position); - view.setText(type == null ? "" : context.themeUtil().translations.proxyType(type)); - return view; - } - - @Override - public void registerDataSetObserver(DataSetObserver observer) { - - } - - @Override - public void unregisterDataSetObserver(DataSetObserver observer) { - - } - - @Override - public int getCount() { - return list.size(); - } - - @Override - public NetworkServer.ProxyType getItem(int position) { - return list.get(position); - } - - @Override - public long getItemId(int position) { - return getItem(position).id; - } - - @Override - public boolean hasStableIds() { - return true; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - LayoutInflater inflater = LayoutInflater.from(parent.getContext()); - TextView view = (TextView) inflater.inflate(R.layout.widget_spinner_item_inline, parent, false); - NetworkServer.ProxyType type = getItem(position); - view.setText(type == null ? "" : context.themeUtil().translations.proxyType(type)); - return view; - } - - @Override - public int getItemViewType(int position) { - return 0; - } - - @Override - public int getViewTypeCount() { - return 1; - } - - @Override - public boolean isEmpty() { - return list.isEmpty(); - } - - public int indexOf(NetworkServer.ProxyType proxyType) { - return list.indexOf(proxyType); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerListActivity.java deleted file mode 100644 index 4c6c5f5ac..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/NetworkServerListActivity.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network.server; - -import android.content.Intent; -import android.os.Bundle; -import android.os.Parcelable; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.support.v7.widget.helper.ItemTouchHelper; -import android.view.Menu; -import android.view.MenuItem; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.NetworkServerSerializeHelper; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.OnStartDragListener; -import de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper.SimpleItemTouchHelperCallback; -import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper; -import de.kuschku.util.observables.lists.ObservableList; -import de.kuschku.util.servicebound.BoundActivity; -import de.kuschku.util.ui.DividerItemDecoration; - -public class NetworkServerListActivity extends BoundActivity implements OnStartDragListener { - - @Bind(R.id.list) - RecyclerView list; - - @Bind(R.id.add) - FloatingActionButton add; - - @Bind(R.id.toolbar) - Toolbar toolbar; - - NetworkServerAdapter adapter; - ItemTouchHelper itemTouchHelper; - ObservableList<NetworkServer> servers; - final OnNetworkServerClickListener clickListener = server -> { - if (server != null) { - Intent intent1 = new Intent(this, NetworkServerEditActivity.class); - intent1.putExtra("server", NetworkServerSerializeHelper.serialize(server)); - intent1.putExtra("id", servers.indexOf(server)); - startActivityForResult(intent1, 0, null); - } - }; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_network_list); - ButterKnife.bind(this); - - Intent intent = getIntent(); - Parcelable[] serverList; - if (intent != null && (serverList = intent.getParcelableArrayExtra("servers")) != null) { - servers = new ObservableList<>(NetworkServerSerializeHelper.deserialize(serverList)); - } else { - servers = new ObservableList<>(); - } - adapter = new NetworkServerAdapter(servers, this); - servers.addCallback(new AdapterUICallbackWrapper(adapter)); - - list.setAdapter(adapter); - list.setHasFixedSize(true); - list.setLayoutManager(new LinearLayoutManager(this)); - list.addItemDecoration(new DividerItemDecoration(this)); - adapter.setOnItemClickListener(clickListener); - - ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter); - itemTouchHelper = new ItemTouchHelper(callback); - itemTouchHelper.attachToRecyclerView(list); - - add.setOnClickListener(v -> { - Intent intent1 = new Intent(NetworkServerListActivity.this, NetworkServerEditActivity.class); - startActivityForResult(intent1, 0, null); - }); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.confirm, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_confirm: { - Intent intent = new Intent(); - intent.putExtra("servers", NetworkServerSerializeHelper.serialize(servers)); - setResult(RESULT_OK, intent); - finish(); - } - return true; - default: - return super.onOptionsItemSelected(item); - } - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - Bundle bundle; - if (resultCode == RESULT_OK && data != null && (bundle = data.getBundleExtra("server")) != null) { - NetworkServer server = NetworkServerSerializeHelper.deserialize(bundle); - int id = data.getIntExtra("id", -1); - if (id == -1) { - servers.add(server); - } else { - servers.set(id, server); - } - } else if (resultCode == NetworkServerEditActivity.RESULT_DELETE && data != null) { - int id = data.getIntExtra("id", -1); - if (id != -1) { - servers.remove(id); - } - } - super.onActivityResult(requestCode, resultCode, data); - } - - @Override - protected void onPause() { - super.onPause(); - } - - @Override - public void onStartDrag(RecyclerView.ViewHolder viewHolder) { - itemTouchHelper.startDrag(viewHolder); - } - - interface OnNetworkServerClickListener { - void onClick(NetworkServer network); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/ItemTouchHelperAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/ItemTouchHelperAdapter.java deleted file mode 100644 index 7411dae15..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/ItemTouchHelperAdapter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* - * Copyright (C) 2015 Paul Burke - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper; - -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; - -/** - * Interface to listen for a move or dismissal event from a {@link ItemTouchHelper.Callback}. - * - * @author Paul Burke (ipaulpro) - */ -public interface ItemTouchHelperAdapter { - - /** - * Called when an item has been dragged far enough to trigger a move. This is called every time - * an item is shifted, and <strong>not</strong> at the end of a "drop" event.<br/> - * <br/> - * Implementations should call {@link RecyclerView.Adapter#notifyItemMoved(int, int)} after - * adjusting the underlying data to reflect this move. - * - * @param fromPosition The start position of the moved item. - * @param toPosition Then resolved position of the moved item. - * @return True if the item was moved to the new adapter position. - * @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder) - * @see RecyclerView.ViewHolder#getAdapterPosition() - */ - boolean onItemMove(int fromPosition, int toPosition); -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/ItemTouchHelperViewHolder.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/ItemTouchHelperViewHolder.java deleted file mode 100644 index 1657e4d99..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/ItemTouchHelperViewHolder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* - * Copyright (C) 2015 Paul Burke - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper; - -import android.support.v7.widget.helper.ItemTouchHelper; - -/** - * Interface to notify an item ViewHolder of relevant callbacks from {@link - * android.support.v7.widget.helper.ItemTouchHelper.Callback}. - * - * @author Paul Burke (ipaulpro) - */ -public interface ItemTouchHelperViewHolder { - - /** - * Called when the {@link ItemTouchHelper} first registers an item as being moved or swiped. - * Implementations should update the item view to indicate it's active state. - */ - void onItemSelected(); - - - /** - * Called when the {@link ItemTouchHelper} has completed the move or swipe, and the active item - * state should be cleared. - */ - void onItemClear(); -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/NetworkServerSerializeHelper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/NetworkServerSerializeHelper.java deleted file mode 100644 index 1a0703167..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/NetworkServerSerializeHelper.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper; - -import android.os.Bundle; -import android.os.Parcelable; -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.List; - -import de.kuschku.libquassel.objects.types.NetworkServer; - -public class NetworkServerSerializeHelper { - public static Bundle[] serialize(List<NetworkServer> servers) { - Bundle[] list = new Bundle[servers.size()]; - for (int i = 0; i < servers.size(); i++) { - NetworkServer server = servers.get(i); - Bundle bundle = serialize(server); - list[i] = bundle; - } - return list; - } - - @NonNull - public static Bundle serialize(NetworkServer server) { - Bundle bundle = new Bundle(); - bundle.putBoolean("useSSL", server.useSSL); - bundle.putInt("sslVersion", server.sslVersion); - bundle.putString("host", server.host); - bundle.putInt("port", server.port); - bundle.putString("password", server.password); - bundle.putBoolean("useProxy", server.useProxy); - bundle.putInt("proxyType", server.proxyType.id); - bundle.putString("proxyHost", server.proxyHost); - bundle.putInt("proxyPort", server.proxyPort); - bundle.putString("proxyUser", server.proxyUser); - bundle.putString("proxyPass", server.proxyPass); - return bundle; - } - - @NonNull - public static List<NetworkServer> deserialize(Parcelable[] serverList) { - List<NetworkServer> servers = new ArrayList<>(serverList.length); - for (Parcelable parcelable : serverList) { - Bundle bundle = (Bundle) parcelable; - servers.add(deserialize(bundle)); - } - return servers; - } - - @NonNull - public static NetworkServer deserialize(Bundle bundle) { - return new NetworkServer( - bundle.getBoolean("useSSL"), - bundle.getInt("sslVersion"), - bundle.getString("host"), - bundle.getInt("port"), - bundle.getString("password"), - bundle.getBoolean("useProxy"), - NetworkServer.ProxyType.fromId(bundle.getInt("proxyType")), - bundle.getString("proxyHost"), - bundle.getInt("proxyPort"), - bundle.getString("proxyUser"), - bundle.getString("proxyPass") - ); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/OnStartDragListener.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/OnStartDragListener.java deleted file mode 100644 index 2fb08cc03..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/OnStartDragListener.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* - * Copyright (C) 2015 Paul Burke - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper; - -import android.support.v7.widget.RecyclerView; - -/** - * Listener for manual initiation of a drag. - */ -public interface OnStartDragListener { - - /** - * Called when a view is requesting a start of a drag. - * - * @param viewHolder The holder of the view to drag. - */ - void onStartDrag(RecyclerView.ViewHolder viewHolder); - -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/SimpleItemTouchHelperCallback.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/SimpleItemTouchHelperCallback.java deleted file mode 100644 index 8d74c627c..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/server/helper/SimpleItemTouchHelperCallback.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* - * Copyright (C) 2015 Paul Burke - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package de.kuschku.quasseldroid_ng.ui.coresettings.network.server.helper; - -import android.graphics.Canvas; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.helper.ItemTouchHelper; - -/** - * An implementation of {@link ItemTouchHelper.Callback} that enables basic drag & drop and - * swipe-to-dismiss. Drag events are automatically started by an item long-press.<br/> - * </br/> - * Expects the <code>RecyclerView.Adapter</code> to listen for {@link - * ItemTouchHelperAdapter} callbacks and the <code>RecyclerView.ViewHolder</code> to implement - * {@link ItemTouchHelperViewHolder}. - * - * @author Paul Burke (ipaulpro) - */ -public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback { - - public static final float ALPHA_FULL = 1.0f; - - private final ItemTouchHelperAdapter mAdapter; - - public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) { - mAdapter = adapter; - } - - @Override - public boolean isLongPressDragEnabled() { - return true; - } - - @Override - public boolean isItemViewSwipeEnabled() { - return false; - } - - @Override - public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { - // Set movement flags based on the layout manager - if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { - final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; - final int swipeFlags = 0; - return makeMovementFlags(dragFlags, swipeFlags); - } else { - final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; - final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; - return makeMovementFlags(dragFlags, swipeFlags); - } - } - - @Override - public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) { - if (source.getItemViewType() != target.getItemViewType()) { - return false; - } - - // Notify the adapter of the move - mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition()); - return true; - } - - @Override - public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) { - } - - @Override - public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { - if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { - // Fade out the view as it is swiped out of the parent's bounds - final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth(); - viewHolder.itemView.setAlpha(alpha); - viewHolder.itemView.setTranslationX(dX); - } else { - super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); - } - } - - @Override - public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { - // We only want the active item to change - if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) { - if (viewHolder instanceof ItemTouchHelperViewHolder) { - // Let the view holder know that this item is being moved or dragged - ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; - itemViewHolder.onItemSelected(); - } - } - - super.onSelectedChanged(viewHolder, actionState); - } - - @Override - public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { - super.clearView(recyclerView, viewHolder); - - viewHolder.itemView.setAlpha(ALPHA_FULL); - - if (viewHolder instanceof ItemTouchHelperViewHolder) { - // Tell the view holder it's time to restore the idle state - ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder; - itemViewHolder.onItemClear(); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java deleted file mode 100644 index 9df8fb9ce..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/editor/AdvancedEditor.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.editor; - -import android.graphics.Typeface; -import android.support.annotation.ColorInt; -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; -import android.text.Spanned; -import android.text.style.BackgroundColorSpan; -import android.text.style.ForegroundColorSpan; -import android.text.style.StyleSpan; -import android.text.style.UnderlineSpan; -import android.widget.EditText; - -import com.google.common.base.Function; - -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.irc.format.spans.Copyable; -import de.kuschku.util.irc.format.spans.IrcBackgroundColorSpan; -import de.kuschku.util.irc.format.spans.IrcBoldSpan; -import de.kuschku.util.irc.format.spans.IrcForegroundColorSpan; -import de.kuschku.util.irc.format.spans.IrcItalicSpan; -import de.kuschku.util.irc.format.spans.IrcUnderlineSpan; - -public class AdvancedEditor { - private final AppContext context; - private final EditText editText; - - public AdvancedEditor(AppContext context, EditText editText) { - this.context = context; - this.editText = editText; - } - - public void toggleUnderline() { - toggleUnderline(editText.getSelectionStart(), editText.getSelectionEnd()); - } - - public void toggleUnderline(int start, int end) { - if (start == end) - return; - - boolean isUnderline = removeSpans(start, end, UnderlineSpan.class, styleSpan -> { - if (styleSpan instanceof IrcUnderlineSpan) { - return (IrcUnderlineSpan) styleSpan; - } else { - return new IrcUnderlineSpan(); - } - }, false); - if (!isUnderline) { - editText.getText().setSpan(new IrcUnderlineSpan(), start, end, Spanned.SPAN_MARK_MARK); - } - } - - - public void toggleBold() { - toggleBold(editText.getSelectionStart(), editText.getSelectionEnd()); - } - - public void toggleBold(int start, int end) { - if (start == end) - return; - - boolean isBold = removeSpans(start, end, StyleSpan.class, styleSpan -> { - if (styleSpan instanceof IrcBoldSpan) { - return (IrcBoldSpan) styleSpan; - } else { - return styleSpan.getStyle() == Typeface.BOLD ? new IrcBoldSpan() : null; - } - }, false); - if (!isBold) { - editText.getText().setSpan(new IrcBoldSpan(), start, end, Spanned.SPAN_MARK_MARK); - } - } - - public void toggleItalic() { - toggleItalic(editText.getSelectionStart(), editText.getSelectionEnd()); - } - - public void toggleItalic(int start, int end) { - if (start == end) - return; - - boolean isItalic = removeSpans(start, end, StyleSpan.class, styleSpan -> { - if (styleSpan instanceof IrcItalicSpan) { - return (IrcItalicSpan) styleSpan; - } else { - return styleSpan.getStyle() == Typeface.ITALIC ? new IrcItalicSpan() : null; - } - }, false); - if (!isItalic) { - editText.getText().setSpan(new IrcItalicSpan(), start, end, Spanned.SPAN_MARK_MARK); - } - } - - public void toggleForeground(@IntRange(from = -1, to = 15) int color) { - toggleForeground(editText.getSelectionStart(), editText.getSelectionEnd(), color); - } - - public void toggleForeground(int start, int end, int color) { - removeSpans(start, end, ForegroundColorSpan.class, foregroundColorSpan -> { - if ((foregroundColorSpan instanceof IrcForegroundColorSpan)) { - return (IrcForegroundColorSpan) foregroundColorSpan; - } else { - int id = context.themeUtil().res.colorToId(foregroundColorSpan.getForegroundColor()); - if (id != -1) { - return new IrcForegroundColorSpan(id, context.themeUtil().res.mircColors[id]); - } else { - return null; - } - } - }, true); - - if (color != -1) { - editText.getText().setSpan(new IrcForegroundColorSpan(color, context.themeUtil().res.mircColors[color]), start, end, Spanned.SPAN_MARK_MARK); - } - } - - private <T extends Copyable<T>, U> boolean removeSpans(int start, int end, Class<U> group, Function<U, T> transformer, boolean removeInvalid) { - if (start == end) - return false; - - boolean removedAny = false; - - for (U raw : editText.getText().getSpans(start, end, group)) { - int spanFlags = editText.getText().getSpanFlags(raw); - if ((spanFlags & Spanned.SPAN_COMPOSING) != 0) continue; - - int spanEnd = editText.getText().getSpanEnd(raw); - int spanStart = editText.getText().getSpanStart(raw); - - T span = transformer.apply(raw); - if (span != raw) { - if (span == null) { - if (removeInvalid) - editText.getText().removeSpan(raw); - continue; - } else { - editText.getText().removeSpan(raw); - editText.getText().setSpan(span, spanStart, spanEnd, spanFlags); - } - } - - boolean endIsIn = (spanEnd <= end && spanEnd >= start); - boolean endIsAfter = (spanEnd >= end); - - boolean startIsIn = (spanStart <= end && spanStart >= start); - boolean startIsBefore = (spanStart < start); - - if (endIsIn && startIsIn) { - editText.getText().removeSpan(span); - removedAny = true; - } else if (endIsIn) { - editText.getText().setSpan(span, spanStart, start, spanFlags); - removedAny = true; - } else if (startIsIn) { - editText.getText().setSpan(span, end, spanEnd, spanFlags); - removedAny = true; - } else if (startIsBefore && endIsAfter) { - editText.getText().setSpan(span, spanStart, start, spanFlags); - editText.getText().setSpan(span.copy(), end, spanEnd, spanFlags); - removedAny = true; - } - } - return removedAny; - } - - public void toggleBackground(@IntRange(from = -1, to = 15) int color) { - toggleBackground(editText.getSelectionStart(), editText.getSelectionEnd(), color); - } - - public void toggleBackground(int start, int end, @ColorInt int color) { - removeSpans(start, end, BackgroundColorSpan.class, backgroundColorSpan -> { - if ((backgroundColorSpan instanceof IrcBackgroundColorSpan)) { - return (IrcBackgroundColorSpan) backgroundColorSpan; - } else { - int id = context.themeUtil().res.colorToId(backgroundColorSpan.getBackgroundColor()); - if (id != -1) { - return new IrcBackgroundColorSpan(id, context.themeUtil().res.mircColors[id]); - } else { - return null; - } - } - }, true); - - if (color != -1) { - editText.getText().setSpan(new IrcBackgroundColorSpan(color, context.themeUtil().res.mircColors[color]), start, end, Spanned.SPAN_MARK_MARK); - } - } - - @NonNull - public String toFormatString() { - return context.serializer().toEscapeCodes(editText.getText()); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.java deleted file mode 100644 index d2dc408c0..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/Settings.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.settings; - -import android.content.Context; -import android.content.SharedPreferences; -import android.support.v7.preference.PreferenceManager; - -import de.kuschku.quasseldroid_ng.ui.theme.PreferenceStrings; -import de.kuschku.util.preferences.BooleanPreference; -import de.kuschku.util.preferences.IntPreference; -import de.kuschku.util.preferences.StringPreference; - -public class Settings { - public final StringPreference preferenceLastAccount; - - public final StringPreference preferenceTheme; - public final BooleanPreference preferenceColors; - public final BooleanPreference preferenceBrackets; - public final BooleanPreference preferenceHostmask; - public final BooleanPreference preferenceLag; - public final IntPreference preferenceFontSize; - - - @SuppressWarnings("FieldCanBeLocal") - // THIS FIELD CAN NOT BE LOCAL, OR IT WILL NOT WORK - private final SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener; - - public Settings(PreferenceStrings prefs, SharedPreferences pref) { - this.preferenceLastAccount = new StringPreference(pref, prefs.preferenceLastAccount, ""); - - this.preferenceTheme = new StringPreference(pref, prefs.preferenceTheme, "QUASSEL_LIGHT"); - this.preferenceColors = new BooleanPreference(pref, prefs.preferenceColors, true); - this.preferenceBrackets = new BooleanPreference(pref, prefs.preferenceBrackets, false); - this.preferenceHostmask = new BooleanPreference(pref, prefs.preferenceHostmask, false); - this.preferenceLag = new BooleanPreference(pref, prefs.preferenceLag, false); - this.preferenceFontSize = new IntPreference(pref, prefs.preferenceFontSize, 14); - - onSharedPreferenceChangeListener = (preferences, key) -> { - if (prefs.preferenceLastAccount.equals(key)) preferenceLastAccount.change(); - - if (prefs.preferenceTheme.equals(key)) preferenceTheme.change(); - if (prefs.preferenceColors.equals(key)) preferenceColors.change(); - if (prefs.preferenceBrackets.equals(key)) preferenceBrackets.change(); - if (prefs.preferenceHostmask.equals(key)) preferenceHostmask.change(); - if (prefs.preferenceLag.equals(key)) preferenceLag.change(); - if (prefs.preferenceFontSize.equals(key)) preferenceFontSize.change(); - }; - - pref.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener); - } - - public Settings(Context ctx) { - this(new PreferenceStrings(ctx), PreferenceManager.getDefaultSharedPreferences(ctx)); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.java deleted file mode 100644 index 597e228b8..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/settings/SettingsActivity.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.settings; - -import android.app.FragmentTransaction; -import android.os.Bundle; -import android.preference.PreferenceFragment; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.chat.util.ServiceHelper; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.quasseldroid_ng.ui.theme.AppTheme; - -public class SettingsActivity extends AppCompatActivity { - - final AppContext context = new AppContext(); - - @Bind(R.id.toolbar) - Toolbar toolbar; - - int themeid; - - @Override - public void onCreate(Bundle savedInstanceState) { - themeid = ServiceHelper.initContext(context, this); - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_settings); - ButterKnife.bind(this); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - setPreferenceFragment(new AppearanceFragment()); - - context.settings().preferenceTheme.addChangeListener(value -> restart()); - } - - @Override - protected void onPause() { - super.onPause(); - } - - @Override - protected void onResume() { - super.onResume(); - if (themeid != AppTheme.resFromString(context.settings().preferenceTheme.get())) - restart(); - } - - public void restart() { - startActivity(getIntent()); - finish(); - overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); - } - - public void setPreferenceFragment(PreferenceFragment preferenceFragment) { - FragmentTransaction transaction = getFragmentManager().beginTransaction(); - transaction.replace(R.id.content_host, preferenceFragment); - transaction.commit(); - } - - public static class AppearanceFragment extends PreferenceFragment { - final AppContext context = new AppContext(); - - @Override - public void onCreate(Bundle savedInstanceState) { - ServiceHelper.initContext(context, getActivity()); - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.pref_appearance); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java deleted file mode 100644 index 14ab0fc12..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.support.annotation.ColorInt; -import android.support.v7.widget.AppCompatImageButton; -import android.support.v7.widget.AppCompatRadioButton; -import android.support.v7.widget.RecyclerView; -import android.util.Pair; -import android.view.View; -import android.widget.TextView; - -import com.mikepenz.fastadapter.utils.ViewHolderFactory; -import com.mikepenz.materialdrawer.model.AbstractDrawerItem; -import com.mikepenz.materialdrawer.util.DrawerUIUtils; - -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.accounts.Account; - -public class AccountItem extends AbstractDrawerItem<AccountItem, AccountItem.ViewHolder> { - public final Account account; - protected Pair<Integer, ColorStateList> colorStateList; - private OnDeleteListener listener; - - public AccountItem(Account account) { - this.account = account; - } - - @Override - public int getType() { - return R.id.item_account; - } - - @Override - public int getLayoutRes() { - return R.layout.widget_core_account; - } - - @Override - public boolean isSelectable() { - return true; - } - - @Override - public void bindView(ViewHolder viewHolder) { - Context ctx = viewHolder.itemView.getContext(); - - //set the identifier from the drawerItem here. It can be used to run tests - viewHolder.itemView.setId(hashCode()); - - //set the item selected if it is - viewHolder.itemView.setSelected(isSelected()); - - //get the correct color for the text - int color = getColor(ctx); - int selectedTextColor = getSelectedTextColor(ctx); - - viewHolder.name.setText(account.name); - - viewHolder.select.setChecked(isSelected()); - viewHolder.select.setClickable(false); - - viewHolder.description.setText(viewHolder.itemView.getContext().getString(R.string.labelUserOnHost, account.user, account.host)); - - viewHolder.name.setTextColor(getTextColorStateList(color, selectedTextColor)); - - viewHolder.description.setTextColor(getTextColorStateList(color, selectedTextColor)); - - viewHolder.delete.setOnClickListener(view -> listener.onDelete(this)); - - //for android API 17 --> Padding not applied via xml - DrawerUIUtils.setDrawerVerticalPadding(viewHolder.view); - - //call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required) - onPostBindView(this, viewHolder.itemView); - } - - @Override - public ViewHolderFactory<ViewHolder> getFactory() { - return new ItemFactory(); - } - - /** - * helper method to decide for the correct color - * - * @param ctx - * @return - */ - protected int getColor(Context ctx) { - int color; - if (this.isEnabled()) { - color = com.mikepenz.materialdrawer.R.color.material_drawer_primary_text; - } else { - color = com.mikepenz.materialdrawer.R.color.material_drawer_hint_text; - } - return color; - } - - /** - * helper method to decide for the correct color - * - * @param ctx - * @return - */ - protected int getSelectedTextColor(Context ctx) { - return com.mikepenz.materialdrawer.R.color.material_drawer_selected_text; - } - - /** - * helper to get the ColorStateList for the text and remembering it so we do not have to recreate it all the time - * - * @param color - * @param selectedTextColor - * @return - */ - protected ColorStateList getTextColorStateList(@ColorInt int color, @ColorInt int selectedTextColor) { - if (colorStateList == null || color + selectedTextColor != colorStateList.first) { - colorStateList = new Pair<>(color + selectedTextColor, DrawerUIUtils.getTextColorStateList(color, selectedTextColor)); - } - - return colorStateList.second; - } - - public void setOnDeleteListener(OnDeleteListener listener) { - this.listener = listener; - } - - public interface OnDeleteListener { - void onDelete(AccountItem item); - } - - public static class ItemFactory implements ViewHolderFactory<ViewHolder> { - public ViewHolder create(View v) { - return new ViewHolder(v); - } - } - - protected static class ViewHolder extends RecyclerView.ViewHolder { - private final View view; - private final AppCompatRadioButton select; - private final TextView name; - private final TextView description; - private final AppCompatImageButton delete; - - private ViewHolder(View view) { - super(view); - this.view = view; - this.select = (AppCompatRadioButton) view.findViewById(R.id.account_select); - this.name = (TextView) view.findViewById(R.id.account_name); - this.description = (TextView) view.findViewById(R.id.account_description); - this.delete = (AppCompatImageButton) view.findViewById(R.id.account_delete); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSelectActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSelectActivity.java deleted file mode 100644 index 7b2f80609..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSelectActivity.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDelegate; -import android.view.View; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.setup.slides.AccountSelectSlide; -import de.kuschku.quasseldroid_ng.ui.setup.slides.SlideFragment; - -public class AccountSelectActivity extends AppCompatActivity { - static { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - } - - @Bind(R.id.view_pager) - ViewPager viewPager; - @Bind(R.id.btn) - FloatingActionButton btn; - private SlidePagerAdapter slidePagerAdapter; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_setup); - ButterKnife.bind(this); - slidePagerAdapter = new SlidePagerAdapter(getSupportFragmentManager()); - - viewPager.setAdapter(slidePagerAdapter); - slidePagerAdapter.notifyDataSetChanged(); - updateValidity(slidePagerAdapter.item.isValid()); - btn.setImageResource(R.drawable.ic_check); - slidePagerAdapter.item.addChangeListener(this::updateValidity); - btn.setOnClickListener(v -> { - Bundle bundle = new Bundle(); - slidePagerAdapter.item.getData(bundle); - - Intent result = new Intent(); - result.putExtra("extra", bundle); - setResult(RESULT_OK, result); - finish(); - }); - } - - public void updateValidity(boolean validity) { - btn.setVisibility(validity ? View.VISIBLE : View.GONE); - slidePagerAdapter.notifyDataSetChanged(); - } - - private class SlidePagerAdapter extends FragmentPagerAdapter { - private final SlideFragment item = new AccountSelectSlide(); - - public SlidePagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public SlideFragment getItem(int position) { - return item; - } - - @Override - public int getCount() { - return 1; - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java deleted file mode 100644 index d5ee9b0e3..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDelegate; -import android.view.View; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.setup.slides.AccountSetupCoreSlide; -import de.kuschku.quasseldroid_ng.ui.setup.slides.AccountSetupNameSlide; -import de.kuschku.quasseldroid_ng.ui.setup.slides.AccountSetupUserSlide; -import de.kuschku.quasseldroid_ng.ui.setup.slides.SlideFragment; -import de.kuschku.util.accounts.Account; -import de.kuschku.util.accounts.AccountManager; - -public class AccountSetupActivity extends AppCompatActivity implements ValidUpdateCallback { - static { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - } - - @Bind(R.id.view_pager) - ViewPager viewPager; - @Bind(R.id.btn) - FloatingActionButton btn; - private SlidePagerAdapter slidePagerAdapter; - private int lastValidPage = -1; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_setup); - ButterKnife.bind(this); - - slidePagerAdapter = new SlidePagerAdapter(getSupportFragmentManager()); - viewPager.setAdapter(slidePagerAdapter); - - slidePagerAdapter.addFragment(new AccountSetupCoreSlide()); - slidePagerAdapter.addFragment(new AccountSetupUserSlide()); - slidePagerAdapter.addFragment(new AccountSetupNameSlide()); - - SlideFragment item = slidePagerAdapter.getItem(viewPager.getCurrentItem()); - - updateValidity(item.isValid()); - - btn.setOnClickListener(v -> { - if (viewPager.getCurrentItem() == slidePagerAdapter.getCount() - 1) { - onDone(); - } else { - viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true); - } - }); - - slidePagerAdapter.getItem(viewPager.getCurrentItem()).addChangeListener(AccountSetupActivity.this); - viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - SlideFragment slideFragment = slidePagerAdapter.getItem(viewPager.getCurrentItem()); - for (int i = 0; i < slidePagerAdapter.getCount(); i++) { - slidePagerAdapter.getItem(i).removeChangeListener(AccountSetupActivity.this); - } - slideFragment.addChangeListener(AccountSetupActivity.this); - updateValidity(slideFragment.isValid()); - if (viewPager.getCurrentItem() == slidePagerAdapter.list.size() - 1) { - btn.setImageResource(R.drawable.ic_check); - } else { - btn.setImageResource(R.drawable.ic_arrow_right); - } - } - - @Override - public void onPageScrollStateChanged(int state) { - - } - }); - } - - private void onDone() { - Bundle bundle = new Bundle(); - for (SlideFragment fragment : slidePagerAdapter.list) { - fragment.getData(bundle); - } - - setupAccount(bundle); - - Intent result = new Intent(); - result.putExtra("extra", bundle); - setResult(RESULT_OK, result); - finish(); - } - - private void setupAccount(Bundle bundle) { - AccountManager manager = new AccountManager(this); - manager.add(new Account( - UUID.randomUUID(), - bundle.getString("name"), - bundle.getString("host"), - bundle.getInt("port"), - bundle.getString("user"), - bundle.getString("pass") - )); - } - - public void updateValidity(boolean validity) { - btn.setVisibility(validity ? View.VISIBLE : View.GONE); - if (validity) { - lastValidPage = viewPager.getCurrentItem(); - } else { - lastValidPage = viewPager.getCurrentItem() - 1; - } - slidePagerAdapter.notifyDataSetChanged(); - } - - private class SlidePagerAdapter extends FragmentPagerAdapter { - final List<SlideFragment> list = new ArrayList<>(); - - public SlidePagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public SlideFragment getItem(int position) { - return list.get(position); - } - - @Override - public int getCount() { - return Math.min(lastValidPage + 2, list.size()); - } - - public void addFragment(SlideFragment fragment) { - list.add(fragment); - notifyDataSetChanged(); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CoreSetupActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CoreSetupActivity.java deleted file mode 100644 index c459aa991..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CoreSetupActivity.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup; - -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDelegate; -import android.view.View; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.setup.slides.CoreBackendSelectSlide; -import de.kuschku.quasseldroid_ng.ui.setup.slides.CoreBackendSetupSlide; -import de.kuschku.quasseldroid_ng.ui.setup.slides.SlideFragment; - -public class CoreSetupActivity extends AppCompatActivity implements ValidUpdateCallback { - static { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - } - - @Bind(R.id.view_pager) - ViewPager viewPager; - @Bind(R.id.btn) - FloatingActionButton btn; - private SlidePagerAdapter slidePagerAdapter; - private int lastValidPage = -1; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Intent intent = getIntent(); - if (intent == null) { - finish(); - return; - } - - setContentView(R.layout.activity_setup); - ButterKnife.bind(this); - - slidePagerAdapter = new SlidePagerAdapter(getSupportFragmentManager()); - viewPager.setAdapter(slidePagerAdapter); - - CoreBackendSelectSlide backendSelectSlide = new CoreBackendSelectSlide(); - backendSelectSlide.setArguments(intent.getExtras()); - CoreBackendSetupSlide backendSetupSlide = new CoreBackendSetupSlide(); - backendSetupSlide.setArguments(intent.getExtras()); - - slidePagerAdapter.addFragment(backendSelectSlide); - slidePagerAdapter.addFragment(backendSetupSlide); - - SlideFragment item = slidePagerAdapter.getItem(viewPager.getCurrentItem()); - - updateValidity(item.isValid()); - - btn.setOnClickListener(v -> { - if (viewPager.getCurrentItem() == slidePagerAdapter.getCount() - 1) { - onDone(); - } else { - viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true); - } - }); - - slidePagerAdapter.getItem(viewPager.getCurrentItem()).addChangeListener(CoreSetupActivity.this); - viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - SlideFragment slideFragment = slidePagerAdapter.getItem(viewPager.getCurrentItem()); - Bundle bundle = new Bundle(); - for (int i = 0; i < slidePagerAdapter.getCount(); i++) { - slidePagerAdapter.getItem(i).removeChangeListener(CoreSetupActivity.this); - slidePagerAdapter.getItem(i).getData(bundle); - } - slideFragment.addChangeListener(CoreSetupActivity.this); - slidePagerAdapter.getItem(position).setData(bundle); - updateValidity(slideFragment.isValid()); - if (viewPager.getCurrentItem() == slidePagerAdapter.list.size() - 1) { - btn.setImageResource(R.drawable.ic_check); - } else { - btn.setImageResource(R.drawable.ic_arrow_right); - } - } - - @Override - public void onPageScrollStateChanged(int state) { - - } - }); - } - - private void onDone() { - Bundle bundle = new Bundle(); - for (SlideFragment fragment : slidePagerAdapter.list) { - fragment.getData(bundle); - } - - Intent result = new Intent(); - result.putExtras(bundle); - setResult(RESULT_OK, result); - finish(); - } - - public void updateValidity(boolean validity) { - btn.setVisibility(validity ? View.VISIBLE : View.GONE); - if (validity) { - lastValidPage = viewPager.getCurrentItem(); - } else { - lastValidPage = viewPager.getCurrentItem() - 1; - } - slidePagerAdapter.notifyDataSetChanged(); - } - - private class SlidePagerAdapter extends FragmentPagerAdapter { - final List<SlideFragment> list = new ArrayList<>(); - - public SlidePagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public SlideFragment getItem(int position) { - return list.get(position); - } - - @Override - public int getCount() { - return Math.min(lastValidPage + 2, list.size()); - } - - public void addFragment(SlideFragment fragment) { - list.add(fragment); - notifyDataSetChanged(); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java deleted file mode 100644 index 25a8c58ec..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.support.annotation.ColorInt; -import android.support.v7.widget.RecyclerView; -import android.util.Pair; -import android.view.View; - -import com.mikepenz.fastadapter.utils.ViewHolderFactory; -import com.mikepenz.materialdrawer.model.AbstractDrawerItem; -import com.mikepenz.materialdrawer.util.DrawerUIUtils; - -import de.kuschku.quasseldroid_ng.R; - -public class CreateAccountItem extends AbstractDrawerItem<CreateAccountItem, CreateAccountItem.ViewHolder> { - protected Pair<Integer, ColorStateList> colorStateList; - - @Override - public int getType() { - return R.id.item_create_account; - } - - @Override - public int getLayoutRes() { - return R.layout.widget_core_account_add; - } - - @Override - public void bindView(ViewHolder viewHolder) { - //set the identifier from the drawerItem here. It can be used to run tests - viewHolder.itemView.setId(hashCode()); - - //set the item selected if it is - viewHolder.itemView.setSelected(isSelected()); - - //for android API 17 --> Padding not applied via xml - DrawerUIUtils.setDrawerVerticalPadding(viewHolder.view); - - //call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required) - onPostBindView(this, viewHolder.itemView); - } - - @Override - public ViewHolderFactory<ViewHolder> getFactory() { - return new ItemFactory(); - } - - /** - * helper method to decide for the correct color - * - * @param ctx - * @return - */ - protected int getColor(Context ctx) { - int color; - if (this.isEnabled()) { - color = com.mikepenz.materialdrawer.R.color.material_drawer_primary_text; - } else { - color = com.mikepenz.materialdrawer.R.color.material_drawer_hint_text; - } - return color; - } - - /** - * helper method to decide for the correct color - * - * @param ctx - * @return - */ - protected int getSelectedTextColor(Context ctx) { - return com.mikepenz.materialdrawer.R.color.material_drawer_selected_text; - } - - /** - * helper to get the ColorStateList for the text and remembering it so we do not have to recreate it all the time - * - * @param color - * @param selectedTextColor - * @return - */ - protected ColorStateList getTextColorStateList(@ColorInt int color, @ColorInt int selectedTextColor) { - if (colorStateList == null || color + selectedTextColor != colorStateList.first) { - colorStateList = new Pair<>(color + selectedTextColor, DrawerUIUtils.getTextColorStateList(color, selectedTextColor)); - } - - return colorStateList.second; - } - - public static class ItemFactory implements ViewHolderFactory<ViewHolder> { - public ViewHolder create(View v) { - return new ViewHolder(v); - } - } - - protected static class ViewHolder extends RecyclerView.ViewHolder { - private final View view; - - private ViewHolder(View view) { - super(view); - this.view = view; - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/StorageBackendItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/StorageBackendItem.java deleted file mode 100644 index 0d1928f28..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/StorageBackendItem.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.support.annotation.ColorInt; -import android.support.v7.widget.AppCompatRadioButton; -import android.support.v7.widget.RecyclerView; -import android.util.Pair; -import android.view.View; -import android.widget.TextView; - -import com.mikepenz.fastadapter.utils.ViewHolderFactory; -import com.mikepenz.materialdrawer.model.AbstractDrawerItem; -import com.mikepenz.materialdrawer.util.DrawerUIUtils; - -import de.kuschku.quasseldroid_ng.R; - -public class StorageBackendItem extends AbstractDrawerItem<StorageBackendItem, StorageBackendItem.ViewHolder> { - private final String displayName; - private final String description; - protected Pair<Integer, ColorStateList> colorStateList; - - public StorageBackendItem(String displayName, String description) { - this.displayName = displayName; - this.description = description; - } - - @Override - public int getType() { - return R.id.item_backend; - } - - @Override - public int getLayoutRes() { - return R.layout.widget_core_backend; - } - - @Override - public boolean isSelectable() { - return true; - } - - @Override - public void bindView(ViewHolder viewHolder) { - Context ctx = viewHolder.itemView.getContext(); - - //set the identifier from the drawerItem here. It can be used to run tests - viewHolder.itemView.setId(hashCode()); - - //set the item selected if it is - viewHolder.itemView.setSelected(isSelected()); - - //get the correct color for the text - int color = getColor(ctx); - int selectedTextColor = getSelectedTextColor(ctx); - - viewHolder.name.setText(displayName); - - viewHolder.select.setChecked(isSelected()); - viewHolder.select.setClickable(false); - - viewHolder.description.setText(description); - - viewHolder.name.setTextColor(getTextColorStateList(color, selectedTextColor)); - - viewHolder.description.setTextColor(getTextColorStateList(color, selectedTextColor)); - - //for android API 17 --> Padding not applied via xml - DrawerUIUtils.setDrawerVerticalPadding(viewHolder.view); - - //call the onPostBindView method to trigger post bind view actions (like the listener to modify the item if required) - onPostBindView(this, viewHolder.itemView); - } - - @Override - public ViewHolderFactory<ViewHolder> getFactory() { - return new ItemFactory(); - } - - /** - * helper method to decide for the correct color - * - * @param ctx - * @return - */ - protected int getColor(Context ctx) { - int color; - if (this.isEnabled()) { - color = com.mikepenz.materialdrawer.R.color.material_drawer_primary_text; - } else { - color = com.mikepenz.materialdrawer.R.color.material_drawer_hint_text; - } - return color; - } - - /** - * helper method to decide for the correct color - * - * @param ctx - * @return - */ - protected int getSelectedTextColor(Context ctx) { - return com.mikepenz.materialdrawer.R.color.material_drawer_selected_text; - } - - /** - * helper to get the ColorStateList for the text and remembering it so we do not have to recreate it all the time - * - * @param color - * @param selectedTextColor - * @return - */ - protected ColorStateList getTextColorStateList(@ColorInt int color, @ColorInt int selectedTextColor) { - if (colorStateList == null || color + selectedTextColor != colorStateList.first) { - colorStateList = new Pair<>(color + selectedTextColor, DrawerUIUtils.getTextColorStateList(color, selectedTextColor)); - } - - return colorStateList.second; - } - - public String getDisplayName() { - return displayName; - } - - public static class ItemFactory implements ViewHolderFactory<ViewHolder> { - public ViewHolder create(View v) { - return new ViewHolder(v); - } - } - - protected static class ViewHolder extends RecyclerView.ViewHolder { - private final View view; - private final AppCompatRadioButton select; - private final TextView name; - private final TextView description; - - private ViewHolder(View view) { - super(view); - this.view = view; - this.select = (AppCompatRadioButton) view.findViewById(R.id.backend_select); - this.name = (TextView) view.findViewById(R.id.backend_name); - this.description = (TextView) view.findViewById(R.id.backend_description); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/ValidUpdateCallback.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/ValidUpdateCallback.java deleted file mode 100644 index 05328f085..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/ValidUpdateCallback.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup; - -public interface ValidUpdateCallback { - void updateValidity(boolean isValid); -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSelectSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSelectSlide.java deleted file mode 100644 index c5be22b95..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSelectSlide.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup.slides; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.mikepenz.fastadapter.FastAdapter; -import com.mikepenz.fastadapter.IItem; -import com.mikepenz.fastadapter.adapters.ItemAdapter; - -import java.util.Iterator; -import java.util.Set; - -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.setup.AccountItem; -import de.kuschku.quasseldroid_ng.ui.setup.AccountSetupActivity; -import de.kuschku.quasseldroid_ng.ui.setup.CreateAccountItem; -import de.kuschku.util.accounts.Account; -import de.kuschku.util.accounts.AccountManager; -import de.kuschku.util.backports.Optional; -import de.kuschku.util.backports.Optionals; - -public class AccountSelectSlide extends SlideFragment implements AccountItem.OnDeleteListener { - private ItemAdapter<IItem> itemAdapter; - private FastAdapter<IItem> fastAdapter; - private AccountManager manager; - - @Override - public Bundle getData(Bundle in) { - AccountItem item = (AccountItem) findAny(fastAdapter.getSelectedItems()).get(); - in.putString("account", item.account.id.toString()); - return in; - } - - private <T> Optional<T> findAny(Set<T> selections) { - Iterator<T> iterator = selections.iterator(); - if (iterator.hasNext()) { - return Optionals.of(iterator.next()); - } else { - return Optionals.absent(); - } - } - - @Override - public boolean isValid() { - return fastAdapter != null && fastAdapter.getSelections().size() == 1 && findAny(fastAdapter.getSelectedItems()).get() instanceof AccountItem; - } - - @Override - protected View onCreateContent(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) { - RecyclerView recyclerView = (RecyclerView) inflater.inflate(R.layout.slide_select, container, false); - - manager = new AccountManager(getContext()); - - fastAdapter = new FastAdapter<>(); - itemAdapter = new ItemAdapter<>(); - itemAdapter.wrap(fastAdapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - recyclerView.setItemAnimator(new DefaultItemAnimator()); - updateContent(); - recyclerView.setAdapter(fastAdapter); - - fastAdapter.withSelectWithItemUpdate(true); - fastAdapter.withOnClickListener((v, adapter, item, position) -> { - if (item instanceof CreateAccountItem) { - createNew(); - return true; - } else { - fastAdapter.deselect(); - fastAdapter.select(position); - updateValidity(); - return false; - } - }); - - - return recyclerView; - } - - private void createNew() { - Intent intent = new Intent(getContext(), AccountSetupActivity.class); - startActivityForResult(intent, 0); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (findAny(fastAdapter.getSelectedItems()).get() instanceof CreateAccountItem) - fastAdapter.deselect(); - - super.onActivityResult(requestCode, resultCode, data); - if (resultCode == Activity.RESULT_OK) { - updateContent(); - } else if (fastAdapter.getItemCount() == 0) { - getActivity().finish(); - } - } - - private void updateContent() { - itemAdapter.clear(); - Set<Account> accounts = manager.accounts(); - for (Account account : accounts) { - AccountItem accountItem = new AccountItem(account); - accountItem.setOnDeleteListener(this); - itemAdapter.add(accountItem); - } - itemAdapter.add(new CreateAccountItem()); - - if (accounts.size() == 0) { - createNew(); - } - } - - @Override - protected int getTitle() { - return R.string.slideAccountSelectTitle; - } - - @Override - protected int getDescription() { - return R.string.slideAccountSelectDescription; - } - - @Override - public void onDelete(AccountItem item) { - manager.remove(item.account); - updateContent(); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupCoreSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupCoreSlide.java deleted file mode 100644 index 16e6d7b98..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupCoreSlide.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup.slides; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.design.widget.TextInputEditText; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; - -public class AccountSetupCoreSlide extends SlideFragment { - final TextWatcher watcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - updateValidity(); - } - - @Override - public void afterTextChanged(Editable s) { - } - }; - @Bind(R.id.host) - TextInputEditText hostField; - @Bind(R.id.port) - TextInputEditText portField; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override - protected View onCreateContent(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.slide_account_core, container, false); - ButterKnife.bind(this, view); - hostField.addTextChangedListener(watcher); - portField.addTextChangedListener(watcher); - return view; - } - - @Override - public Bundle getData(Bundle in) { - in.putString("host", hostField.getText().toString()); - in.putInt("port", Integer.valueOf(portField.getText().toString())); - return in; - } - - @Override - public boolean isValid() { - return validHost() && validPort(); - } - - @Override - @StringRes - public int getTitle() { - return R.string.slideAccountCoreTitle; - } - - @Override - @StringRes - public int getDescription() { - return R.string.slideAccountCoreDescription; - } - - private boolean validPort() { - if (portField == null) - return false; - - String portText = portField.getText().toString(); - try { - int port = Integer.parseInt(portText); - return port <= 65536 && port > 0; - } catch (NumberFormatException e) { - return false; - } - } - - private boolean validHost() { - if (hostField == null) - return false; - - String hostText = hostField.getText().toString(); - return !hostText.isEmpty(); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupNameSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupNameSlide.java deleted file mode 100644 index 729f64c62..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupNameSlide.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup.slides; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.design.widget.TextInputEditText; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; - -public class AccountSetupNameSlide extends SlideFragment { - final TextWatcher watcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - updateValidity(); - } - - @Override - public void afterTextChanged(Editable s) { - } - }; - @Bind(R.id.name) - TextInputEditText nameField; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override - protected View onCreateContent(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.slide_account_name, container, false); - ButterKnife.bind(this, view); - nameField.addTextChangedListener(watcher); - return view; - } - - @Override - public Bundle getData(Bundle in) { - in.putString("name", nameField.getText().toString()); - return in; - } - - @Override - public boolean isValid() { - return validName(); - } - - @Override - @StringRes - public int getTitle() { - return R.string.slideAccountNameTitle; - } - - @Override - @StringRes - public int getDescription() { - return R.string.slideAccountNameDescription; - } - - private boolean validName() { - if (nameField == null) - return false; - - String hostText = nameField.getText().toString(); - return !hostText.isEmpty(); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupUserSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupUserSlide.java deleted file mode 100644 index 39b544b13..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSetupUserSlide.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup.slides; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.design.widget.TextInputEditText; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; - -public class AccountSetupUserSlide extends SlideFragment { - final TextWatcher watcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - updateValidity(); - } - }; - @Bind(R.id.user) - TextInputEditText userField; - @Bind(R.id.pass) - TextInputEditText passField; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override - public View onCreateContent(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.slide_account_user, container, false); - ButterKnife.bind(this, view); - userField.addTextChangedListener(watcher); - passField.addTextChangedListener(watcher); - return view; - } - - @Override - public Bundle getData(Bundle in) { - in.putString("user", userField.getText().toString()); - in.putString("pass", passField.getText().toString()); - return in; - } - - @Override - public boolean isValid() { - return validUser() && validPass(); - } - - @Override - @StringRes - public int getTitle() { - return R.string.slideAccountUserTitle; - } - - @Override - @StringRes - public int getDescription() { - return R.string.slideAccountUserDescription; - } - - private boolean validUser() { - if (userField == null) - return false; - - String hostText = userField.getText().toString(); - return !hostText.isEmpty(); - } - - private boolean validPass() { - if (passField == null) - return false; - - String hostText = passField.getText().toString(); - return !hostText.isEmpty(); - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSelectSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSelectSlide.java deleted file mode 100644 index c3e51069b..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSelectSlide.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup.slides; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.mikepenz.fastadapter.FastAdapter; -import com.mikepenz.fastadapter.IItem; -import com.mikepenz.fastadapter.adapters.ItemAdapter; - -import java.util.List; - -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.setup.StorageBackendItem; - -public class CoreBackendSelectSlide extends SlideFragment { - private FastAdapter<IItem> fastAdapter; - - private List<Bundle> storageBackends; - private String selectedBackend; - - @Override - public void setArguments(Bundle args) { - storageBackends = args.getParcelableArrayList("storageBackends"); - } - - @Override - public Bundle getData(Bundle in) { - in.putString("selectedBackend", selectedBackend); - return in; - } - - @Override - public boolean isValid() { - return fastAdapter != null && fastAdapter.getSelections().size() == 1; - } - - @Override - protected View onCreateContent(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) { - RecyclerView recyclerView = (RecyclerView) inflater.inflate(R.layout.slide_select, container, false); - - fastAdapter = new FastAdapter<>(); - ItemAdapter<IItem> itemAdapter = new ItemAdapter<>(); - itemAdapter.wrap(fastAdapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - recyclerView.setItemAnimator(new DefaultItemAnimator()); - - for (Bundle backend : storageBackends) { - itemAdapter.add(new StorageBackendItem(backend.getString("displayName"), backend.getString("description"))); - } - - recyclerView.setAdapter(fastAdapter); - - fastAdapter.withSelectWithItemUpdate(true); - fastAdapter.withOnClickListener((v, adapter, item, position) -> { - fastAdapter.deselect(); - fastAdapter.select(position); - selectedBackend = ((StorageBackendItem) item).getDisplayName(); - updateValidity(); - return false; - }); - - - return recyclerView; - } - - @Override - protected int getTitle() { - return R.string.slideCoreBackendSelectTitle; - } - - @Override - protected int getDescription() { - return R.string.slideCoreBackendSelectDescription; - } - -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java deleted file mode 100644 index 9ed2e7d71..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java +++ /dev/null @@ -1,404 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup.slides; - -import android.content.Context; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.design.widget.TextInputEditText; -import android.support.design.widget.TextInputLayout; -import android.support.v7.widget.AppCompatCheckBox; -import android.text.Editable; -import android.text.InputType; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import butterknife.Bind; -import butterknife.ButterKnife; -import de.kuschku.quasseldroid_ng.R; - -public class CoreBackendSetupSlide extends SlideFragment { - final TextWatcher watcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - updateValidity(); - } - - @Override - public void afterTextChanged(Editable s) { - } - }; - private final Map<String, InputItemWrapper> items = new HashMap<>(); - private final Map<String, Bundle> storageBackends = new HashMap<>(); - @Bind(R.id.container) - LinearLayout container; - Bundle storageBackend; - - @Override - public void setArguments(Bundle args) { - ArrayList<Bundle> storageBackends = args.getParcelableArrayList("storageBackends"); - if (storageBackends != null) { - for (Bundle bundle : storageBackends) { - this.storageBackends.put(bundle.getString("displayName"), bundle); - } - } - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - @Override - protected View onCreateContent(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.slide_core_setup_backend, container, false); - ButterKnife.bind(this, view); - - updateContent(); - - return view; - } - - private void updateContent() { - container.removeAllViews(); - - for (InputItemWrapper wrapper : items.values()) { - wrapper.onDestroy(); - } - items.clear(); - - if (storageBackend == null) - return; - - Bundle types = storageBackend.getBundle("types"); - Bundle defaults = storageBackend.getBundle("defaults"); - - if (types == null || defaults == null) - return; - - for (String key : types.keySet()) { - String type = types.getString(key); - Object defValue = defaults.get(key); - InputItemWrapper wrapper = getInputItemWrapper(key, type, defValue); - items.put(key, wrapper); - container.addView(wrapper.getView(container.getContext(), container)); - } - } - - @Override - public void setData(Bundle in) { - storageBackend = storageBackends.get(in.getString("selectedBackend")); - updateContent(); - updateValidity(); - } - - @Override - public Bundle getData(Bundle in) { - Bundle config = new Bundle(); - for (InputItemWrapper inputItemWrapper : items.values()) { - if (inputItemWrapper.isValid()) - inputItemWrapper.putValue(config); - } - in.putBundle("config", config); - return in; - } - - @Override - public boolean isValid() { - for (InputItemWrapper inputItemWrapper : items.values()) { - if (!inputItemWrapper.isValid()) - return false; - } - return true; - } - - @Override - @StringRes - public int getTitle() { - return R.string.slideCoreBackendSetupTitle; - } - - @Override - @StringRes - public int getDescription() { - return R.string.slideCoreBackendSetupDescription; - } - - @SuppressWarnings("unchecked") - private <T> InputItemWrapper<T> getInputItemWrapper(String key, String type, T defValue) { - InputItemWrapper result; - switch (type) { - case "boolean": { - result = new BooleanInputItem(key, (Boolean) defValue); - } - break; - case "short": - case "int": - case "long": - case "float": - case "double": { - result = new NumberInputItem(key, (Number) defValue, type); - } - break; - default: - case "string": { - result = new StringInputItem(key, (String) defValue); - } - break; - } - return result; - } - - private interface InputItemWrapper<T> { - String key(); - - T getValue(); - - boolean isValid(); - - View getView(Context context, ViewGroup parent); - - void onDestroy(); - - void putValue(Bundle in); - } - - class BooleanInputItem implements InputItemWrapper<Boolean> { - private final String key; - private final Boolean defValue; - @Bind(R.id.checkBox) - AppCompatCheckBox checkBox; - private View view; - - public BooleanInputItem(String key, Boolean defValue) { - this.key = key; - this.defValue = defValue; - } - - @Override - public String key() { - return key; - } - - @Override - public Boolean getValue() { - return checkBox.isChecked(); - } - - @Override - public boolean isValid() { - return true; - } - - @Override - public View getView(Context context, ViewGroup parent) { - if (view == null) { - view = LayoutInflater.from(context).inflate(R.layout.widget_input_boolean, parent, false); - ButterKnife.bind(this, view); - checkBox.setText(key); - if (defValue != null) - checkBox.setChecked(defValue); - } - return view; - } - - @Override - public void onDestroy() { - - } - - @Override - public void putValue(Bundle in) { - in.putBoolean(key, getValue()); - } - } - - class NumberInputItem implements InputItemWrapper<Number> { - private final String key; - private final Number defValue; - private final String type; - @Bind(R.id.inputLayout) - TextInputLayout inputLayout; - @Bind(R.id.editText) - TextInputEditText editText; - private View view; - - public NumberInputItem(String key, Number defValue, String type) { - this.key = key; - this.defValue = defValue; - this.type = type; - } - - @Override - public String key() { - return key; - } - - @Override - public Number getValue() { - String text = editText.getText().toString(); - try { - switch (type) { - case "short": - return Short.parseShort(text); - case "int": - return Integer.parseInt(text); - case "long": - return Long.parseLong(text); - case "float": - return Float.parseFloat(text); - case "double": - return Double.parseDouble(text); - default: - return null; - } - } catch (NumberFormatException e) { - return null; - } - } - - @Override - public boolean isValid() { - return getValue() != null; - } - - @Override - public View getView(Context context, ViewGroup parent) { - if (view == null) { - view = LayoutInflater.from(context).inflate(R.layout.widget_input_string, parent, false); - ButterKnife.bind(this, view); - if (defValue != null) - editText.setText(defValue.toString()); - editText.addTextChangedListener(watcher); - switch (type) { - case "short": - case "int": - case "long": - editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); - break; - case "float": - case "double": - editText.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_NUMBER_FLAG_DECIMAL); - break; - } - inputLayout.setHint(key); - } - return view; - } - - @Override - public void onDestroy() { - editText.removeTextChangedListener(watcher); - } - - @Override - public void putValue(Bundle in) { - switch (type) { - case "short": { - in.putShort(key, (short) getValue()); - } - break; - case "int": { - in.putInt(key, (int) getValue()); - } - break; - case "long": { - in.putLong(key, (long) getValue()); - } - break; - case "float": { - in.putFloat(key, (float) getValue()); - } - break; - case "double": { - in.putDouble(key, (double) getValue()); - } - break; - } - } - } - - class StringInputItem implements InputItemWrapper<String> { - private final String key; - private final String defValue; - @Bind(R.id.inputLayout) - TextInputLayout inputLayout; - @Bind(R.id.editText) - TextInputEditText editText; - private View view; - - public StringInputItem(String key, String defValue) { - this.key = key; - this.defValue = defValue; - } - - @Override - public String key() { - return key; - } - - @Override - public String getValue() { - return editText.getText().toString(); - } - - @Override - public boolean isValid() { - return !editText.getText().toString().isEmpty(); - } - - @Override - public View getView(Context context, ViewGroup parent) { - if (view == null) { - view = LayoutInflater.from(context).inflate(R.layout.widget_input_string, parent, false); - ButterKnife.bind(this, view); - if (defValue != null) - editText.setText(defValue); - editText.addTextChangedListener(watcher); - inputLayout.setHint(key); - } - return view; - } - - @Override - public void onDestroy() { - editText.removeTextChangedListener(watcher); - } - - @Override - public void putValue(Bundle in) { - in.putString(key, getValue()); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/SlideFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/SlideFragment.java deleted file mode 100644 index 1aee8a6fc..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/SlideFragment.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.setup.slides; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.annotation.StringRes; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.ui.setup.ValidUpdateCallback; - -public abstract class SlideFragment extends Fragment { - private final Set<ValidUpdateCallback> callbacks = new HashSet<>(); - - public abstract Bundle getData(Bundle in); - - - public abstract boolean isValid(); - - public void addChangeListener(ValidUpdateCallback callback) { - callbacks.add(callback); - } - - public void removeChangeListener(ValidUpdateCallback callback) { - callbacks.remove(callback); - } - - protected void updateValidity() { - updateValidity(isValid()); - } - - protected void updateValidity(boolean validity) { - for (ValidUpdateCallback callback : callbacks) { - callback.updateValidity(validity); - } - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.slide, container, false); - ViewGroup viewGroup = (ViewGroup) view.findViewById(R.id.content_host); - viewGroup.addView(onCreateContent(inflater, viewGroup, savedInstanceState)); - - ((TextView) view.findViewById(R.id.title)).setText(getTitle()); - ((TextView) view.findViewById(R.id.description)).setText(getDescription()); - - return view; - } - - protected abstract View onCreateContent(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState); - - @StringRes - protected abstract int getTitle(); - - @StringRes - protected abstract int getDescription(); - - public void setData(Bundle in) { - - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java deleted file mode 100644 index 2e701bf8e..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppContext.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.theme; - -import android.support.annotation.NonNull; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.quasseldroid_ng.ui.settings.Settings; -import de.kuschku.util.irc.format.IrcFormatDeserializer; -import de.kuschku.util.irc.format.IrcFormatSerializer; -import de.kuschku.util.observables.lists.ObservableSet; - -public class AppContext { - private final ObservableSet<QBufferViewConfig.DisplayType> bufferDisplayTypes = new ObservableSet<>(); - private ThemeUtil themeUtil; - private Settings settings; - private Client client; - private BusProvider provider; - private IrcFormatDeserializer deserializer; - private IrcFormatSerializer serializer; - - public ThemeUtil themeUtil() { - return themeUtil; - } - - public void setThemeUtil(ThemeUtil themeUtil) { - this.themeUtil = themeUtil; - - this.serializer = new IrcFormatSerializer(this); - this.deserializer = new IrcFormatDeserializer(this); - } - - @NonNull - public AppContext withThemeUtil(ThemeUtil themeUtil) { - setThemeUtil(themeUtil); - return this; - } - - public Settings settings() { - return settings; - } - - public void setSettings(Settings settings) { - this.settings = settings; - } - - @NonNull - public AppContext withSettings(Settings settings) { - setSettings(settings); - return this; - } - - public Client client() { - return client; - } - - public void setClient(Client client) { - this.client = client; - } - - @NonNull - public AppContext withClient(Client client) { - setClient(client); - return this; - } - - public BusProvider provider() { - return provider; - } - - public void setProvider(BusProvider provider) { - this.provider = provider; - } - - @NonNull - public AppContext withProvider(BusProvider provider) { - setProvider(provider); - return this; - } - - public IrcFormatDeserializer deserializer() { - return deserializer; - } - - public IrcFormatSerializer serializer() { - return serializer; - } - - public ObservableSet<QBufferViewConfig.DisplayType> bufferDisplayTypes() { - return bufferDisplayTypes; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java deleted file mode 100644 index c77e5bab8..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/AppTheme.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.theme; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.StyleRes; - -import de.kuschku.quasseldroid_ng.R; - -public enum AppTheme { - QUASSEL_LIGHT(R.style.Quassel_Light), - QUASSEL_DARK(R.style.Quassel_Dark), - SOLARIZED_LIGHT(R.style.Solarized_Light), - SOLARIZED_DARK(R.style.Solarized_Dark); - - public final int themeId; - - AppTheme(@StyleRes int themeId) { - this.themeId = themeId; - } - - public static int resFromString(String s) { - return themeFromString(s).themeId; - } - - @NonNull - public static AppTheme themeFromString(@Nullable String s) { - if (s == null) s = ""; - switch (s) { - case "QUASSEL_DARK": - return QUASSEL_DARK; - case "SOLARIZED_LIGHT": - return SOLARIZED_LIGHT; - case "SOLARIZED_DARK": - return SOLARIZED_DARK; - - default: - case "QUASSEL_LIGHT": - return QUASSEL_LIGHT; - } - } - - @NonNull - @Override - public String toString() { - return name() + "{" + - "themeId=" + themeId + - '}'; - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/PreferenceStrings.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/PreferenceStrings.java deleted file mode 100644 index d172bfeea..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/PreferenceStrings.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.theme; - -import android.content.Context; - -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.annotationbind.AutoBinder; -import de.kuschku.util.annotationbind.AutoString; - -public class PreferenceStrings { - @AutoString(R.string.preference_last_account) - public String preferenceLastAccount; - - @AutoString(R.string.preference_font_size) - public String preferenceFontSize; - - @AutoString(R.string.preference_theme) - public String preferenceTheme; - - @AutoString(R.string.preference_colors) - public String preferenceColors; - - @AutoString(R.string.preference_brackets) - public String preferenceBrackets; - - @AutoString(R.string.preference_hostmask) - public String preferenceHostmask; - - @AutoString(R.string.preference_lag) - public String preferenceLag; - - public PreferenceStrings(Context wrapper) { - try { - AutoBinder.bind(this, wrapper); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java deleted file mode 100644 index f9f801aae..000000000 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java +++ /dev/null @@ -1,969 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.quasseldroid_ng.ui.theme; - -import android.content.Context; -import android.content.res.Resources; -import android.graphics.drawable.Drawable; -import android.support.annotation.ColorInt; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.UiThread; -import android.support.v4.content.res.ResourcesCompat; -import android.support.v4.graphics.drawable.DrawableCompat; -import android.support.v7.view.ContextThemeWrapper; -import android.util.SparseArray; -import android.util.SparseIntArray; - -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.libquassel.objects.types.NetworkServer; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; -import de.kuschku.libquassel.syncables.types.interfaces.QIgnoreListManager; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.util.annotationbind.AutoBinder; -import de.kuschku.util.annotationbind.AutoColor; -import de.kuschku.util.annotationbind.AutoDimen; -import de.kuschku.util.annotationbind.AutoInt; -import de.kuschku.util.annotationbind.AutoString; -import de.kuschku.util.irc.chanmodes.ChanMode; -import de.kuschku.util.ui.DateTimeFormatHelper; -import de.kuschku.util.ui.SpanFormatter; - -import static android.support.v4.content.res.ResourcesCompat.getDrawable; - -public class ThemeUtil { - @NonNull - public final Colors res = new Colors(); - - @NonNull - public final FormatStrings translations = new FormatStrings(); - - @NonNull - public final ChanModeStrings chanModes = new ChanModeStrings(); - - @NonNull - public final DateTimeFormatHelper formatter; - - @NonNull - public final StatusDrawables statusDrawables; - - public ThemeUtil(@NonNull Context ctx) { - ContextThemeWrapper themeWrapper = new ContextThemeWrapper(ctx, ctx.getTheme()); - initColors(themeWrapper); - statusDrawables = new StatusDrawables(ctx, res, themeWrapper.getTheme()); - formatter = new DateTimeFormatHelper(ctx); - } - - public ThemeUtil(@NonNull Context ctx, @NonNull AppTheme theme) { - ContextThemeWrapper themeWrapper = new ContextThemeWrapper(ctx, theme.themeId); - initColors(themeWrapper); - statusDrawables = new StatusDrawables(ctx, res, themeWrapper.getTheme()); - formatter = new DateTimeFormatHelper(ctx); - } - - @UiThread - public void initColors(@NonNull ContextThemeWrapper wrapper) { - try { - res.colors = null; - AutoBinder.bind(res, wrapper); - res.bind(wrapper); - AutoBinder.bind(translations, wrapper); - AutoBinder.bind(chanModes, wrapper); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } - } - - public String statusName(ConnectionChangeEvent.Status status) { - switch (status) { - case HANDSHAKE: - return translations.statusHandshake; - case INITIALIZING_DATA: - return translations.statusInitData; - case LOADING_BACKLOG: - return translations.statusBacklog; - case CONNECTED: - return translations.statusWelcome; - case DISCONNECTED: - default: - return translations.statusDisconnected; - } - } - - public static class StatusDrawables { - public final Drawable online; - public final Drawable away; - public final Drawable offline; - - public final Drawable channelOnline; - public final Drawable channelOffline; - - public StatusDrawables(Context ctx, Colors colors, Resources.Theme theme) { - Resources resources = ctx.getResources(); - online = getDrawable(resources, R.drawable.ic_status, theme); - DrawableCompat.setTint(online, colors.colorAccent); - away = getDrawable(resources, R.drawable.ic_status, theme); - DrawableCompat.setTint(away, colors.colorAway); - offline = getDrawable(resources, R.drawable.ic_status_offline, theme); - DrawableCompat.setTint(offline, colors.colorOffline); - - channelOnline = getDrawable(resources, R.drawable.ic_status_channel, theme); - DrawableCompat.setTint(channelOnline, colors.colorAccent); - channelOffline = getDrawable(resources, R.drawable.ic_status_channel_offline, theme); - DrawableCompat.setTint(channelOffline, colors.colorOffline); - } - - public Drawable of(BufferInfo.Type type, BufferInfo.BufferStatus status) { - if (type == BufferInfo.Type.CHANNEL) { - if (status == BufferInfo.BufferStatus.ONLINE) - return channelOnline; - else - return channelOffline; - } else { - if (status == BufferInfo.BufferStatus.ONLINE) - return online; - else if (status == BufferInfo.BufferStatus.AWAY) - return away; - else - return offline; - } - } - } - - public static class ChanModeStrings { - - @AutoString(R.string.chanMode_RESTRICT_TOPIC_NAME) - public String chanMode_RESTRICT_TOPIC_NAME; - - @AutoString(R.string.chanMode_RESTRICT_TOPIC_DESCRIPTION) - public String chanMode_RESTRICT_TOPIC_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_COLORS_NAME) - public String chanMode_BLOCK_COLOR_NAME; - - @AutoString(R.string.chanMode_BLOCK_COLORS_DESCRIPTION) - public String chanMode_BLOCK_COLOR_DESCRIPTION; - - @AutoString(R.string.chanMode_STRIP_COLORS_NAME) - public String chanMode_STRIP_COLOR_NAME; - - @AutoString(R.string.chanMode_STRIP_COLORS_DESCRIPTION) - public String chanMode_STRIP_COLOR_DESCRIPTION; - - @AutoString(R.string.chanMode_ONLY_INVITE_NAME) - public String chanMode_ONLY_INVITE_NAME; - - @AutoString(R.string.chanMode_ONLY_INVITE_DESCRIPTION) - public String chanMode_ONLY_INVITE_DESCRIPTION; - - @AutoString(R.string.chanMode_ONLY_SSL_NAME) - public String chanMode_ONLY_SSL_NAME; - - @AutoString(R.string.chanMode_ONLY_SSL_DESCRIPTION) - public String chanMode_ONLY_SSL_DESCRIPTION; - - @AutoString(R.string.chanMode_UNLISTED_NAME) - public String chanMode_UNLISTED_NAME; - - @AutoString(R.string.chanMode_UNLISTED_DESCRIPTION) - public String chanMode_UNLISTED_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_UNIDENTIFIED_NAME) - public String chanMode_BLOCK_UNIDENTIFIED_NAME; - - @AutoString(R.string.chanMode_BLOCK_UNIDENTIFIED_DESCRIPTION) - public String chanMode_BLOCK_UNIDENTIFIED_DESCRIPTION; - - @AutoString(R.string.chanMode_PARANOID_NAME) - public String chanMode_PARANOID_NAME; - - @AutoString(R.string.chanMode_PARANOID_DESCRIPTION) - public String chanMode_PARANOID_DESCRIPTION; - - @AutoString(R.string.chanMode_REGISTERED_NAME) - public String chanMode_REGISTERED_NAME; - - @AutoString(R.string.chanMode_REGISTERED_DESCRIPTION) - public String chanMode_REGISTERED_DESCRIPTION; - - @AutoString(R.string.chanMode_MODERATED_NAME) - public String chanMode_MODERATED_NAME; - - @AutoString(R.string.chanMode_MODERATED_DESCRIPTION) - public String chanMode_MODERATED_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_EXTERNAL_NAME) - public String chanMode_BLOCK_EXTERNAL_NAME; - - @AutoString(R.string.chanMode_BLOCK_EXTERNAL_DESCRIPTION) - public String chanMode_BLOCK_EXTERNAL_DESCRIPTION; - - @AutoString(R.string.chanMode_ANTIFLOOD_NAME) - public String chanMode_ANTIFLOOD_NAME; - - @AutoString(R.string.chanMode_ANTIFLOOD_DESCRIPTION) - public String chanMode_ANTIFLOOD_DESCRIPTION; - - @AutoString(R.string.chanMode_PASSWORD_NAME) - public String chanMode_PASSWORD_NAME; - - @AutoString(R.string.chanMode_PASSWORD_DESCRIPTION) - public String chanMode_PASSWORD_DESCRIPTION; - - @AutoString(R.string.chanMode_LIMIT_NAME) - public String chanMode_LIMIT_NAME; - - @AutoString(R.string.chanMode_LIMIT_DESCRIPTION) - public String chanMode_LIMIT_DESCRIPTION; - - @AutoString(R.string.chanMode_REDUCED_MODERATION_NAME) - public String chanMode_REDUCED_MODERATION_NAME; - - @AutoString(R.string.chanMode_REDUCED_MODERATION_DESCRIPTION) - public String chanMode_REDUCED_MODERATION_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_NOTICE_NAME) - public String chanMode_BLOCK_NOTICE_NAME; - - @AutoString(R.string.chanMode_BLOCK_NOTICE_DESCRIPTION) - public String chanMode_BLOCK_NOTICE_DESCRIPTION; - - @AutoString(R.string.chanMode_DISABLE_INVITE_NAME) - public String chanMode_DISABLE_INVITE_NAME; - - @AutoString(R.string.chanMode_DISABLE_INVITE_DESCRIPTION) - public String chanMode_DISABLE_INVITE_DESCRIPTION; - - @AutoString(R.string.chanMode_AUDITORIUM_NAME) - public String chanMode_AUDITORIUM_NAME; - - @AutoString(R.string.chanMode_AUDITORIUM_DESCRIPTION) - public String chanMode_AUDITORIUM_DESCRIPTION; - - @AutoString(R.string.chanMode_QUIET_UNIDENTIFIED_NAME) - public String chanMode_QUIET_UNIDENTIFIED_NAME; - - @AutoString(R.string.chanMode_QUIET_UNIDENTIFIED_DESCRIPTION) - public String chanMode_QUIET_UNIDENTIFIED_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_KICK_NAME) - public String chanMode_BLOCK_KICK_NAME; - - @AutoString(R.string.chanMode_BLOCK_KICK_DESCRIPTION) - public String chanMode_BLOCK_KICK_DESCRIPTION; - - @AutoString(R.string.chanMode_PERMANENT_NAME) - public String chanMode_PERMANENT_NAME; - - @AutoString(R.string.chanMode_PERMANENT_DESCRIPTION) - public String chanMode_PERMANENT_DESCRIPTION; - - @AutoString(R.string.chanMode_ONLY_OPER_NAME) - public String chanMode_ONLY_OPER_NAME; - - @AutoString(R.string.chanMode_ONLY_OPER_DESCRIPTION) - public String chanMode_ONLY_OPER_DESCRIPTION; - - @AutoString(R.string.chanMode_ONLY_HELPOPER_NAME) - public String chanMode_ONLY_HELPOPER_NAME; - - @AutoString(R.string.chanMode_ONLY_HELPOPER_DESCRIPTION) - public String chanMode_ONLY_HELPOPER_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_NICKCHANGE_NAME) - public String chanMode_BLOCK_NICKCHANGE_NAME; - - @AutoString(R.string.chanMode_BLOCK_NICKCHANGE_DESCRIPTION) - public String chanMode_BLOCK_NICKCHANGE_DESCRIPTION; - - @AutoString(R.string.chanMode_JOIN_THROTTLE_NAME) - public String chanMode_JOIN_THROTTLE_NAME; - - @AutoString(R.string.chanMode_JOIN_THROTTLE_DESCRIPTION) - public String chanMode_JOIN_THROTTLE_DESCRIPTION; - - @AutoString(R.string.chanMode_ALLOW_INVITE_NAME) - public String chanMode_ALLOW_INVITE_NAME; - - @AutoString(R.string.chanMode_ALLOW_INVITE_DESCRIPTION) - public String chanMode_ALLOW_INVITE_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_FORWARDING_NAME) - public String chanMode_BLOCK_FORWARDING_NAME; - - @AutoString(R.string.chanMode_BLOCK_FORWARDING_DESCRIPTION) - public String chanMode_BLOCK_FORWARDING_DESCRIPTION; - - @AutoString(R.string.chanMode_ALLOW_FORWARD_NAME) - public String chanMode_ALLOW_FORWARD_NAME; - - @AutoString(R.string.chanMode_ALLOW_FORWARD_DESCRIPTION) - public String chanMode_ALLOW_FORWARD_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_ACTION_NAME) - public String chanMode_BLOCK_ACTION_NAME; - - @AutoString(R.string.chanMode_BLOCK_ACTION_DESCRIPTION) - public String chanMode_BLOCK_ACTION_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_CAPS_NAME) - public String chanMode_BLOCK_CAPS_NAME; - - @AutoString(R.string.chanMode_BLOCK_CAPS_DESCRIPTION) - public String chanMode_BLOCK_CAPS_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_KNOCK_NAME) - public String chanMode_BLOCK_KNOCK_NAME; - - @AutoString(R.string.chanMode_BLOCK_KNOCK_DESCRIPTION) - public String chanMode_BLOCK_KNOCK_DESCRIPTION; - - @AutoString(R.string.chanMode_CENSOR_NAME) - public String chanMode_CENSOR_NAME; - - @AutoString(R.string.chanMode_CENSOR_DESCRIPTION) - public String chanMode_CENSOR_DESCRIPTION; - - @AutoString(R.string.chanMode_HIDE_JOINS_NAME) - public String chanMode_HIDE_JOINS_NAME; - - @AutoString(R.string.chanMode_HIDE_JOINS_DESCRIPTION) - public String chanMode_HIDE_JOINS_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_REPEAT_NAME) - public String chanMode_BLOCK_REPEAT_NAME; - - @AutoString(R.string.chanMode_BLOCK_REPEAT_DESCRIPTION) - public String chanMode_BLOCK_REPEAT_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_AUTOREJOIN_NAME) - public String chanMode_BLOCK_AUTOREJOIN_NAME; - - @AutoString(R.string.chanMode_BLOCK_AUTOREJOIN_DESCRIPTION) - public String chanMode_BLOCK_AUTOREJOIN_DESCRIPTION; - - @AutoString(R.string.chanMode_IS_SECURE_NAME) - public String chanMode_IS_SECURE_NAME; - - @AutoString(R.string.chanMode_IS_SECURE_DESCRIPTION) - public String chanMode_IS_SECURE_DESCRIPTION; - - @AutoString(R.string.chanMode_BLOCK_CTCP_NAME) - public String chanMode_BLOCK_CTCP_NAME; - - @AutoString(R.string.chanMode_BLOCK_CTCP_DESCRIPTION) - public String chanMode_BLOCK_CTCP_DESCRIPTION; - - @AutoString(R.string.chanMode_ONLY_ADMIN_NAME) - public String chanMode_ONLY_ADMIN_NAME; - - @AutoString(R.string.chanMode_ONLY_ADMIN_DESCRIPTION) - public String chanMode_ONLY_ADMIN_DESCRIPTION; - - @AutoString(R.string.chanMode_FORWARD_NAME) - public String chanMode_FORWARD_NAME; - - @AutoString(R.string.chanMode_FORWARD_DESCRIPTION) - public String chanMode_FORWARD_DESCRIPTION; - - - public String chanModeToDescription(ChanMode mode) { - switch (mode) { - case RESTRICT_TOPIC: - return chanMode_RESTRICT_TOPIC_DESCRIPTION; - case BLOCK_CTCP: - return chanMode_BLOCK_CTCP_DESCRIPTION; - case BLOCK_COLOR: - return chanMode_BLOCK_COLOR_DESCRIPTION; - case STRIP_COLOR: - return chanMode_STRIP_COLOR_DESCRIPTION; - case ONLY_INVITE: - return chanMode_ONLY_INVITE_DESCRIPTION; - case ONLY_ADMIN: - return chanMode_ONLY_ADMIN_DESCRIPTION; - case ONLY_SSL: - return chanMode_ONLY_SSL_DESCRIPTION; - case UNLISTED: - return chanMode_UNLISTED_DESCRIPTION; - case BLOCK_UNIDENTIFIED: - return chanMode_BLOCK_UNIDENTIFIED_DESCRIPTION; - case PARANOID: - return chanMode_PARANOID_DESCRIPTION; - case REGISTERED: - return chanMode_REGISTERED_DESCRIPTION; - case MODERATED: - return chanMode_MODERATED_DESCRIPTION; - case BLOCK_EXTERNAL: - return chanMode_BLOCK_EXTERNAL_DESCRIPTION; - case ANTIFLOOD: - return chanMode_ANTIFLOOD_DESCRIPTION; - case PASSWORD: - return chanMode_PASSWORD_DESCRIPTION; - case LIMIT: - return chanMode_LIMIT_DESCRIPTION; - case REDUCED_MODERATION: - return chanMode_REDUCED_MODERATION_DESCRIPTION; - case BLOCK_NOTICE: - return chanMode_BLOCK_NOTICE_DESCRIPTION; - case DISABLE_INVITE: - return chanMode_DISABLE_INVITE_DESCRIPTION; - case AUDITORIUM: - return chanMode_AUDITORIUM_DESCRIPTION; - case QUIET_UNIDENTIFIED: - return chanMode_QUIET_UNIDENTIFIED_DESCRIPTION; - case BLOCK_KICK: - return chanMode_BLOCK_KICK_DESCRIPTION; - case PERMANENT: - return chanMode_PERMANENT_DESCRIPTION; - case ONLY_OPER: - return chanMode_ONLY_OPER_DESCRIPTION; - case ONLY_HELPOPER: - return chanMode_ONLY_HELPOPER_DESCRIPTION; - case BLOCK_NICKCHANGE: - return chanMode_BLOCK_NICKCHANGE_DESCRIPTION; - case JOIN_THROTTLE: - return chanMode_JOIN_THROTTLE_DESCRIPTION; - case ALLOW_INVITE: - return chanMode_ALLOW_INVITE_DESCRIPTION; - case BLOCK_FORWARDING: - return chanMode_BLOCK_FORWARDING_DESCRIPTION; - case ALLOW_FORWARD: - return chanMode_ALLOW_FORWARD_DESCRIPTION; - case BLOCK_ACTION: - return chanMode_BLOCK_ACTION_DESCRIPTION; - case BLOCK_CAPS: - return chanMode_BLOCK_CAPS_DESCRIPTION; - case BLOCK_KNOCK: - return chanMode_BLOCK_KNOCK_DESCRIPTION; - case CENSOR: - return chanMode_CENSOR_DESCRIPTION; - case HIDE_JOINS: - return chanMode_HIDE_JOINS_DESCRIPTION; - case BLOCK_REPEAT: - return chanMode_BLOCK_REPEAT_DESCRIPTION; - case BLOCK_AUTOREJOIN: - return chanMode_BLOCK_AUTOREJOIN_DESCRIPTION; - case IS_SECURE: - return chanMode_IS_SECURE_DESCRIPTION; - case FORWARD: - return chanMode_FORWARD_DESCRIPTION; - } - return null; - } - - public String chanModeToName(ChanMode mode) { - switch (mode) { - case RESTRICT_TOPIC: - return chanMode_RESTRICT_TOPIC_NAME; - case BLOCK_CTCP: - return chanMode_BLOCK_CTCP_NAME; - case BLOCK_COLOR: - return chanMode_BLOCK_COLOR_NAME; - case STRIP_COLOR: - return chanMode_STRIP_COLOR_NAME; - case ONLY_INVITE: - return chanMode_ONLY_INVITE_NAME; - case ONLY_ADMIN: - return chanMode_ONLY_ADMIN_NAME; - case ONLY_SSL: - return chanMode_ONLY_SSL_NAME; - case UNLISTED: - return chanMode_UNLISTED_NAME; - case BLOCK_UNIDENTIFIED: - return chanMode_BLOCK_UNIDENTIFIED_NAME; - case PARANOID: - return chanMode_PARANOID_NAME; - case REGISTERED: - return chanMode_REGISTERED_NAME; - case MODERATED: - return chanMode_MODERATED_NAME; - case BLOCK_EXTERNAL: - return chanMode_BLOCK_EXTERNAL_NAME; - case ANTIFLOOD: - return chanMode_ANTIFLOOD_NAME; - case PASSWORD: - return chanMode_PASSWORD_NAME; - case LIMIT: - return chanMode_LIMIT_NAME; - case REDUCED_MODERATION: - return chanMode_REDUCED_MODERATION_NAME; - case BLOCK_NOTICE: - return chanMode_BLOCK_NOTICE_NAME; - case DISABLE_INVITE: - return chanMode_DISABLE_INVITE_NAME; - case AUDITORIUM: - return chanMode_AUDITORIUM_NAME; - case QUIET_UNIDENTIFIED: - return chanMode_QUIET_UNIDENTIFIED_NAME; - case BLOCK_KICK: - return chanMode_BLOCK_KICK_NAME; - case PERMANENT: - return chanMode_PERMANENT_NAME; - case ONLY_OPER: - return chanMode_ONLY_OPER_NAME; - case ONLY_HELPOPER: - return chanMode_ONLY_HELPOPER_NAME; - case BLOCK_NICKCHANGE: - return chanMode_BLOCK_NICKCHANGE_NAME; - case JOIN_THROTTLE: - return chanMode_JOIN_THROTTLE_NAME; - case ALLOW_INVITE: - return chanMode_ALLOW_INVITE_NAME; - case BLOCK_FORWARDING: - return chanMode_BLOCK_FORWARDING_NAME; - case ALLOW_FORWARD: - return chanMode_ALLOW_FORWARD_NAME; - case BLOCK_ACTION: - return chanMode_BLOCK_ACTION_NAME; - case BLOCK_CAPS: - return chanMode_BLOCK_CAPS_NAME; - case BLOCK_KNOCK: - return chanMode_BLOCK_KNOCK_NAME; - case CENSOR: - return chanMode_CENSOR_NAME; - case HIDE_JOINS: - return chanMode_HIDE_JOINS_NAME; - case BLOCK_REPEAT: - return chanMode_BLOCK_REPEAT_NAME; - case BLOCK_AUTOREJOIN: - return chanMode_BLOCK_AUTOREJOIN_NAME; - case IS_SECURE: - return chanMode_IS_SECURE_NAME; - case FORWARD: - return chanMode_FORWARD_NAME; - } - return null; - } - } - - public static class FormatStrings { - @AutoString(R.string.usernameHostmask) - public String usernameHostmask; - - @AutoString(R.string.messagePlain) - public String messagePlain; - - @AutoString(R.string.messageJoin) - public String messageJoin; - - @AutoString(R.string.messagePart) - public String messagePart; - - @AutoString(R.string.messagePartExtra) - public String messagePartExtra; - - @AutoString(R.string.messageQuit) - public String messageQuit; - - @AutoString(R.string.messageQuitExtra) - public String messageQuitExtra; - - @AutoString(R.string.messageKill) - public String messageKill; - - @AutoString(R.string.messageKillExtra) - public String messageKillExtra; - - @AutoString(R.string.messageKick) - public String messageKick; - - @AutoString(R.string.messageKickExtra) - public String messageKickExtra; - - @AutoString(R.string.messageMode) - public String messageMode; - - @AutoString(R.string.messageNickSelf) - public String messageNickSelf; - - @AutoString(R.string.messageNickOther) - public String messageNickOther; - - @AutoString(R.string.messageDayChange) - public String messageDaychange; - - @AutoString(R.string.messageAction) - public String messageAction; - - @AutoString(R.string.messageTopic) - public String messageTopic; - - @AutoString(R.string.confirmationCertficate) - public String warningCertificate; - - @AutoString(R.string.statusConnecting) - public String statusConnecting; - - @AutoString(R.string.statusHandshake) - public String statusHandshake; - - @AutoString(R.string.statusInitData) - public String statusInitData; - - @AutoString(R.string.statusBacklog) - public String statusBacklog; - - @AutoString(R.string.statusConnected) - public String statusConnected; - - @AutoString(R.string.statusDisconnected) - public String statusDisconnected; - - @AutoString(R.string.statusWelcome) - public String statusWelcome; - - @AutoString(R.string.labelNetworkServerProxyDefault) - public String labelNetworkServerProxyDefault; - - @AutoString(R.string.labelNetworkServerProxySocks5) - public String labelNetworkServerProxySocks5; - - @AutoString(R.string.labelNetworkServerProxyHttp) - public String labelNetworkServerProxyHttp; - - @AutoString(R.string.labelChatlistMinimumActivityNone) - public String labelChatlistMinimumActivityNone; - - @AutoString(R.string.labelChatlistMinimumActivityOther) - public String labelChatlistMinimumActivityOther; - - @AutoString(R.string.labelChatlistMinimumActivityMessage) - public String labelChatlistMinimumActivityMessage; - - @AutoString(R.string.labelChatlistMinimumActivityHighlight) - public String labelChatlistMinimumActivityHighlight; - - @AutoString(R.string.labelIgnoreStrictnessUnmatched) - public String labelIgnoreStrictnessUnmatched; - - @AutoString(R.string.labelIgnoreStrictnessSoft) - public String labelIgnoreStrictnessSoft; - - @AutoString(R.string.labelIgnoreStrictnessHard) - public String labelIgnoreStrictnessHard; - - @AutoString(R.string.labelIgnoreRuleSender) - public String labelIgnoreRuleSender; - - @AutoString(R.string.labelIgnoreRuleMessage) - public String labelIgnoreRuleMessage; - - @AutoString(R.string.labelIgnoreRuleCtcp) - public String labelIgnoreRuleCtcp; - - @AutoString(R.string.labelIgnoreScopeGlobal) - public String labelIgnoreScopeGlobal; - - @AutoString(R.string.labelIgnoreScopeNetwork) - public String labelIgnoreScopeNetwork; - - @AutoString(R.string.labelIgnoreScopeChannel) - public String labelIgnoreScopeChannel; - - @NonNull - public CharSequence formatUsername(@NonNull CharSequence nick, @NonNull CharSequence hostmask) { - return SpanFormatter.format(usernameHostmask, nick, hostmask); - } - - @NonNull - public CharSequence formatJoin(@NonNull CharSequence user, @NonNull CharSequence channel) { - return SpanFormatter.format(messageJoin, user, channel); - } - - @NonNull - public CharSequence formatPart(@NonNull CharSequence user, @NonNull CharSequence channel) { - return SpanFormatter.format(messagePart, user, channel); - } - - @NonNull - public CharSequence formatPart(@NonNull CharSequence user, @NonNull CharSequence channel, @Nullable CharSequence reason) { - if (reason == null || reason.length() == 0) return formatPart(user, channel); - - return SpanFormatter.format(messagePartExtra, user, channel, reason); - } - - @NonNull - public CharSequence formatQuit(@NonNull CharSequence user) { - return SpanFormatter.format(messageQuit, user); - } - - @NonNull - public CharSequence formatQuit(@NonNull CharSequence user, @Nullable CharSequence reason) { - if (reason == null || reason.length() == 0) return formatQuit(user); - - return SpanFormatter.format(messageQuitExtra, user, reason); - } - - @NonNull - public CharSequence formatKill(@NonNull CharSequence user, @NonNull CharSequence subject) { - return SpanFormatter.format(messageKill, user, subject); - } - - @NonNull - public CharSequence formatKill(@NonNull CharSequence user, @NonNull CharSequence subject, @Nullable CharSequence reason) { - return SpanFormatter.format(messageKillExtra, user, subject, reason); - } - - @NonNull - public CharSequence formatKick(@NonNull CharSequence user, @NonNull CharSequence kicked, @NonNull CharSequence channel) { - return SpanFormatter.format(messageKick, user, kicked, channel); - } - - @NonNull - public CharSequence formatKick(@NonNull CharSequence user, @NonNull CharSequence kicked, @Nullable CharSequence reason, @NonNull CharSequence channel) { - if (reason == null || reason.length() == 0) return formatKick(user, kicked, channel); - - return SpanFormatter.format(messageKickExtra, user, kicked, reason, channel); - } - - @NonNull - public CharSequence formatMode(@NonNull CharSequence mode, @NonNull CharSequence user) { - return SpanFormatter.format(messageMode, mode, user); - } - - @NonNull - public CharSequence formatNick(@NonNull CharSequence newNick) { - return SpanFormatter.format(messageNickSelf, newNick); - } - - @NonNull - public CharSequence formatNick(@NonNull CharSequence oldNick, @Nullable CharSequence newNick) { - if (newNick == null || newNick.length() == 0) return formatNick(oldNick); - - return SpanFormatter.format(messageNickOther, oldNick, newNick); - } - - @NonNull - public CharSequence formatDayChange(@NonNull CharSequence day) { - return SpanFormatter.format(messageDaychange, day); - } - - @NonNull - public CharSequence formatAction(@NonNull CharSequence user, @NonNull CharSequence channel) { - return SpanFormatter.format(messageAction, user, channel); - } - - @NonNull - public CharSequence formatPlain(@NonNull CharSequence nick, @NonNull CharSequence message) { - return SpanFormatter.format(messagePlain, nick, message); - } - - public String proxyType(NetworkServer.ProxyType type) { - switch (type) { - default: - case DefaultProxy: - return labelNetworkServerProxyDefault; - case Socks5Proxy: - return labelNetworkServerProxySocks5; - case HttpProxy: - return labelNetworkServerProxyHttp; - } - } - - public String minimumActivity(QBufferViewConfig.MinimumActivity minimumActivity) { - switch (minimumActivity) { - default: - case NONE: - return labelChatlistMinimumActivityNone; - case OTHER: - return labelChatlistMinimumActivityOther; - case MESSAGE: - return labelChatlistMinimumActivityMessage; - case HIGHLIGHT: - return labelChatlistMinimumActivityHighlight; - } - } - - public String strictnessType(QIgnoreListManager.StrictnessType strictnessType) { - switch (strictnessType) { - default: - case UnmatchedStrictness: - return labelIgnoreStrictnessUnmatched; - case SoftStrictness: - return labelIgnoreStrictnessSoft; - case HardStrictness: - return labelIgnoreStrictnessHard; - } - } - - public String ignoreType(QIgnoreListManager.IgnoreType ignoreType) { - switch (ignoreType) { - default: - case SenderIgnore: - return labelIgnoreRuleSender; - case MessageIgnore: - return labelIgnoreRuleMessage; - case CtcpIgnore: - return labelIgnoreRuleCtcp; - } - } - - public String scopeType(QIgnoreListManager.ScopeType scopeType) { - switch (scopeType) { - default: - case GlobalScope: - return labelIgnoreScopeGlobal; - case NetworkScope: - return labelIgnoreScopeNetwork; - case ChannelScope: - return labelIgnoreScopeChannel; - } - } - } - - public static class Colors { - @AutoColor(android.R.color.transparent) - @ColorInt - public int transparent; - - @AutoColor(R.attr.colorPrimary) - @ColorInt - public int colorPrimary; - - @AutoColor(R.attr.colorPrimaryDark) - @ColorInt - public int colorPrimaryDark; - - @AutoColor(R.attr.colorAccent) - @ColorInt - public int colorAccent; - - @AutoColor(R.attr.colorControlHighlight) - @ColorInt - public int colorAccentFocus; - - @AutoColor(R.attr.colorFill) - @ColorInt - public int colorFill; - - @AutoColor(R.attr.colorOffline) - @ColorInt - public int colorOffline; - - @AutoColor(R.attr.colorAway) - @ColorInt - public int colorAway; - - @AutoInt(R.attr.colorForegroundMirc) - public int colorForegroundMirc; - - @AutoColor({R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3, - R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7, - R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB, - R.attr.senderColorC, R.attr.senderColorD, R.attr.senderColorE, R.attr.senderColorF}) - @ColorInt - public int[] senderColors; - - @AutoColor({R.attr.mircColor0, R.attr.mircColor1, R.attr.mircColor2, R.attr.mircColor3, - R.attr.mircColor4, R.attr.mircColor5, R.attr.mircColor6, R.attr.mircColor7, - R.attr.mircColor8, R.attr.mircColor9, R.attr.mircColorA, R.attr.mircColorB, - R.attr.mircColorC, R.attr.mircColorD, R.attr.mircColorE, R.attr.mircColorF}) - @ColorInt - public int[] mircColors; - - @AutoColor(R.attr.colorForeground) - @ColorInt - public int colorForeground; - - @AutoColor(R.attr.colorForegroundHighlight) - @ColorInt - public int colorForegroundHighlight; - - @AutoColor(R.attr.colorForegroundSecondary) - @ColorInt - public int colorForegroundSecondary; - - @AutoColor(R.attr.colorForegroundAction) - @ColorInt - public int colorForegroundAction; - - @AutoColor(R.attr.colorForegroundError) - @ColorInt - public int colorForegroundError; - - @AutoColor(R.attr.colorBackground) - @ColorInt - public int colorBackground; - - @AutoColor(R.attr.colorBackgroundHighlight) - @ColorInt - public int colorBackgroundHighlight; - - @AutoColor(R.attr.colorBackgroundSecondary) - @ColorInt - public int colorBackgroundSecondary; - - @AutoColor(R.attr.colorBackgroundCard) - @ColorInt - public int colorBackgroundCard; - - @AutoColor(R.attr.colorTintActivity) - @ColorInt - public int colorTintActivity; - - @AutoColor(R.attr.colorTintMessage) - @ColorInt - public int colorTintMessage; - - @AutoColor(R.attr.colorTintHighlight) - @ColorInt - public int colorTintHighlight; - - @AutoColor(R.attr.colorControlHighlight) - @ColorInt - public int colorSelected; - - @AutoDimen(R.attr.actionBarSize) - @ColorInt - public int actionBarSize; - - private SparseIntArray colors; - private SparseArray<Drawable> badges; - - public int colorToId(int foregroundColor) { - return colors.get(foregroundColor, -1); - } - - public Drawable badge(int sendercolor) { - return badges.get(sendercolor, null); - } - - public void bind(ContextThemeWrapper wrapper) { - if (badges == null) { - badges = new SparseArray<>(16); - for (int i = 0; i < senderColors.length; i++) { - Drawable drawable = ResourcesCompat.getDrawable(wrapper.getResources(), R.drawable.badge, wrapper.getTheme()); - DrawableCompat.setTint(drawable, senderColors[i]); - badges.put(i, drawable); - } - } - - if (colors == null) { - colors = new SparseIntArray(16); - for (int i = 0; i < mircColors.length; i++) { - colors.put(mircColors[i], i); - } - } - } - } -} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/CompatibilityUtils.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/CompatibilityUtils.kt new file mode 100644 index 000000000..9447b3f5f --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/CompatibilityUtils.kt @@ -0,0 +1,157 @@ +package de.kuschku.quasseldroid_ng.util + +import android.annotation.TargetApi +import android.app.Activity +import android.app.ActivityManager +import android.content.Context +import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.os.Build +import android.support.annotation.ColorInt +import android.support.annotation.ColorRes +import android.support.annotation.DrawableRes +import android.support.annotation.StringRes +import java.io.OutputStream +import java.util.* +import java.util.zip.Deflater +import java.util.zip.DeflaterOutputStream + +object CompatibilityUtils { + /** + * This method is used to check if the current device supports Sockets with the KeepAlive flag. + * + * + * As that feature is only missing on Chromium devices, we just check for that + * + * @return Does the current device support KeepAlive sockets? + */ + fun deviceSupportsKeepAlive(): Boolean { + return !isChromeBook() + } + + fun isChromeBook(): Boolean { + return Build.MANUFACTURER.toLowerCase(Locale.ENGLISH).contains("chromium") || + Build.MANUFACTURER.toLowerCase(Locale.ENGLISH).contains("chrome") || + Build.BRAND.toLowerCase(Locale.ENGLISH).contains("chromium") || + Build.BRAND.toLowerCase(Locale.ENGLISH).contains("chrome") + } + + /** + * This method is used to check if the device supports SyncFlush + * As that feature was only added in KitKat, we just check for the device version. + * + * @return Does the current device support SyncFlush natively? + */ + fun deviceSupportsCompression(): Boolean { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + } + + /** + * Creates a SyncFlush output stream, even if the current device does not support doing so + * natively. + * + * @param rawOut the raw output stream to be wrapped + * @return The wrapping output stream + */ + fun createDeflaterOutputStream(rawOut: OutputStream?): DeflaterOutputStream { + return if (deviceSupportsCompression()) + DeflaterOutputStream(rawOut, true) + else + DeflaterOutputStream(rawOut, createSyncFlushDeflater()) + } + + /** + * Creates a SyncFlush Deflater for use on pre-KitKat Android + * + * @return The modified Deflater, or null if the creation failed + */ + private fun createSyncFlushDeflater(): Deflater? { + val def = Deflater() + try { + val f = def.javaClass.getDeclaredField("flushParm") + f.isAccessible = true + f.setInt(def, 2) // Z_SYNC_FLUSH + } catch (e: Exception) { + return null + } + + return def + } +} + +fun Context.getStatusBarHeight(): Int { + var result = 0 + val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android") + if (resourceId > 0) { + result = resources.getDimensionPixelSize(resourceId) + } + return result +} + +/** + * Because Android’s String::split is broken + * + * @return A list with all substrings of length 1, in order + */ +fun String.split(): Array<String> { + val chars = arrayOfNulls<String>(length) + val charArray = toCharArray() + return chars.indices.map { String(charArray, it, 1) }.toTypedArray() +} + +/** + * Modifies the display of an {@see Activity} in the Android Recents menu if the current version + * of Android supports doing so. + * + * @param label The text shown as label - passed as Android String Resource + * @param icon The icon displayed in recents - passed as Android Drawable Resource + * @param colorPrimary The color used as background for the header of the recents card - passed as Android + * Color Resource + */ +fun Activity.updateRecentsHeaderIfExisting(@StringRes label: Int, @DrawableRes icon: Int, @ColorRes colorPrimary: Int) { + val labelRaw = resources.getString(label) + val iconRaw = BitmapFactory.decodeResource(resources, icon) + val colorPrimaryRaw = getColor(colorPrimary, theme, resources) + updateRecentsHeaderIfExisting(labelRaw, iconRaw, colorPrimaryRaw) +} + +@ColorInt +private fun getColor(@ColorRes color: Int, theme: Resources.Theme, resources: Resources): Int { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + resources.getColor(color, theme) + } else { + // We have to use this method on older systems that don’t yet support the new method + // which is used above + resources.getColor(color) + } +} + +/** + * Modifies the display of an {@see Activity} in the Android Recents menu if the current version + * of Android supports doing so. + * + * @param label The text shown in recents as label + * @param icon The icon displayed in recents + * @param colorPrimary The color used as background for the header of the recents card + */ +fun Activity.updateRecentsHeaderIfExisting(label: String, icon: Bitmap, colorPrimary: Int) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + updateRecentsHeader(label, icon, colorPrimary) + } +} + +/** + * Forcibly updated the recents card of an {@see Activity} in the Android Recents menu. + * + * @param label The text shown in recents as label + * @param icon The icon displayed in recents + * @param colorPrimary The color used as background for the header of the recents card + * @since Lollipop + */ +@TargetApi(Build.VERSION_CODES.LOLLIPOP) +private fun Activity.updateRecentsHeader(label: String, icon: Bitmap, + colorPrimary: Int) { + setTaskDescription(ActivityManager.TaskDescription(label, + icon, colorPrimary)) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/Flag.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/Flag.kt new file mode 100644 index 000000000..e7c22a09c --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/Flag.kt @@ -0,0 +1,70 @@ +package de.kuschku.quasseldroid_ng.util + +interface Flag<T> where T : Enum<T>, T : Flag<T> { + val bit: Int +} + +data class Flags<E>( + val value: Int, + val values: Array<E>? = null +) : Number(), Comparable<Int> where E : Enum<E>, E : Flag<E> { + override fun compareTo(other: Int) = value.compareTo(other) + override fun toByte() = value.toByte() + override fun toChar() = value.toChar() + override fun toDouble() = value.toDouble() + override fun toFloat() = value.toFloat() + override fun toInt() = value + override fun toLong() = value.toLong() + override fun toShort() = value.toShort() + + override fun equals(other: Any?) = when (other) { + is Flags<*> -> other.value == value + is Flag<*> -> other.bit == value + else -> other === this + } + + override fun hashCode(): Int { + return value + } + + fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet() + + override fun toString() = if (values != null) { + enabledValues().joinToString("|", "[", "]") + } else { + value.toString(16) + } + + companion object { + inline fun <reified T> of(int: Int): Flags<T> where T : Flag<T>, T : Enum<T> + = Flags(int, enumValues()) + + inline fun <reified T> of(vararg flags: Flag<T>): Flags<T> where T : Flag<T>, T : Enum<T> + = Flags(flags.map(Flag<T>::bit).distinct().sum(), enumValues()) + } + + interface Factory<E> where E : Flag<E>, E : Enum<E> { + val NONE: Flags<E> + fun of(bit: Int): Flags<E> + fun of(vararg flags: E): Flags<E> + } +} + +infix fun <T> Flags<T>.hasFlag(which: T): Boolean where T : Enum<T>, T : Flag<T> { + // an Undefined flag is a special case. + if (value == 0 || (value > 0 && which.bit == 0)) return false + + return value and which.bit == which.bit +} + +infix fun <T> Flags<T>.or(other: Flag<T>): Flags<T> where T : kotlin.Enum<T>, T : Flag<T> = Flags( + value or other.bit) + +operator infix fun <T> Flags<T>.plus( + other: Flags<T>): Flags<T> where T : Enum<T>, T : Flag<T> = Flags(value or other.value) + +operator infix fun <T> Flags<T>.plus( + other: Flag<T>): Flags<T> where T : Enum<T>, T : Flag<T> = Flags(value or other.bit) + +infix fun <T> Flags<T>.unset(which: T): Flags<T> where T : Enum<T>, T : Flag<T> = Flags( + value xor which.bit) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/LongFlag.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/LongFlag.kt new file mode 100644 index 000000000..fb31a835c --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/LongFlag.kt @@ -0,0 +1,74 @@ +package de.kuschku.quasseldroid_ng.util + +interface LongFlag<T> where T : Enum<T>, T : LongFlag<T> { + val bit: Long +} + +data class LongFlags<E>( + val value: Long, + val values: Array<E>? = null +) : Number(), Comparable<Long> where E : Enum<E>, E : LongFlag<E> { + override fun compareTo(other: Long) = value.compareTo(other) + override fun toByte() = value.toByte() + override fun toChar() = value.toChar() + override fun toDouble() = value.toDouble() + override fun toFloat() = value.toFloat() + override fun toInt() = value.toInt() + override fun toLong() = value + override fun toShort() = value.toShort() + + override fun equals(other: Any?) = when (other) { + is LongFlags<*> -> other.value == value + is LongFlag<*> -> other.bit == value + else -> other === this + } + + override fun hashCode(): Int { + return value.toInt() + } + + fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet() + + override fun toString() = if (values != null) { + enabledValues().joinToString("|", "[", "]") + } else { + value.toString(16) + } + + companion object { + inline fun <reified T> of(int: Long): LongFlags<T> where T : LongFlag<T>, T : Enum<T> + = LongFlags(int, enumValues()) + + inline fun <reified T> of( + vararg flags: LongFlag<T>): LongFlags<T> where T : LongFlag<T>, T : Enum<T> + = LongFlags(flags.map(LongFlag<T>::bit).distinct().sum(), enumValues()) + } + + interface Factory<E> where E : LongFlag<E>, E : Enum<E> { + fun of(bit: Long): LongFlags<E> + fun of(vararg flags: E): LongFlags<E> + } +} + +infix fun <T> LongFlags<T>.hasFlag(which: T): Boolean where T : Enum<T>, T : LongFlag<T> { + // an Undefined flag is a special case. + if (value == 0.toLong() || (value > 0 && which.bit == 0.toLong())) return false + + return value and which.bit == which.bit +} + +infix fun <T> LongFlags<T>.or( + other: LongFlag<T>): LongFlags<T> where T : kotlin.Enum<T>, T : LongFlag<T> = LongFlags( + value or other.bit) + +operator infix fun <T> LongFlags<T>.plus( + other: LongFlags<T>): LongFlags<T> where T : Enum<T>, T : LongFlag<T> = LongFlags( + value or other.value) + +operator infix fun <T> LongFlags<T>.plus( + other: LongFlag<T>): LongFlags<T> where T : Enum<T>, T : LongFlag<T> = LongFlags( + value or other.bit) + +infix fun <T> LongFlags<T>.unset( + which: T): LongFlags<T> where T : Enum<T>, T : LongFlag<T> = LongFlags( + value xor which.bit) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/ShortFlag.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/ShortFlag.kt new file mode 100644 index 000000000..075ce9a17 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/ShortFlag.kt @@ -0,0 +1,78 @@ +package de.kuschku.quasseldroid_ng.util + +import kotlin.experimental.and +import kotlin.experimental.or +import kotlin.experimental.xor + +interface ShortFlag<T> where T : Enum<T>, T : ShortFlag<T> { + val bit: Short +} + +data class ShortFlags<E>( + val value: Short, + val values: Array<E>? = null +) : Number(), Comparable<Short> where E : Enum<E>, E : ShortFlag<E> { + override fun compareTo(other: Short) = value.compareTo(other) + override fun toByte() = value.toByte() + override fun toChar() = value.toChar() + override fun toDouble() = value.toDouble() + override fun toFloat() = value.toFloat() + override fun toInt() = value.toInt() + override fun toLong() = value.toLong() + override fun toShort() = value + + override fun equals(other: Any?) = when (other) { + is ShortFlags<*> -> other.value == value + is ShortFlag<*> -> other.bit == value + else -> other === this + } + + override fun hashCode(): Int { + return value.toInt() + } + + fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet() + + override fun toString() = if (values != null) { + enabledValues().joinToString("|", "[", "]") + } else { + value.toString(16) + } + + companion object { + inline fun <reified T> ofBitMask(int: Short): ShortFlags<T> where T : ShortFlag<T>, T : Enum<T> + = ShortFlags(int, enumValues()) + + inline fun <reified T> of( + vararg flags: ShortFlag<T>): ShortFlags<T> where T : ShortFlag<T>, T : Enum<T> + = ShortFlags(flags.map(ShortFlag<T>::bit).distinct().sum().toShort(), enumValues()) + } + + interface Factory<E> where E : ShortFlag<E>, E : Enum<E> { + fun of(bit: Short): ShortFlags<E> + fun of(vararg flags: E): ShortFlags<E> + } +} + +infix fun <T> ShortFlags<T>.hasFlag(which: T): Boolean where T : Enum<T>, T : ShortFlag<T> { + // an Undefined flag is a special case. + if (value == 0.toShort() || (value > 0 && which.bit == 0.toShort())) return false + + return value and which.bit == which.bit +} + +infix fun <T> ShortFlags<T>.or( + other: ShortFlag<T>): ShortFlags<T> where T : kotlin.Enum<T>, T : ShortFlag<T> = ShortFlags( + value or other.bit) + +operator infix fun <T> ShortFlags<T>.plus( + other: ShortFlags<T>): ShortFlags<T> where T : Enum<T>, T : ShortFlag<T> = ShortFlags( + value or other.value) + +operator infix fun <T> ShortFlags<T>.plus( + other: ShortFlag<T>): ShortFlags<T> where T : Enum<T>, T : ShortFlag<T> = ShortFlags( + value or other.bit) + +infix fun <T> ShortFlags<T>.unset( + which: T): ShortFlags<T> where T : Enum<T>, T : ShortFlag<T> = ShortFlags( + value xor which.bit) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ByteBufferHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ByteBufferHelper.kt new file mode 100644 index 000000000..f1cbe5336 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ByteBufferHelper.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid_ng.util.helpers + +import java.nio.ByteBuffer + +fun ByteBuffer.copyTo(target: ByteBuffer) { + while (target.remaining() > 8) + target.putLong(this.long) + while (target.hasRemaining()) + target.put(this.get()) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ContextHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ContextHelper.kt new file mode 100644 index 000000000..9d3d49ce8 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ContextHelper.kt @@ -0,0 +1,10 @@ +package de.kuschku.quasseldroid_ng.util.helpers + +import android.content.Context +import android.os.Build + +inline fun <reified T> Context.systemService(): T = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + getSystemService(T::class.java) +} else { + getSystemService(T::class.java.simpleName) as T +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/LogHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/LogHelper.kt new file mode 100644 index 000000000..47ba0abbf --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/LogHelper.kt @@ -0,0 +1,233 @@ +package de.kuschku.quasseldroid_ng.util.helpers + +import android.util.Log +import de.kuschku.quasseldroid_ng.BuildConfig + +class Logger { + companion object { + var handler: ((String, String?, Throwable?) -> Unit)? = null + } +} + +inline fun Logger.Companion.loggable(tag: String, level: Int, f: Logger.Companion.() -> Unit) { + if (BuildConfig.DEBUG || Log.isLoggable(tag, level) || true) { + Logger.Companion.f() + } +} + +/* VERBOSE */ + +inline fun Logger.Companion.verbose(tag: String, msg: String) + = loggable(tag, Log.VERBOSE) { + Log.v(tag, msg) + handler?.invoke(tag, msg, null) +} + +inline fun Logger.Companion.verbose(tag: String, msg: () -> String) + = loggable(tag, Log.VERBOSE) { + val msg1 = msg() + Log.v(tag, msg1) + handler?.invoke(tag, msg1, null) +} + +inline fun Logger.Companion.verbose(tag: String, msg: String, tr: Throwable) + = loggable(tag, Log.VERBOSE) { + Log.v(tag, msg, tr) + handler?.invoke(tag, msg, tr) +} + +inline fun Logger.Companion.verbose(tag: String, msg: () -> String, tr: Throwable) + = loggable(tag, Log.VERBOSE) { + val msg1 = msg() + Log.v(tag, msg1, tr) + handler?.invoke(tag, msg1, tr) +} + +inline fun Logger.Companion.verbose(tag: String, msg: String, tr: () -> Throwable) + = loggable(tag, Log.VERBOSE) { + val tr1 = tr() + Log.v(tag, msg, tr1) + handler?.invoke(tag, msg, tr1) +} + +inline fun Logger.Companion.verbose(tag: String, msg: () -> String, tr: () -> Throwable) + = loggable(tag, Log.VERBOSE) { + val tr1 = tr() + val msg1 = msg() + Log.v(tag, msg1, tr1) + handler?.invoke(tag, msg1, tr1) +} + + +/* DEBUG */ + +inline fun Logger.Companion.debug(tag: String, msg: String) + = loggable(tag, Log.DEBUG) { + Log.d(tag, msg) + handler?.invoke(tag, msg, null) +} + +inline fun Logger.Companion.debug(tag: String, msg: () -> String) + = loggable(tag, Log.DEBUG) { + val msg1 = msg() + Log.d(tag, msg1) + handler?.invoke(tag, msg1, null) +} + +inline fun Logger.Companion.debug(tag: String, msg: String, tr: Throwable) + = loggable(tag, Log.DEBUG) { + Log.d(tag, msg, tr) + handler?.invoke(tag, msg, tr) +} + +inline fun Logger.Companion.debug(tag: String, msg: () -> String, tr: Throwable) + = loggable(tag, Log.DEBUG) { + val msg1 = msg() + Log.d(tag, msg1, tr) + handler?.invoke(tag, msg1, tr) +} + +inline fun Logger.Companion.debug(tag: String, msg: String, tr: () -> Throwable) + = loggable(tag, Log.DEBUG) { + val tr1 = tr() + Log.d(tag, msg, tr1) + handler?.invoke(tag, msg, tr1) +} + +inline fun Logger.Companion.debug(tag: String, msg: () -> String, tr: () -> Throwable) + = loggable(tag, Log.DEBUG) { + val tr1 = tr() + val msg1 = msg() + Log.d(tag, msg1, tr1) + handler?.invoke(tag, msg1, tr1) +} + + +/* INFO */ + +inline fun Logger.Companion.info(tag: String, msg: String) + = loggable(tag, Log.INFO) { + Log.i(tag, msg) + handler?.invoke(tag, msg, null) +} + +inline fun Logger.Companion.info(tag: String, msg: () -> String) + = loggable(tag, Log.INFO) { + val msg1 = msg() + Log.i(tag, msg1) + handler?.invoke(tag, msg1, null) +} + +inline fun Logger.Companion.info(tag: String, msg: String, tr: Throwable) + = loggable(tag, Log.INFO) { + Log.i(tag, msg, tr) + handler?.invoke(tag, msg, tr) +} + +inline fun Logger.Companion.info(tag: String, msg: () -> String, tr: Throwable) + = loggable(tag, Log.INFO) { + val msg1 = msg() + Log.i(tag, msg1, tr) + handler?.invoke(tag, msg1, tr) +} + +inline fun Logger.Companion.info(tag: String, msg: String, tr: () -> Throwable) + = loggable(tag, Log.INFO) { + val tr1 = tr() + Log.i(tag, msg, tr1) + handler?.invoke(tag, msg, tr1) +} + +inline fun Logger.Companion.info(tag: String, msg: () -> String, tr: () -> Throwable) + = loggable(tag, Log.INFO) { + val tr1 = tr() + val msg1 = msg() + Log.i(tag, msg1, tr1) + handler?.invoke(tag, msg1, tr1) +} + +/* WARN */ + +inline fun Logger.Companion.warn(tag: String, msg: String) + = loggable(tag, Log.WARN) { + Log.w(tag, msg) + handler?.invoke(tag, msg, null) +} + +inline fun Logger.Companion.warn(tag: String, msg: () -> String) + = loggable(tag, Log.WARN) { + val msg1 = msg() + Log.w(tag, msg1) + handler?.invoke(tag, msg1, null) +} + +inline fun Logger.Companion.warn(tag: String, msg: String, tr: Throwable) + = loggable(tag, Log.WARN) { + Log.w(tag, msg, tr) + handler?.invoke(tag, msg, tr) +} + +inline fun Logger.Companion.warn(tag: String, msg: () -> String, tr: Throwable) + = loggable(tag, Log.WARN) { + val msg1 = msg() + Log.w(tag, msg1, tr) + handler?.invoke(tag, msg1, tr) +} + +inline fun Logger.Companion.warn(tag: String, msg: String, tr: () -> Throwable) + = loggable(tag, Log.WARN) { + val tr1 = tr() + Log.w(tag, msg, tr1) + handler?.invoke(tag, msg, tr1) +} + +inline fun Logger.Companion.warn(tag: String, msg: () -> String, tr: () -> Throwable) + = loggable(tag, Log.WARN) { + val tr1 = tr() + val msg1 = msg() + Log.w(tag, msg1, tr1) + handler?.invoke(tag, msg1, tr1) +} + +/* ERROR */ + +inline fun Logger.Companion.error(tag: String, msg: String) + = loggable(tag, Log.ERROR) { + Log.e(tag, msg) + handler?.invoke(tag, msg, null) +} + +inline fun Logger.Companion.error(tag: String, msg: () -> String) + = loggable(tag, Log.ERROR) { + val msg1 = msg() + Log.e(tag, msg1) + handler?.invoke(tag, msg1, null) +} + +inline fun Logger.Companion.error(tag: String, msg: String, tr: Throwable) + = loggable(tag, Log.ERROR) { + Log.e(tag, msg, tr) + handler?.invoke(tag, msg, tr) +} + +inline fun Logger.Companion.error(tag: String, msg: () -> String, tr: Throwable) + = loggable(tag, Log.ERROR) { + val msg1 = msg() + Log.e(tag, msg1, tr) + handler?.invoke(tag, msg1, tr) +} + +inline fun Logger.Companion.error(tag: String, msg: String, tr: () -> Throwable) + = loggable(tag, Log.ERROR) { + val tr1 = tr() + Log.e(tag, msg, tr1) + handler?.invoke(tag, msg, tr1) +} + +inline fun Logger.Companion.error(tag: String, msg: () -> String, tr: () -> Throwable) + = loggable(tag, Log.ERROR) { + val tr1 = tr() + val msg1 = msg() + Log.e(tag, msg1, tr1) + handler?.invoke(tag, msg1, tr1) +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MapHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MapHelper.kt new file mode 100644 index 000000000..ea31a4dc8 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MapHelper.kt @@ -0,0 +1,4 @@ +package de.kuschku.quasseldroid_ng.util.helpers + +fun <K, V> Map<K, V>.getOr(key: K, defValue: V) + = this[key] ?: defValue diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MathHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MathHelper.kt new file mode 100644 index 000000000..692bd6fd4 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MathHelper.kt @@ -0,0 +1,2 @@ +inline fun Int.clamp(lowerBound: Int, upperBound: Int): Int + = maxOf(lowerBound, minOf(this, upperBound)) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/TransformationsHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/TransformationsHelper.kt new file mode 100644 index 000000000..85d9fc0bb --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/TransformationsHelper.kt @@ -0,0 +1,69 @@ +package de.kuschku.quasseldroid_ng.util.helpers + +import android.arch.lifecycle.LifecycleOwner +import android.arch.lifecycle.LiveData +import android.arch.lifecycle.MediatorLiveData +import android.arch.lifecycle.Observer +import android.support.annotation.MainThread + +@MainThread +fun <X, Y> stickySwitchMapNotNull( + trigger: LiveData<X?>, + func: (X) -> LiveData<Y>?, + defaultValue: Y +): LiveData<Y> { + val result = object : MediatorLiveData<Y>() { + override fun observe(owner: LifecycleOwner?, observer: Observer<Y>?) { + super.observe(owner, observer) + observer?.onChanged(value ?: defaultValue) + } + + override fun observeForever(observer: Observer<Y>?) { + super.observeForever(observer) + observer?.onChanged(value ?: defaultValue) + } + } + result.addSource(trigger, object : Observer<X?> { + internal var mSource: LiveData<Y>? = null + + override fun onChanged(x: X?) { + val newLiveData = if (x != null) func(x) else null + if (mSource === newLiveData) { + return + } + if (mSource != null) { + result.removeSource(mSource) + } + mSource = newLiveData + if (mSource != null) { + result.addSource(mSource) { y -> result.value = y ?: defaultValue } + } else { + result.value = defaultValue + } + } + }) + return result +} + +@MainThread +fun <X, Y> stickyMapNotNull( + trigger: LiveData<X?>, + func: (X) -> Y?, + defaultValue: Y +): LiveData<Y> { + val result = object : MediatorLiveData<Y>() { + override fun observe(owner: LifecycleOwner?, observer: Observer<Y>?) { + super.observe(owner, observer) + observer?.onChanged(value ?: defaultValue) + } + + override fun observeForever(observer: Observer<Y>?) { + super.observeForever(observer) + observer?.onChanged(value ?: defaultValue) + } + } + result.addSource(trigger) { x -> + result.setValue(if (x == null) defaultValue else func(x) ?: defaultValue) + } + return result +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/WritableByteChannelHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/WritableByteChannelHelper.kt new file mode 100644 index 000000000..32ad45b7a --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/WritableByteChannelHelper.kt @@ -0,0 +1,9 @@ +package de.kuschku.quasseldroid_ng.util.helpers + +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import java.nio.channels.WritableByteChannel + +fun WritableByteChannel.write(buffer: ChainedByteBuffer) { + buffer.write(this) + buffer.clear() +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/ChainedByteBuffer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/ChainedByteBuffer.kt new file mode 100644 index 000000000..348ecf329 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/ChainedByteBuffer.kt @@ -0,0 +1,111 @@ +package de.kuschku.quasseldroid_ng.util.nio + +import java.nio.ByteBuffer +import java.nio.channels.WritableByteChannel +import java.util.* + + +class ChainedByteBuffer(private val bufferSize: Int = 1024, private val direct: Boolean = false) { + private val bufferList: MutableList<ByteBuffer> = ArrayList() + + var size = 0 + private set + + private var currentBuffer = 0 + + private fun allocate(size: Int) = when (direct) { + true -> ByteBuffer.allocateDirect(size) + false -> ByteBuffer.allocate(size) + } + + private fun ensureSpace(size: Int) { + if (bufferList.isEmpty()) { + bufferList.add(allocate(bufferSize)) + } + if (bufferList[currentBuffer].remaining() < size) { + currentBuffer += 1 + } + if (currentBuffer == bufferList.size) { + bufferList.add(allocate(bufferSize)) + } + this.size += size + } + + fun put(value: Byte) { + ensureSpace(1) + + bufferList.last().put(value) + } + + fun putChar(value: Char) { + ensureSpace(2) + + bufferList.last().putChar(value) + } + + fun putShort(value: Short) { + ensureSpace(2) + + bufferList.last().putShort(value) + } + + fun putInt(value: Int) { + ensureSpace(4) + + bufferList.last().putInt(value) + } + + fun putLong(value: Long) { + ensureSpace(8) + + bufferList.last().putLong(value) + } + + fun putFloat(value: Float) { + ensureSpace(4) + + bufferList.last().putFloat(value) + } + + fun putDouble(value: Double) { + ensureSpace(8) + + bufferList.last().putDouble(value) + } + + fun put(value: ByteBuffer) { + while (value.remaining() > 8) { + putLong(value.long) + } + while (value.hasRemaining()) { + put(value.get()) + } + } + + fun put(value: ByteArray) { + value.forEach(this::put) + } + + fun clear() { + bufferList.clear() + currentBuffer = 0 + size = 0 + } + + fun write(channel: WritableByteChannel) { + for (buffer in bufferList) { + buffer.flip() + channel.write(buffer) + } + } + + fun toBuffer(): ByteBuffer { + val byteBuffer = allocate(size) + for (buffer in bufferList) { + buffer.flip() + byteBuffer.put(buffer) + } + byteBuffer.flip() + return byteBuffer + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/WrappedChannel.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/WrappedChannel.kt new file mode 100644 index 000000000..70156f382 --- /dev/null +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/WrappedChannel.kt @@ -0,0 +1,192 @@ +package de.kuschku.quasseldroid_ng.util.nio + +import de.kuschku.quasseldroid_ng.session.SocketAddress +import de.kuschku.quasseldroid_ng.util.CompatibilityUtils +import java.io.Flushable +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import java.net.Socket +import java.net.SocketException +import java.nio.ByteBuffer +import java.nio.channels.* +import java.security.GeneralSecurityException +import java.util.zip.InflaterInputStream +import javax.net.ssl.SSLContext +import javax.net.ssl.SSLSocket +import javax.net.ssl.X509TrustManager + + +class WrappedChannel( + private val socket: Socket, + private val rawInStream: InputStream? = null, + private val rawOutStream: OutputStream? = null, + private var flusher: (() -> Unit)? = null +) : Flushable, ByteChannel, InterruptibleChannel { + private var rawIn: ReadableByteChannel? = null + private var rawOut: WritableByteChannel? = null + + init { + this.rawIn = Channels.newChannel(rawInStream) + this.rawOut = Channels.newChannel(rawOutStream) + } + + companion object { + fun ofSocket(s: Socket): WrappedChannel { + return WrappedChannel(s, s.getInputStream(), + s.getOutputStream()) + } + } + + fun withCompression(): WrappedChannel { + val deflaterOutputStream = CompatibilityUtils.createDeflaterOutputStream(rawOutStream) + return WrappedChannel(socket, InflaterInputStream(rawInStream), deflaterOutputStream, + deflaterOutputStream::flush + ) + } + + @Throws(GeneralSecurityException::class, IOException::class) + fun withSSL(certificateManager: X509TrustManager, address: SocketAddress): WrappedChannel { + val context = SSLContext.getInstance("TLSv1.2") + val managers = arrayOf(certificateManager) + context.init(null, managers, null) + val factory = context.socketFactory + val socket = factory.createSocket(socket, address.host, address.port.toInt(), true) as SSLSocket + socket.useClientMode = true + socket.startHandshake() + return WrappedChannel.ofSocket(socket) + } + + /** + * Reads a sequence of bytes from this channel into the given buffer. + * <p> + * <p> An attempt is made to read up to <i>r</i> bytes from the channel, + * where <i>r</i> is the number of bytes remaining in the buffer, that is, + * <tt>dst.remaining()</tt>, at the moment this method is invoked. + * <p> + * <p> Suppose that a byte sequence of length <i>n</i> is read, where + * <tt>0</tt> <tt><=</tt> <i>n</i> <tt><=</tt> <i>r</i>. + * This byte sequence will be transferred into the buffer so that the first + * byte in the sequence is at index <i>p</i> and the last byte is at index + * <i>p</i> <tt>+</tt> <i>n</i> <tt>-</tt> <tt>1</tt>, + * where <i>p</i> is the buffer's position at the moment this method is + * invoked. Upon return the buffer's position will be equal to + * <i>p</i> <tt>+</tt> <i>n</i>; its limit will not have changed. + * <p> + * <p> A read operation might not fill the buffer, and in fact it might not + * read any bytes at all. Whether or not it does so depends upon the + * nature and state of the channel. A socket channel in non-blocking mode, + * for example, cannot read any more bytes than are immediately available + * from the socket's input buffer; similarly, a file channel cannot read + * any more bytes than remain in the file. It is guaranteed, however, that + * if a channel is in blocking mode and there is at least one byte + * remaining in the buffer then this method will block until at least one + * byte is read. + * <p> + * <p> This method may be invoked at any time. If another thread has + * already initiated a read operation upon this channel, however, then an + * invocation of this method will block until the first operation is + * complete. + * + * @param dst The buffer into which bytes are to be transferred + * @return The number of bytes read, possibly zero, or <tt>-1</tt> if the + * channel has reached end-of-stream + * @throws IOException If some other I/O Error occurs + */ + @Throws(IOException::class) + override fun read(dst: ByteBuffer): Int { + val stream = rawIn ?: throw SocketException("Socket Closed") + return stream.read(dst) + } + + /** + * Writes a sequence of bytes to this channel from the given buffer. + * <p> + * <p> An attempt is made to write up to <i>r</i> bytes to the channel, + * where <i>r</i> is the number of bytes remaining in the buffer, that is, + * <tt>src.remaining()</tt>, at the moment this method is invoked. + * <p> + * <p> Suppose that a byte sequence of length <i>n</i> is written, where + * <tt>0</tt> <tt><=</tt> <i>n</i> <tt><=</tt> <i>r</i>. + * This byte sequence will be transferred from the buffer starting at index + * <i>p</i>, where <i>p</i> is the buffer's position at the moment this + * method is invoked; the index of the last byte written will be + * <i>p</i> <tt>+</tt> <i>n</i> <tt>-</tt> <tt>1</tt>. + * Upon return the buffer's position will be equal to + * <i>p</i> <tt>+</tt> <i>n</i>; its limit will not have changed. + * <p> + * <p> Unless otherwise specified, a write operation will return only after + * writing all of the <i>r</i> requested bytes. Some types of channels, + * depending upon their state, may write only some of the bytes or possibly + * none at all. A socket channel in non-blocking mode, for example, cannot + * write any more bytes than are free in the socket's output buffer. + * <p> + * <p> This method may be invoked at any time. If another thread has + * already initiated a write operation upon this channel, however, then an + * invocation of this method will block until the first operation is + * complete. </p> + * + * @param src The buffer from which bytes are to be retrieved + * @return The number of bytes written, possibly zero + * @throws IOException If some other I/O Error occurs + */ + @Throws(IOException::class) + override fun write(src: ByteBuffer): Int { + val stream = rawOut ?: throw SocketException("Socket Closed") + return stream.write(src) + } + + override fun isOpen(): Boolean { + return rawIn != null || rawOut != null + } + + /** + * Closes this channel. + * <p> + * <p> After a channel is closed, any further attempt to invoke I/O + * operations upon it will cause a {@link ClosedChannelException} to be + * thrown. + * <p> + * <p> If this channel is already closed then invoking this method has no + * effect. + * <p> + * <p> This method may be invoked at any time. If some other thread has + * already invoked it, however, then another invocation will block until + * the first invocation is complete, after which it will return without + * effect. </p> + * + * @throws IOException If an I/O Error occurs + */ + @Throws(IOException::class) + override fun close() { + rawIn?.close() + rawIn = null + rawOut?.close() + rawOut = null + } + + /** + * Flushes this stream by writing any buffered output to the underlying + * stream. + * + * @throws IOException If an I/O Error occurs + */ + @Throws(IOException::class) + override fun flush() { + flusher?.invoke() + } +} + +fun ByteArray.toHexDump(): String { + val buf = StringBuffer() + var i = 0 + buf.append("HexDump ========================================================================\n") + while (i < this.size) { + buf.append(String.format("%02x ", this[i])) + if (i > 0 && (i + 1) % 32 == 0) { + buf.append("\n") + } + i++ + } + return buf.toString() +} diff --git a/app/src/main/java/de/kuschku/util/AndroidAssert.java b/app/src/main/java/de/kuschku/util/AndroidAssert.java deleted file mode 100644 index 055db4b0d..000000000 --- a/app/src/main/java/de/kuschku/util/AndroidAssert.java +++ /dev/null @@ -1,377 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import junit.framework.Assert; - -import de.kuschku.quasseldroid_ng.BuildConfig; -import de.kuschku.util.backports.Objects; - -/** - * Class to provide the Assert functionality of JUnit at runtime for debug builds - */ -@SuppressWarnings({"unused", "WeakerAccess", "Contract"}) -public class AndroidAssert extends Assert { - private AndroidAssert() { - } - - public static void assertTrue(Throwable message, boolean condition) { - if (BuildConfig.DEBUG) { - if (!condition) fail(message); - } - } - - public static void assertTrue(@Nullable String message, boolean condition) { - if (BuildConfig.DEBUG) { - if (!condition) fail(message); - } - } - - public static void assertTrue(boolean condition) { - if (BuildConfig.DEBUG) { - if (!condition) fail(); - } - } - - public static void assertFalse(Throwable message, boolean condition) { - if (BuildConfig.DEBUG) { - if (condition) fail(message); - } - } - - public static void assertFalse(String message, boolean condition) { - if (BuildConfig.DEBUG) { - if (condition) fail(message); - } - } - - public static void assertFalse(boolean condition) { - if (BuildConfig.DEBUG) { - if (condition) fail(); - } - } - - public static void fail(Throwable message) { - if (BuildConfig.DEBUG) { - throw new RuntimeException(message); - } - } - - public static void fail(@Nullable String message) { - if (BuildConfig.DEBUG) { - throw new AssertionError(message); - } - } - - public static void fail() { - if (BuildConfig.DEBUG) { - throw new AssertionError(); - } - } - - public static void assertEquals(Throwable message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, String expected, String actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, String expected, String actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String expected, String actual) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, double expected, double actual, double delta) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - - public static void assertEquals(String message, double expected, double actual, double delta) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(double expected, double actual, double delta) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, float expected, float actual, float delta) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, float expected, float actual, float delta) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(float expected, float actual, float delta) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, long expected, long actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, long expected, long actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(long expected, long actual) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, boolean expected, boolean actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, boolean expected, boolean actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(boolean expected, boolean actual) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, byte expected, byte actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, byte expected, byte actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(byte expected, byte actual) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, char expected, char actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, char expected, char actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(char expected, char actual) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, short expected, short actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, short expected, short actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(short expected, short actual) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertEquals(Throwable message, int expected, int actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(String message, int expected, int actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, Objects.equals(expected, actual)); - } - } - - public static void assertEquals(int expected, int actual) { - if (BuildConfig.DEBUG) { - assertTrue(Objects.equals(expected, actual)); - } - } - - public static void assertNotNull(@Nullable Object object) { - if (BuildConfig.DEBUG) { - assertTrue(object != null); - } - } - - public static void assertNotNull(@Nullable String message, @Nullable Object object) { - if (BuildConfig.DEBUG) { - assertTrue(message, object != null); - } - } - - public static void assertNotNull(Throwable message, @Nullable Object object) { - if (BuildConfig.DEBUG) { - assertTrue(message, object != null); - } - } - - public static void assertNull(@Nullable Object object) { - if (BuildConfig.DEBUG) { - assertTrue(object == null); - } - } - - public static void assertNull(String message, @Nullable Object object) { - if (BuildConfig.DEBUG) { - assertTrue(message, object == null); - } - } - - public static void assertNull(Throwable message, @Nullable Object object) { - if (BuildConfig.DEBUG) { - assertTrue(message, object == null); - } - } - - - public static void assertSame(String message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, expected == actual); - } - } - - public static void assertSame(Throwable message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, expected == actual); - } - } - - public static void assertSame(Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(expected == actual); - } - } - - public static void assertNotSame(Throwable message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, expected != actual); - } - } - - public static void assertNotSame(String message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(message, expected != actual); - } - } - - public static void assertNotSame(Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertTrue(expected != actual); - } - } - - public static void failSame(String message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertNotSame(message, expected, actual); - } - } - - public static void failNotSame(String message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertSame(message, expected, actual); - } - } - - public static void failNotEquals(String message, Object expected, Object actual) { - if (BuildConfig.DEBUG) { - assertEquals(message, expected, actual); - } - } - - public static void assertEquals(@NonNull int... elements) { - if (BuildConfig.DEBUG) { - if (elements.length > 0) { - int first = elements[0]; - for (int i = 1; i < elements.length; i++) { - if (first != elements[i]) - fail(); - } - } - } - } -} diff --git a/app/src/main/java/de/kuschku/util/CompatibilityUtils.java b/app/src/main/java/de/kuschku/util/CompatibilityUtils.java deleted file mode 100644 index 79a8b942b..000000000 --- a/app/src/main/java/de/kuschku/util/CompatibilityUtils.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util; - -import android.content.Context; -import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.io.OutputStream; -import java.lang.reflect.Field; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; - -public class CompatibilityUtils { - private CompatibilityUtils() { - } - - /** - * This method is used to check if the current device supports Sockets with the KeepAlive flag. - * <p> - * As that feature is only missing on Chromium devices, we just check for that - * - * @return Does the current device support KeepAlive sockets? - */ - public static boolean deviceSupportsKeepAlive() { - return !(Build.MANUFACTURER.toLowerCase().contains("chromium") && Build.BRAND.toLowerCase().contains("chromium")); - } - - /** - * This method is used to check if the device supports SyncFlush - * <p> - * As that feature was only added in KitKat, we just check for the device version. - * - * @return Does the current device support SyncFlush natively? - */ - public static boolean deviceSupportsCompression() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; - } - - /** - * Creates a SyncFlush output stream, even if the current device does not support doing so - * natively. - * - * @param rawOut the raw output stream to be wrapped - * @return The wrapping output stream - */ - @NonNull - public static DeflaterOutputStream createDeflaterOutputStream(@Nullable OutputStream rawOut) { - if (deviceSupportsCompression()) return new DeflaterOutputStream(rawOut, true); - else return new DeflaterOutputStream(rawOut, createSyncFlushDeflater()); - } - - /** - * Creates a SyncFlush Deflater for use on pre-KitKat Android - * - * @return The modified Deflater, or null if the creation failed - */ - @Nullable - private static Deflater createSyncFlushDeflater() { - Deflater def = new Deflater(); - try { - Field f = def.getClass().getDeclaredField("flushParm"); - f.setAccessible(true); - f.setInt(def, 2); // Z_SYNC_FLUSH - } catch (Exception e) { - return null; - } - return def; - } - - /** - * Because Android’s String::split is broken - * - * @param str The string to be broken into chars - * @return A list with all substrings of length 1 of the first string, in order - */ - @NonNull - public static String[] partStringByChar(@NonNull String str) { - String[] chars = new String[str.length()]; - char[] charArray = str.toCharArray(); - for (int i = 0; i < chars.length; i++) { - chars[i] = new String(charArray, i, 1); - } - return chars; - } - - public static int getStatusBarHeight(Context context) { - int result = 0; - int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); - if (resourceId > 0) { - result = context.getResources().getDimensionPixelSize(resourceId); - } - return result; - } -} diff --git a/app/src/main/java/de/kuschku/util/accounts/Account.java b/app/src/main/java/de/kuschku/util/accounts/Account.java deleted file mode 100644 index f43146389..000000000 --- a/app/src/main/java/de/kuschku/util/accounts/Account.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.accounts; - -import java.util.UUID; - -public class Account { - public final UUID id; - - public final String name; - - public final String host; - public final int port; - - public final String user; - public final String pass; - - public Account(UUID id, String name, String host, int port, String user, String pass) { - this.id = id; - this.name = name; - this.host = host; - this.port = port; - this.user = user; - this.pass = pass; - } - - public ServerAddress toAddress() { - return new ServerAddress(host, port); - } - - public Account withLoginData(String user, String pass) { - return new Account(id, name, host, port, user, pass); - } - - public Account withServerData(String host, int port) { - return new Account(id, name, host, port, user, pass); - } - - public Account withName(String name) { - return new Account(id, name, host, port, user, pass); - } -} diff --git a/app/src/main/java/de/kuschku/util/accounts/AccountManager.java b/app/src/main/java/de/kuschku/util/accounts/AccountManager.java deleted file mode 100644 index e6126f4eb..000000000 --- a/app/src/main/java/de/kuschku/util/accounts/AccountManager.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.accounts; - -import android.content.Context; - -import java.util.Set; -import java.util.UUID; - -public class AccountManager { - final AccountManagerHelper helper; - - public AccountManager(Context context) { - helper = new AccountManagerHelper(context); - } - - public Set<Account> accounts() { - return helper.findAllAccounts(); - } - - public void add(Account account) { - helper.addAccount(account); - } - - public void update(Account account) { - helper.updateAccount(account); - } - - public void remove(String id) { - remove(UUID.fromString(id)); - } - - public void remove(UUID id) { - helper.removeAccount(id); - } - - public void remove(Account account) { - remove(account.id); - } - - public Account account(String id) { - return helper.account(id); - } -} diff --git a/app/src/main/java/de/kuschku/util/accounts/AccountManagerHelper.java b/app/src/main/java/de/kuschku/util/accounts/AccountManagerHelper.java deleted file mode 100644 index db1a817e8..000000000 --- a/app/src/main/java/de/kuschku/util/accounts/AccountManagerHelper.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.accounts; - -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteStatement; -import android.support.annotation.NonNull; -import android.util.Log; - -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - -public class AccountManagerHelper extends SQLiteOpenHelper { - private static final int DATABASE_VERSION = 1; - @NonNull - private static final String DATABASE_NAME = "accounts"; - @NonNull - private static final String TABLE_ACCOUNTS = "accounts"; - - @NonNull - private static final String KEY_ID = "account_id"; - @NonNull - private static final String KEY_NAME = "account_name"; - @NonNull - private static final String KEY_HOST = "account_host"; - @NonNull - private static final String KEY_PORT = "account_port"; - @NonNull - private static final String KEY_USER = "account_user"; - @NonNull - private static final String KEY_PASS = "account_pass"; - - // Again we can only use String.format, as SQL doesn’t support table or column names to be bound - // in prepared statements - @NonNull - private static final String STATEMENT_INSERT = - String.format("INSERT OR IGNORE INTO %s(%s, %s, %s, %s, %s, %s) VALUES (?, ?, ?, ?, ?, ?)", - TABLE_ACCOUNTS, KEY_ID, KEY_NAME, KEY_HOST, KEY_PORT, KEY_USER, KEY_PASS); - @NonNull - private static final String STATEMENT_DELETE = - String.format("DELETE FROM %s WHERE %s = ?", - TABLE_ACCOUNTS, KEY_ID); - - @NonNull - private static final String SPECIFIER_FIND = - String.format("%s = ?", KEY_ID); - - public AccountManagerHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - } - - @Override - public void onCreate(SQLiteDatabase db) { - // Why do we use String.format and not prepared statements? Because we can’t bind table or - // column names in prepared statements - String statement = String.format("CREATE TABLE %s (%s, %s, %s, %s, %s, %s, PRIMARY KEY (%s), UNIQUE(%s));", - TABLE_ACCOUNTS, - KEY_ID, KEY_NAME, KEY_HOST, KEY_PORT, KEY_USER, KEY_PASS, - KEY_ID, - KEY_ID); - db.execSQL(statement); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - - } - - public boolean addAccount(Account account) { - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_INSERT); - statement.bindString(1, account.id.toString()); - statement.bindString(2, account.name); - statement.bindString(3, account.host); - statement.bindLong(4, account.port); - statement.bindString(5, account.user); - statement.bindString(6, account.pass); - // executeInsert returns -1 if unsuccessful - return statement.executeInsert() != -1; - } - - public boolean updateAccount(Account account) { - removeAccount(account.id); - return addAccount(account); - } - - public boolean removeAccount(UUID id) { - return removeAccount(id.toString()); - } - - public boolean removeAccount(String id) { - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_DELETE); - statement.bindString(1, id); - // executeUpdateDelete returns amount of modified rows - return statement.executeUpdateDelete() > 0; - } - - private Cursor cursorFindAllAccounts() { - SQLiteDatabase db = this.getReadableDatabase(); - return db.query( - // table name - TABLE_ACCOUNTS, - // column names - new String[]{KEY_ID, KEY_NAME, KEY_HOST, KEY_PORT, KEY_USER, KEY_PASS}, - null, - null, - null, - null, - null, - null - ); - } - - private Cursor cursorFindAccount(String id) { - SQLiteDatabase db = this.getReadableDatabase(); - return db.query( - // table name - TABLE_ACCOUNTS, - // column names - new String[]{KEY_ID, KEY_NAME, KEY_HOST, KEY_PORT, KEY_USER, KEY_PASS}, - // where clause - SPECIFIER_FIND, - // binds for where clause - new String[]{id}, - null, - null, - null, - null - ); - } - - @NonNull - public Set<Account> findAllAccounts() { - Cursor cursor = cursorFindAllAccounts(); - - Set<Account> accounts = new HashSet<>(cursor.getCount()); - - if (cursor.moveToFirst()) { - do { - String id = cursor.getString(0); - String name = cursor.getString(1); - String host = cursor.getString(2); - int port = (int) cursor.getLong(3); - String user = cursor.getString(4); - String pass = cursor.getString(5); - try { - accounts.add(new Account(UUID.fromString(id), name, host, port, user, pass)); - } catch (Exception e) { - e.printStackTrace(); - Log.e("AccountManager", "Removing account because invalid", e); - removeAccount(id); - } - } while (cursor.moveToNext()); - } - - return accounts; - } - - public Account account(String query_id) { - Cursor cursor = cursorFindAccount(query_id); - - if (cursor.moveToFirst()) { - do { - String id = cursor.getString(0); - String name = cursor.getString(1); - String host = cursor.getString(2); - int port = (int) cursor.getLong(3); - String user = cursor.getString(4); - String pass = cursor.getString(5); - try { - return new Account(UUID.fromString(id), name, host, port, user, pass); - } catch (Exception e) { - e.printStackTrace(); - Log.e("AccountManager", "Removing account because invalid", e); - removeAccount(id); - } - } while (cursor.moveToNext()); - } - - return null; - } -} diff --git a/app/src/main/java/de/kuschku/util/accounts/ServerAddress.java b/app/src/main/java/de/kuschku/util/accounts/ServerAddress.java deleted file mode 100644 index 7684395df..000000000 --- a/app/src/main/java/de/kuschku/util/accounts/ServerAddress.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.accounts; - -public class ServerAddress { - public final String host; - public final int port; - - public ServerAddress(String host, int port) { - this.host = host; - this.port = port; - } - - public String print() { - return String.format("%s:%s", host, port); - } -} diff --git a/app/src/main/java/de/kuschku/util/annotationbind/AutoBinder.java b/app/src/main/java/de/kuschku/util/annotationbind/AutoBinder.java deleted file mode 100644 index 8a75c3f95..000000000 --- a/app/src/main/java/de/kuschku/util/annotationbind/AutoBinder.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.annotationbind; - -import android.content.Context; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.support.annotation.ColorInt; -import android.support.annotation.NonNull; - -import java.lang.reflect.Field; - -public class AutoBinder { - private AutoBinder() { - - } - - public static void bind(@NonNull Object o, @NonNull Resources.Theme t) throws IllegalAccessException { - for (Field f : o.getClass().getFields()) { - if (f.isAnnotationPresent(AutoColor.class)) { - int[] colors = obtainColors(f.getAnnotation(AutoColor.class).value(), t); - if (f.getType().isArray()) - f.set(o, colors); - else if (colors.length == 1) - f.set(o, colors[0]); - else - throw new IllegalAccessException("Field length does not correspond to argument length"); - } - } - } - - public static void bind(@NonNull Object o, @NonNull Context t) throws IllegalAccessException { - Resources.Theme theme = t.getTheme(); - for (Field f : o.getClass().getFields()) { - if (f.isAnnotationPresent(AutoColor.class)) { - int[] colors = obtainColors(f.getAnnotation(AutoColor.class).value(), theme); - if (f.getType().isArray()) - f.set(o, colors); - else if (colors.length == 1) - f.set(o, colors[0]); - else - throw new IllegalAccessException("Field length does not correspond to argument length"); - } else if (f.isAnnotationPresent(AutoString.class)) { - String[] strings = obtainStrings(f.getAnnotation(AutoString.class).value(), t); - if (f.getType().isArray()) - f.set(o, strings); - else if (strings.length == 1) - f.set(o, strings[0]); - else - throw new IllegalAccessException("Field length does not correspond to argument length"); - } else if (f.isAnnotationPresent(AutoDimen.class)) { - int[] dimens = obtainDimen(f.getAnnotation(AutoDimen.class).value(), theme); - if (f.getType().isArray()) - f.set(o, dimens); - else if (dimens.length == 1) - f.set(o, dimens[0]); - else - throw new IllegalAccessException("Field length does not correspond to argument length"); - } else if (f.isAnnotationPresent(AutoInt.class)) { - int[] ints = obtainInts(f.getAnnotation(AutoInt.class).value(), theme); - if (f.getType().isArray()) - f.set(o, ints); - else if (ints.length == 1) - f.set(o, ints[0]); - else - throw new IllegalAccessException("Field length does not correspond to argument length"); - } - } - } - - @ColorInt - public static int obtainColor(int res, @NonNull Resources.Theme theme) { - int result; - TypedArray t = theme.obtainStyledAttributes(new int[]{res}); - result = t.getColor(0, 0x00000000); - t.recycle(); - return result; - } - - @NonNull - @ColorInt - private static int[] obtainColors(@NonNull int[] res, @NonNull Resources.Theme theme) { - int[] result = new int[res.length]; - TypedArray t = theme.obtainStyledAttributes(res); - for (int i = 0; i < res.length; i++) { - result[i] = t.getColor(i, 0x00000000); - } - t.recycle(); - return result; - } - - @NonNull - private static String[] obtainStrings(@NonNull int[] res, @NonNull Context ctx) { - String[] result = new String[res.length]; - for (int i = 0; i < res.length; i++) { - result[i] = ctx.getString(res[i]); - } - return result; - } - - @NonNull - private static int[] obtainDimen(@NonNull int[] res, @NonNull Resources.Theme theme) { - int[] result = new int[res.length]; - TypedArray t = theme.obtainStyledAttributes(res); - for (int i = 0; i < res.length; i++) { - result[i] = (int) t.getDimension(i, 0x00000000); - } - t.recycle(); - return result; - } - - @NonNull - private static int[] obtainInts(@NonNull int[] res, @NonNull Resources.Theme theme) { - int[] result = new int[res.length]; - TypedArray t = theme.obtainStyledAttributes(res); - for (int i = 0; i < res.length; i++) { - result[i] = t.getInt(i, 0x00000000); - } - t.recycle(); - return result; - } -} diff --git a/app/src/main/java/de/kuschku/util/annotationbind/AutoColor.java b/app/src/main/java/de/kuschku/util/annotationbind/AutoColor.java deleted file mode 100644 index dda4fd750..000000000 --- a/app/src/main/java/de/kuschku/util/annotationbind/AutoColor.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.annotationbind; - -import android.support.annotation.AnyRes; -import android.support.annotation.NonNull; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface AutoColor { - @NonNull @AnyRes int[] value() default {}; -} diff --git a/app/src/main/java/de/kuschku/util/annotationbind/AutoDimen.java b/app/src/main/java/de/kuschku/util/annotationbind/AutoDimen.java deleted file mode 100644 index 5c87c0108..000000000 --- a/app/src/main/java/de/kuschku/util/annotationbind/AutoDimen.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.annotationbind; - -import android.support.annotation.AnyRes; -import android.support.annotation.NonNull; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface AutoDimen { - @NonNull @AnyRes int[] value() default {}; -} diff --git a/app/src/main/java/de/kuschku/util/annotationbind/AutoInt.java b/app/src/main/java/de/kuschku/util/annotationbind/AutoInt.java deleted file mode 100644 index 66bb0e879..000000000 --- a/app/src/main/java/de/kuschku/util/annotationbind/AutoInt.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.annotationbind; - -import android.support.annotation.AnyRes; -import android.support.annotation.NonNull; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface AutoInt { - @NonNull @AnyRes int[] value() default {}; -} diff --git a/app/src/main/java/de/kuschku/util/annotationbind/AutoString.java b/app/src/main/java/de/kuschku/util/annotationbind/AutoString.java deleted file mode 100644 index fb150578d..000000000 --- a/app/src/main/java/de/kuschku/util/annotationbind/AutoString.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.annotationbind; - -import android.support.annotation.AnyRes; -import android.support.annotation.NonNull; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface AutoString { - @NonNull @AnyRes int[] value() default {}; -} diff --git a/app/src/main/java/de/kuschku/util/backports/Absent.java b/app/src/main/java/de/kuschku/util/backports/Absent.java deleted file mode 100644 index a1b3fe108..000000000 --- a/app/src/main/java/de/kuschku/util/backports/Absent.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; - -public class Absent<T> implements Optional<T> { - Absent() { - - } - - @NonNull - @Override - public Optional<T> filter(@NonNull Predicate<? super T> predicate) { - return this; - } - - @Nullable - @Override - public <U> Optional<U> flatMap(@NonNull Function<? super T, Optional<U>> mapper) { - return Optionals.absent(); - } - - @NonNull - @Override - public <U> Optional<U> map(@NonNull Function<? super T, U> mapper) { - return Optionals.absent(); - } - - @Nullable - @Override - public T get() { - return null; - } - - @Override - public void ifPresent(@NonNull Consumer<? super T> consumer) { - } - - @Override - public boolean isPresent() { - return false; - } - - @NonNull - @Override - public T orElse(@NonNull T other) { - return other; - } - - @Nullable - @Override - public T orElseGet(@NonNull Supplier<? extends T> other) { - return other.get(); - } - - @NonNull - @Override - public <X extends Throwable> T orElseThrow(@NonNull Supplier<? extends X> exceptionSupplier) throws X { - throw exceptionSupplier.get(); - } -} diff --git a/app/src/main/java/de/kuschku/util/backports/BinaryFunction.java b/app/src/main/java/de/kuschku/util/backports/BinaryFunction.java deleted file mode 100644 index cd54caabb..000000000 --- a/app/src/main/java/de/kuschku/util/backports/BinaryFunction.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -import android.support.annotation.NonNull; - -public interface BinaryFunction<A, B, C> { - @NonNull - C apply(A arg0, B arg1); -} diff --git a/app/src/main/java/de/kuschku/util/backports/Consumer.java b/app/src/main/java/de/kuschku/util/backports/Consumer.java deleted file mode 100644 index 6857ad4f4..000000000 --- a/app/src/main/java/de/kuschku/util/backports/Consumer.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -public interface Consumer<T> { - void apply(T elem); -} diff --git a/app/src/main/java/de/kuschku/util/backports/ICollector.java b/app/src/main/java/de/kuschku/util/backports/ICollector.java deleted file mode 100644 index 9da94d226..000000000 --- a/app/src/main/java/de/kuschku/util/backports/ICollector.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -import android.support.annotation.NonNull; - -public interface ICollector<T, R> { - @NonNull - R collect(Stream<T> stream); -} diff --git a/app/src/main/java/de/kuschku/util/backports/NumberHelper.java b/app/src/main/java/de/kuschku/util/backports/NumberHelper.java deleted file mode 100644 index cecc76ab6..000000000 --- a/app/src/main/java/de/kuschku/util/backports/NumberHelper.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -public class NumberHelper { - public static int parseInt(String text, int or) { - try { - return Integer.parseInt(text); - } catch (NumberFormatException e) { - return or; - } - } - - public static short parseShort(String text, short or) { - try { - return Short.parseShort(text); - } catch (NumberFormatException e) { - return or; - } - } - - public static long parseLong(String text, long or) { - try { - return Long.parseLong(text); - } catch (NumberFormatException e) { - return or; - } - } -} diff --git a/app/src/main/java/de/kuschku/util/backports/Objects.java b/app/src/main/java/de/kuschku/util/backports/Objects.java deleted file mode 100644 index 2e68013ef..000000000 --- a/app/src/main/java/de/kuschku/util/backports/Objects.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.Arrays; -import java.util.Comparator; - -/** - * Utility methods for objects. - * - * @see java.util.Objects - * @since 1.7 - */ -public final class Objects { - private Objects() { - } - - /** - * Returns 0 if {@code a == b}, or {@code c.compare(a, b)} otherwise. - * That is, this makes {@code c} null-safe. - */ - public static <T> int compare(T a, T b, @NonNull Comparator<? super T> c) { - if (a == b) { - return 0; - } - return c.compare(a, b); - } - - /** - * Returns true if both arguments are null, - * the result of {@link Arrays#equals} if both arguments are primitive arrays, - * the result of {@link Arrays#deepEquals} if both arguments are arrays of reference types, - * and the result of {@link #equals} otherwise. - */ - public static boolean deepEquals(@Nullable Object a, @Nullable Object b) { - if (a == null || b == null) { - return a == b; - } else if (a instanceof Object[] && b instanceof Object[]) { - return Arrays.deepEquals((Object[]) a, (Object[]) b); - } else if (a instanceof boolean[] && b instanceof boolean[]) { - return Arrays.equals((boolean[]) a, (boolean[]) b); - } else if (a instanceof byte[] && b instanceof byte[]) { - return Arrays.equals((byte[]) a, (byte[]) b); - } else if (a instanceof char[] && b instanceof char[]) { - return Arrays.equals((char[]) a, (char[]) b); - } else if (a instanceof double[] && b instanceof double[]) { - return Arrays.equals((double[]) a, (double[]) b); - } else if (a instanceof float[] && b instanceof float[]) { - return Arrays.equals((float[]) a, (float[]) b); - } else if (a instanceof int[] && b instanceof int[]) { - return Arrays.equals((int[]) a, (int[]) b); - } else if (a instanceof long[] && b instanceof long[]) { - return Arrays.equals((long[]) a, (long[]) b); - } else if (a instanceof short[] && b instanceof short[]) { - return Arrays.equals((short[]) a, (short[]) b); - } - return a.equals(b); - } - - /** - * Null-safe equivalent of {@code a.equals(b)}. - */ - public static boolean equals(@Nullable Object a, @Nullable Object b) { - return (a == null) ? (b == null) : a.equals(b); - } - - /** - * Convenience wrapper for {@link Arrays#hashCode}, adding varargs. - * This can be used to compute a hash code for an object's fields as follows: - * {@code Objects.hash(a, b, c)}. - */ - public static int hash(Object... values) { - return Arrays.hashCode(values); - } - - /** - * Returns 0 for null or {@code o.hashCode()}. - */ - public static int hashCode(@Nullable Object o) { - return (o == null) ? 0 : o.hashCode(); - } - - /** - * Returns {@code o} if non-null, or throws {@code NullPointerException}. - */ - @Nullable - public static <T> T requireNonNull(@Nullable T o) { - if (o == null) { - throw new NullPointerException(); - } - return o; - } - - /** - * Returns {@code o} if non-null, or throws {@code NullPointerException} - * with the given detail message. - */ - @Nullable - public static <T> T requireNonNull(@Nullable T o, String message) { - if (o == null) { - throw new NullPointerException(message); - } - return o; - } - - /** - * Returns "null" for null or {@code o.toString()}. - */ - @NonNull - public static String toString(@Nullable Object o) { - return (o == null) ? "null" : o.toString(); - } - - /** - * Returns {@code nullString} for null or {@code o.toString()}. - */ - public static String toString(@Nullable Object o, String nullString) { - return (o == null) ? nullString : o.toString(); - } -} diff --git a/app/src/main/java/de/kuschku/util/backports/Optional.java b/app/src/main/java/de/kuschku/util/backports/Optional.java deleted file mode 100644 index 028ece676..000000000 --- a/app/src/main/java/de/kuschku/util/backports/Optional.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; - -public interface Optional<T> { - @NonNull - Optional<T> filter(@NonNull Predicate<? super T> predicate); - - @Nullable - <U> Optional<U> flatMap(@NonNull Function<? super T, Optional<U>> mapper); - - @NonNull - <U> Optional<U> map(@NonNull Function<? super T, U> mapper); - - @Nullable - T get(); - - void ifPresent(@NonNull Consumer<? super T> consumer); - - boolean isPresent(); - - @NonNull - T orElse(@NonNull T other); - - @Nullable - T orElseGet(@NonNull Supplier<? extends T> other); - - @NonNull - <X extends Throwable> T orElseThrow(@NonNull Supplier<? extends X> exceptionSupplier) throws X; -} diff --git a/app/src/main/java/de/kuschku/util/backports/Optionals.java b/app/src/main/java/de/kuschku/util/backports/Optionals.java deleted file mode 100644 index 1d516cfd1..000000000 --- a/app/src/main/java/de/kuschku/util/backports/Optionals.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -public class Optionals { - private Optionals() { - - } - - @NonNull - public static <T> Optional<T> of(@NonNull T elem) { - return new Present<>(elem); - } - - @NonNull - public static <T> Optional<T> absent() { - return new Absent<>(); - } - - @NonNull - public static <T> Optional<T> ofNullable(@Nullable T elem) { - if (elem == null) { - return absent(); - } else { - return of(elem); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/backports/Present.java b/app/src/main/java/de/kuschku/util/backports/Present.java deleted file mode 100644 index 9a5872c02..000000000 --- a/app/src/main/java/de/kuschku/util/backports/Present.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; - -public class Present<T> implements Optional<T> { - private final T value; - - Present(T value) { - this.value = value; - } - - @NonNull - @Override - public Optional<T> filter(@NonNull Predicate<? super T> predicate) { - if (predicate.apply(value)) return this; - else return Optionals.absent(); - } - - @Nullable - @Override - public <U> Optional<U> flatMap(@NonNull Function<? super T, Optional<U>> mapper) { - return mapper.apply(value); - } - - @NonNull - @Override - public <U> Optional<U> map(@NonNull Function<? super T, U> mapper) { - return Optionals.ofNullable(mapper.apply(value)); - } - - @Nullable - @Override - public T get() { - return value; - } - - @Override - public void ifPresent(@NonNull Consumer<? super T> consumer) { - consumer.apply(value); - } - - @Override - public boolean isPresent() { - return true; - } - - @NonNull - @Override - public T orElse(@NonNull T other) { - return value; - } - - @Nullable - @Override - public T orElseGet(@NonNull Supplier<? extends T> other) { - return value; - } - - @NonNull - @Override - public <X extends Throwable> T orElseThrow(@NonNull Supplier<? extends X> exceptionSupplier) throws X { - return value; - } -} diff --git a/app/src/main/java/de/kuschku/util/backports/Stream.java b/app/src/main/java/de/kuschku/util/backports/Stream.java deleted file mode 100644 index ab3c11531..000000000 --- a/app/src/main/java/de/kuschku/util/backports/Stream.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Collections2; -import com.google.common.collect.Lists; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - -import de.kuschku.util.backports.collectors.Collectors; - -public class Stream<T> { - @NonNull - private final List<T> list; - - public Stream(@NonNull List<T> list) { - this.list = list; - } - - public Stream(@NonNull Collection<T> observers) { - list = new ArrayList<>(observers); - } - - public boolean allMatch(@NonNull Predicate<T> predicate) { - return filter(predicate).count() == count(); - } - - - public boolean anyMatch(@NonNull Predicate<T> predicate) { - return filter(predicate).count() > 0; - } - - - public int count() { - return list.size(); - } - - - @NonNull - public Stream<T> filter(Predicate<? super T> predicate) { - return new Stream<>(Lists.newArrayList(Collections2.filter(list, predicate))); - } - - - @NonNull - public Optional<T> findFirst() { - if (list.size() > 0) { - return Optionals.of(list.get(0)); - } else { - return Optionals.absent(); - } - } - - - @NonNull - public Optional<T> findAny() { - return findFirst(); - } - - - @NonNull - public <S> Stream<S> map(@NonNull Function<T, S> function) { - return new Stream<>(Lists.transform(list, function)); - } - - - public void forEach(@NonNull Consumer<T> function) { - for (T elem : Collectors.toList(this)) { - function.apply(elem); - } - } - - - @NonNull - public Stream<T> limit(int maxSize) { - return new Stream<>(list.subList(0, Math.min(maxSize, list.size()))); - } - - - public boolean noneMatch(@NonNull Predicate<T> predicate) { - return !anyMatch(predicate); - } - - - @NonNull - public Stream<T> skip(int n) { - if (count() <= n) { - return new Stream<>(Lists.newArrayList()); - } else { - return new Stream<>(list.subList(n, list.size())); - } - } - - - @Nullable - public <R> R collect(@NonNull ICollector<T, R> collector) { - return collector.collect(this); - } - - - @NonNull - public Iterator<T> iterator() { - return list.iterator(); - } - - @NonNull - public List<T> list() { - return list; - } -} diff --git a/app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java b/app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java deleted file mode 100644 index a89373f0b..000000000 --- a/app/src/main/java/de/kuschku/util/backports/collectors/Collectors.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports.collectors; - -import android.support.annotation.NonNull; - -import java.util.List; -import java.util.Map; - -import de.kuschku.util.backports.Stream; - -public class Collectors { - private Collectors() { - - } - - @NonNull - public static <T> List<T> toList(@NonNull Stream<T> stream) { - return new ListCollector<T>().collect(stream); - } - - @NonNull - public static <T> Map<T, T> toMap(@NonNull Stream<T> stream) { - return new MapCollector<T>().collect(stream); - } -} diff --git a/app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java b/app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java deleted file mode 100644 index cb66c2a10..000000000 --- a/app/src/main/java/de/kuschku/util/backports/collectors/ListCollector.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports.collectors; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.util.backports.ICollector; -import de.kuschku.util.backports.Stream; - -public class ListCollector<T> implements ICollector<T, List<T>> { - @NonNull - @Override - public List<T> collect(@NonNull Stream<T> stream) { - return stream.list(); - } -} diff --git a/app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java b/app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java deleted file mode 100644 index c57cd67e6..000000000 --- a/app/src/main/java/de/kuschku/util/backports/collectors/MapCollector.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.backports.collectors; - -import android.support.annotation.NonNull; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.util.backports.ICollector; -import de.kuschku.util.backports.Stream; - -public class MapCollector<T> implements ICollector<T, Map<T, T>> { - @NonNull - @Override - public Map<T, T> collect(@NonNull Stream<T> stream) { - Map<T, T> map = new HashMap<>(stream.count() / 2); - - if (stream.count() % 2 == 1) - throw new IllegalArgumentException("This only works with equally many keys and values"); - - List<T> list = Collectors.toList(stream); - - for (int i = 0; i < stream.count(); i += 2) { - map.put(list.get(i), list.get(i + 1)); - } - - return map; - } -} diff --git a/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataHelper.java b/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataHelper.java deleted file mode 100644 index 4f77c91bc..000000000 --- a/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataHelper.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.buffermetadata; - -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteStatement; -import android.support.annotation.NonNull; - -public class BufferMetaDataHelper extends SQLiteOpenHelper { - private static final int DATABASE_VERSION = 1; - @NonNull - private static final String DATABASE_NAME = "bufferdata"; - @NonNull - private static final String TABLE_ACCOUNTS = "bufferdata"; - - @NonNull - private static final String KEY_CORE = "core"; - @NonNull - private static final String KEY_BUFFER = "buffer"; - @NonNull - private static final String KEY_HIDDEN = "hiddenevents"; - @NonNull - private static final String KEY_MARKERLINE = "markerline"; - - // Again we can only use String.format, as SQL doesn’t support table or column names to be bound - // in prepared statements - @NonNull - private static final String STATEMENT_INSERT = - String.format("INSERT OR IGNORE INTO %s(%s, %s, %s, %s) VALUES (?, ?, ?, ?)", - TABLE_ACCOUNTS, KEY_CORE, KEY_BUFFER, KEY_HIDDEN, KEY_MARKERLINE); - - @NonNull - private static final String STATEMENT_UPDATE_HIDDEN = - String.format("UPDATE %s SET %s=? WHERE %s=? AND %s=?", - TABLE_ACCOUNTS, KEY_HIDDEN, KEY_CORE, KEY_BUFFER); - - @NonNull - private static final String STATEMENT_UPDATE_MARKERLINE = - String.format("UPDATE %s SET %s=? WHERE %s=? AND %s=?", - TABLE_ACCOUNTS, KEY_MARKERLINE, KEY_CORE, KEY_BUFFER); - @NonNull - private static final String STATEMENT_DELETE_BUFFER = - String.format("DELETE FROM %s WHERE %s = ? AND %s = ?", - TABLE_ACCOUNTS, KEY_CORE, KEY_BUFFER); - - @NonNull - private static final String STATEMENT_DELETE_CORE = - String.format("DELETE FROM %s WHERE %s = ?", - TABLE_ACCOUNTS, KEY_CORE); - - @NonNull - private static final String SPECIFIER_FIND = - String.format("%s = ? ", KEY_CORE); - - public BufferMetaDataHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - } - - @Override - public void onCreate(SQLiteDatabase db) { - // Why do we use String.format and not prepared statements? Because we can’t bind table or - // column names in prepared statements - String statement = String.format("CREATE TABLE %s (%s, %s, %s, %s, PRIMARY KEY (%s, %s), UNIQUE(%s, %s));", - TABLE_ACCOUNTS, - KEY_CORE, KEY_BUFFER, KEY_HIDDEN, KEY_MARKERLINE, - KEY_CORE, KEY_BUFFER, - KEY_CORE, KEY_BUFFER); - db.execSQL(statement); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - - } - - public boolean storeMarkerline(String coreid, int bufferid, int messageid) { - ensureExisting(coreid, bufferid); - - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_UPDATE_MARKERLINE); - statement.bindLong(1, messageid); - statement.bindString(2, coreid); - statement.bindLong(3, bufferid); - return statement.executeUpdateDelete() > 0; - } - - public boolean storeHiddenData(String coreid, int bufferid, int hiddendata) { - ensureExisting(coreid, bufferid); - - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_UPDATE_HIDDEN); - statement.bindLong(1, hiddendata); - statement.bindString(2, coreid); - statement.bindLong(3, bufferid); - return statement.executeUpdateDelete() > 0; - } - - private boolean ensureExisting(String coreid, int bufferid) { - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_INSERT); - statement.bindString(1, coreid); - statement.bindLong(2, bufferid); - statement.bindLong(3, 0); - statement.bindLong(4, -1); - // executeInsert returns -1 if unsuccessful - return statement.executeInsert() != -1; - } - - private Cursor cursorFindData(String coreid) { - SQLiteDatabase db = this.getReadableDatabase(); - return db.query( - // table name - TABLE_ACCOUNTS, - // column names - new String[]{KEY_CORE, KEY_BUFFER, KEY_HIDDEN, KEY_MARKERLINE}, - // where clause - SPECIFIER_FIND, - // binds for where clause - new String[]{coreid}, - null, - null, - null, - null - ); - } - - public int markerLine(String coreid, int bufferid) { - Cursor cursor = cursorFindData(coreid); - if (cursor.moveToFirst()) { - do { - if (cursor.getInt(1) == bufferid) { - return cursor.getInt(3); - } - } while (cursor.moveToNext()); - } - return -1; - } - - public int hiddenData(String coreid, int bufferid) { - ensureExisting(coreid, bufferid); - Cursor cursor = cursorFindData(coreid); - if (cursor.moveToFirst()) { - do { - if (cursor.getInt(1) == bufferid) { - return cursor.getInt(2); - } - } while (cursor.moveToNext()); - } - return 0; - } - - public boolean deleteCore(String coreid) { - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_DELETE_CORE); - statement.bindString(1, coreid); - // executeUpdateDelete returns amount of modified rows - return statement.executeUpdateDelete() > 0; - } - - public boolean deleteBuffer(String coreid, int bufferid) { - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_DELETE_BUFFER); - statement.bindString(1, coreid); - statement.bindLong(2, bufferid); - // executeUpdateDelete returns amount of modified rows - return statement.executeUpdateDelete() > 0; - } -} diff --git a/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataManager.java b/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataManager.java deleted file mode 100644 index 592c966c4..000000000 --- a/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataManager.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.buffermetadata; - -public interface BufferMetaDataManager { - int markerline(String coreid, int bufferid); - - int hiddendata(String coreid, int bufferid); - - void setMarkerline(String coreid, int bufferid, int markerline); - - void setHiddendata(String coreid, int bufferid, int hiddendata); - - void removeBuffer(String coreid, int bufferid); - - void removeCore(String coreid); -} diff --git a/app/src/main/java/de/kuschku/util/buffermetadata/SQLiteBufferMetaDataManager.java b/app/src/main/java/de/kuschku/util/buffermetadata/SQLiteBufferMetaDataManager.java deleted file mode 100644 index ebd265295..000000000 --- a/app/src/main/java/de/kuschku/util/buffermetadata/SQLiteBufferMetaDataManager.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.buffermetadata; - -import android.content.Context; - -public class SQLiteBufferMetaDataManager implements BufferMetaDataManager { - private final BufferMetaDataHelper helper; - - public SQLiteBufferMetaDataManager(Context context) { - helper = new BufferMetaDataHelper(context); - } - - @Override - public int markerline(String coreid, int bufferid) { - return helper.markerLine(coreid, bufferid); - } - - @Override - public int hiddendata(String coreid, int bufferid) { - return helper.hiddenData(coreid, bufferid); - } - - @Override - public void setMarkerline(String coreid, int bufferid, int markerline) { - helper.storeMarkerline(coreid, bufferid, markerline); - } - - @Override - public void setHiddendata(String coreid, int bufferid, int hiddendata) { - helper.storeHiddenData(coreid, bufferid, hiddendata); - } - - @Override - public void removeBuffer(String coreid, int bufferid) { - helper.deleteBuffer(coreid, bufferid); - } - - @Override - public void removeCore(String coreid) { - helper.deleteCore(coreid); - } -} diff --git a/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java b/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java deleted file mode 100644 index 0f6277df5..000000000 --- a/app/src/main/java/de/kuschku/util/certificates/CertificateDatabaseHandler.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.certificates; - -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteStatement; -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - -public class CertificateDatabaseHandler extends SQLiteOpenHelper { - private static final int DATABASE_VERSION = 1; - @NonNull - private static final String DATABASE_NAME = "certificates"; - @NonNull - private static final String TABLE_CERTIFICATES = "certificates"; - - @NonNull - private static final String KEY_CORE_ADDRESS = "core_address"; - @NonNull - private static final String KEY_FINGERPRINT = "fingerprint"; - - // Again we can only use String.format, as SQL doesn’t support table or column names to be bound - // in prepared statements - @NonNull - private static final String STATEMENT_INSERT = - String.format("INSERT OR IGNORE INTO %s(%s, %s) VALUES (?, ?)", - TABLE_CERTIFICATES, KEY_CORE_ADDRESS, KEY_FINGERPRINT); - @NonNull - private static final String STATEMENT_DELETE = - String.format("DELETE FROM %s WHERE %s = ? AND %s = ?", - TABLE_CERTIFICATES, KEY_CORE_ADDRESS, KEY_FINGERPRINT); - @NonNull - private static final String STATEMENT_DELETE_ALL = - String.format("DELETE FROM %s WHERE %s = ?", - TABLE_CERTIFICATES, KEY_CORE_ADDRESS); - - @NonNull - private static final String SPECIFIER_FIND_ALL = String.format("%s = ?", KEY_CORE_ADDRESS); - - public CertificateDatabaseHandler(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - } - - @Override - public void onCreate(@NonNull SQLiteDatabase db) { - // Why do we use String.format and not prepared statements? Because we can’t bind table or - // column names in prepared statements - String statement = String.format("CREATE TABLE %s (%s, %s, PRIMARY KEY (%s, %s), UNIQUE(%s, %s));", - TABLE_CERTIFICATES, - KEY_CORE_ADDRESS, KEY_FINGERPRINT, - KEY_CORE_ADDRESS, KEY_FINGERPRINT, - KEY_CORE_ADDRESS, KEY_FINGERPRINT); - db.execSQL(statement); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - - } - - public boolean addCertificate(String fingerprint, String coreAddress) { - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_INSERT); - statement.bindString(1, coreAddress); - statement.bindString(2, fingerprint); - // executeInsert returns -1 if unsuccessful - return statement.executeInsert() != -1; - } - - public boolean removeCertificate(String fingerprint, String coreAddress) { - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_DELETE); - statement.bindString(1, coreAddress); - statement.bindString(2, fingerprint); - // executeUpdateDelete returns amount of modified rows - return statement.executeUpdateDelete() > 0; - } - - public boolean removeCertificates(String coreAddress) { - SQLiteDatabase db = this.getWritableDatabase(); - SQLiteStatement statement = db.compileStatement(STATEMENT_DELETE_ALL); - statement.bindString(1, coreAddress); - // executeUpdateDelete returns amount of modified rows - return statement.executeUpdateDelete() > 0; - } - - public Cursor cursorFindCertificates(String coreAddress) { - SQLiteDatabase db = this.getReadableDatabase(); - return db.query( - // table name - TABLE_CERTIFICATES, - // column names - new String[]{KEY_FINGERPRINT}, - // where clause - SPECIFIER_FIND_ALL, - // binds for where clause - new String[]{coreAddress}, - null, - null, - null, - null - ); - } - - public Cursor cursorFindAllCertificates() { - SQLiteDatabase db = this.getReadableDatabase(); - return db.query( - // table name - TABLE_CERTIFICATES, - // column names - new String[]{KEY_CORE_ADDRESS, KEY_FINGERPRINT}, - // where clause - null, - // binds for where clause - new String[0], - null, - null, - null, - null - ); - } - - @NonNull - public List<String> findCertificates(String coreAddress) { - Cursor cursor = cursorFindCertificates(coreAddress); - List<String> certificates = new ArrayList<>(); - - if (cursor != null && cursor.moveToFirst()) { - do { - certificates.add(cursor.getString(0)); - } while (cursor.moveToNext()); - } - - return certificates; - } - - @NonNull - public Map<String, Collection<String>> findAllCertificates() { - Cursor cursor = cursorFindAllCertificates(); - - Map<String, Collection<String>> certificates = new HashMap<>(); - - if (cursor != null && cursor.moveToFirst()) { - do { - String coreid = cursor.getString(0); - String fingerprint = cursor.getString(1); - if (certificates.get(coreid) == null) - certificates.put(coreid, new HashSet<>()); - - certificates.get(coreid).add(fingerprint); - } while (cursor.moveToNext()); - } - - return certificates; - } -} diff --git a/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java b/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java deleted file mode 100644 index 13f26868a..000000000 --- a/app/src/main/java/de/kuschku/util/certificates/CertificateUtils.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.certificates; - -import android.support.annotation.NonNull; - -import com.google.common.base.Joiner; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateParsingException; -import java.security.cert.X509Certificate; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import de.kuschku.util.backports.Objects; - -public class CertificateUtils { - private CertificateUtils() { - } - - public static String certificateToFingerprint(@NonNull X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException { - return hashToFingerprint(getHash(certificate)); - } - - public static String certificateToFingerprint(@NonNull X509Certificate certificate, String defaultValue) { - try { - return certificateToFingerprint(certificate); - } catch (Exception e) { - return defaultValue; - } - } - - private static byte[] getHash(@NonNull X509Certificate certificate) throws NoSuchAlgorithmException, CertificateEncodingException { - MessageDigest digest = java.security.MessageDigest.getInstance("SHA1"); - digest.update(certificate.getEncoded()); - return digest.digest(); - } - - public static String hashToFingerprint(@NonNull byte[] hash) { - String[] formattedBytes = new String[hash.length]; - for (int i = 0; i < hash.length; i++) { - // Format each byte as hex string - formattedBytes[i] = Integer.toHexString(hash[i] & 0xff); - } - return Joiner.on(":").join(formattedBytes); - } - - @NonNull - public static Collection<String> getHostnames(@NonNull X509Certificate certificate) throws CertificateParsingException { - Set<String> hostnames = new HashSet<>(); - for (List<?> data : certificate.getSubjectAlternativeNames()) { - if (Objects.equals(data.get(0), 2) && data.get(1) instanceof String) - hostnames.add((String) data.get(1)); - } - return hostnames; - } -} diff --git a/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java b/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java deleted file mode 100644 index 74f653d92..000000000 --- a/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.certificates; - -import android.content.Context; -import android.support.annotation.NonNull; - -import java.security.cert.X509Certificate; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.ssl.CertificateManager; -import de.kuschku.libquassel.ssl.UnknownCertificateException; -import de.kuschku.util.accounts.ServerAddress; - -public class SQLiteCertificateManager implements CertificateManager { - @NonNull - private final CertificateDatabaseHandler handler; - - public SQLiteCertificateManager(Context context) { - this.handler = new CertificateDatabaseHandler(context); - } - - @Override - public boolean isTrusted(@NonNull X509Certificate certificate, @NonNull ServerAddress core) { - try { - return handler.findCertificates(core.host).contains(CertificateUtils.certificateToFingerprint(certificate)); - } catch (Exception e) { - return false; - } - } - - @Override - public boolean addCertificate(@NonNull X509Certificate certificate, @NonNull ServerAddress core) { - try { - return handler.addCertificate(CertificateUtils.certificateToFingerprint(certificate), core.host); - } catch (Exception e) { - return false; - } - } - - @Override - public boolean removeCertificate(@NonNull X509Certificate certificate, @NonNull ServerAddress core) { - try { - return handler.removeCertificate(CertificateUtils.certificateToFingerprint(certificate), core.host); - } catch (Exception e) { - return false; - } - } - - @Override - public boolean removeAllCertificates(@NonNull ServerAddress core) { - return handler.removeCertificates(core.host); - } - - @Override - public void checkTrusted(@NonNull X509Certificate certificate, @NonNull ServerAddress address) throws UnknownCertificateException { - if (!isTrusted(certificate, address)) - throw new UnknownCertificateException(certificate, address); - } - - @NonNull - public List<String> findCertificates(@NonNull ServerAddress core) { - return handler.findCertificates(core.host); - } - - @NonNull - public Map<String, Collection<String>> findAllCertificates() { - return handler.findAllCertificates(); - } -} diff --git a/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java b/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java deleted file mode 100644 index 2a0ac3706..000000000 --- a/app/src/main/java/de/kuschku/util/instancestateutil/Storable.java +++ /dev/null @@ -1,283 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.instancestateutil; - -import android.os.Bundle; -import android.os.Parcelable; -import android.support.annotation.NonNull; -import android.util.SparseArray; - -import java.io.Serializable; -import java.lang.reflect.Field; -import java.util.ArrayList; - -@SuppressWarnings("unchecked") -public class Storable { - public boolean onRestoreInstanceState(@NonNull Bundle in) { - try { - Field[] fields = getClass().getDeclaredFields(); - for (Field field : fields) { - if (field.isAnnotationPresent(Store.class)) { - Store annotation = field.getAnnotation(Store.class); - String name = annotation.name().isEmpty() ? field.getName() : annotation.name(); - Store.Type type = annotation.type() == Store.Type.INVALID ? getTypeFromClass(field.getType()) : annotation.type(); - loadField(in, type, name, field); - } - } - return true; - } catch (IllegalAccessException e) { - return false; - } - } - - public boolean onSaveInstanceState(@NonNull Bundle out) { - try { - Field[] fields = getClass().getDeclaredFields(); - for (Field field : fields) { - if (field.isAnnotationPresent(Store.class)) { - Store annotation = field.getAnnotation(Store.class); - String name = annotation.name().isEmpty() ? field.getName() : annotation.name(); - Store.Type type = annotation.type() == Store.Type.INVALID ? getTypeFromClass(field.getType()) : annotation.type(); - storeField(out, type, name, field.get(this)); - } - } - return true; - } catch (IllegalAccessException e) { - return false; - } - } - - private void storeField(@NonNull Bundle out, @NonNull Store.Type type, @NonNull String name, Object data) { - switch (type) { - case BOOLEAN: - out.putBoolean(name, (Boolean) data); - break; - case BOOLEAN_ARRAY: - out.putBooleanArray(name, (boolean[]) data); - break; - case BYTE: - out.putByte(name, (byte) data); - break; - case BYTE_ARRAY: - out.putByteArray(name, (byte[]) data); - break; - case CHAR: - out.putChar(name, (char) data); - break; - case CHAR_ARRAY: - out.putCharArray(name, (char[]) data); - break; - case SHORT: - out.putShort(name, (short) data); - break; - case SHORT_ARRAY: - out.putShortArray(name, (short[]) data); - break; - case INT: - out.putInt(name, (int) data); - break; - case INT_ARRAY: - out.putIntArray(name, (int[]) data); - break; - case INTEGER_ARRAYLIST: - out.putIntegerArrayList(name, (ArrayList<Integer>) data); - break; - case LONG: - out.putLong(name, (long) data); - break; - case LONG_ARRAY: - out.putLongArray(name, (long[]) data); - break; - case FLOAT: - out.putFloat(name, (float) data); - break; - case FLOAT_ARRAY: - out.putFloatArray(name, (float[]) data); - break; - case DOUBLE: - out.putDouble(name, (double) data); - break; - case DOUBLE_ARRAY: - out.putDoubleArray(name, (double[]) data); - break; - case STRING: - out.putString(name, (String) data); - break; - case STRING_ARRAY: - out.putStringArray(name, (String[]) data); - break; - case STRING_ARRAYLIST: - out.putStringArrayList(name, (ArrayList<String>) data); - break; - case CHARSEQUENCE: - out.putCharSequence(name, (CharSequence) data); - break; - case CHARSEQUENCE_ARRAY: - out.putCharSequenceArray(name, (CharSequence[]) data); - break; - case CHARSEQUENCE_ARRAYLIST: - out.putCharSequenceArrayList(name, (ArrayList<CharSequence>) data); - break; - case PARCELABLE: - out.putParcelable(name, (Parcelable) data); - break; - case PARCELABLE_ARRAY: - out.putParcelableArray(name, (Parcelable[]) data); - break; - case PARCELABLE_ARRAYLIST: - out.putParcelableArrayList(name, (ArrayList<? extends Parcelable>) data); - break; - case SPARSEPARCELABLE_ARRAY: - out.putSparseParcelableArray(name, (SparseArray<? extends Parcelable>) data); - break; - case SERIALIZABLE: - out.putSerializable(name, (Serializable) data); - break; - case BUNDLE: - out.putBundle(name, (Bundle) data); - break; - } - } - - private void loadField(@NonNull Bundle in, @NonNull Store.Type type, @NonNull String name, @NonNull Field field) throws IllegalAccessException { - if (!in.containsKey(name)) return; - - switch (type) { - case BOOLEAN: - field.setBoolean(this, in.getBoolean(name)); - break; - case BOOLEAN_ARRAY: - field.set(this, in.getBooleanArray(name)); - break; - case BYTE: - field.setByte(this, in.getByte(name)); - break; - case BYTE_ARRAY: - field.set(this, in.getByteArray(name)); - break; - case CHAR: - field.setChar(this, in.getChar(name)); - break; - case CHAR_ARRAY: - field.set(this, in.getCharArray(name)); - break; - case SHORT: - field.setShort(this, in.getShort(name)); - break; - case SHORT_ARRAY: - field.set(this, in.getShortArray(name)); - break; - case INT: - field.setInt(this, in.getInt(name)); - break; - case INT_ARRAY: - field.set(this, in.getIntArray(name)); - break; - case INTEGER_ARRAYLIST: - field.set(this, in.getIntegerArrayList(name)); - break; - case LONG: - field.setLong(this, in.getLong(name)); - break; - case LONG_ARRAY: - field.set(this, in.getLongArray(name)); - break; - case FLOAT: - field.setFloat(this, in.getFloat(name)); - break; - case FLOAT_ARRAY: - field.set(this, in.getFloatArray(name)); - break; - case DOUBLE: - field.setDouble(this, in.getDouble(name)); - break; - case DOUBLE_ARRAY: - field.set(this, in.getDoubleArray(name)); - break; - case STRING: - field.set(this, in.getString(name)); - break; - case STRING_ARRAY: - field.set(this, in.getStringArray(name)); - break; - case STRING_ARRAYLIST: - field.set(this, in.getStringArrayList(name)); - break; - case CHARSEQUENCE: - field.set(this, in.getCharSequence(name)); - break; - case CHARSEQUENCE_ARRAY: - field.set(this, in.getCharSequenceArray(name)); - break; - case CHARSEQUENCE_ARRAYLIST: - field.set(this, in.getCharSequenceArrayList(name)); - break; - case PARCELABLE: - field.set(this, in.getParcelable(name)); - break; - case PARCELABLE_ARRAY: - field.set(this, in.getParcelableArray(name)); - break; - case PARCELABLE_ARRAYLIST: - field.set(this, in.getParcelableArrayList(name)); - break; - case SPARSEPARCELABLE_ARRAY: - field.set(this, in.getSparseParcelableArray(name)); - break; - case SERIALIZABLE: - field.set(this, in.getSerializable(name)); - break; - case BUNDLE: - field.set(this, in.getBundle(name)); - break; - } - } - - @NonNull - private Store.Type getTypeFromClass(@NonNull Class cl) { - if (boolean.class.isAssignableFrom(cl)) return Store.Type.BOOLEAN; - if (boolean[].class.isAssignableFrom(cl)) return Store.Type.BOOLEAN_ARRAY; - if (byte.class.isAssignableFrom(cl)) return Store.Type.BYTE; - if (byte[].class.isAssignableFrom(cl)) return Store.Type.BYTE_ARRAY; - if (char.class.isAssignableFrom(cl)) return Store.Type.CHAR; - if (char[].class.isAssignableFrom(cl)) return Store.Type.CHAR_ARRAY; - if (short.class.isAssignableFrom(cl)) return Store.Type.SHORT; - if (short[].class.isAssignableFrom(cl)) return Store.Type.SHORT_ARRAY; - if (int.class.isAssignableFrom(cl)) return Store.Type.INT; - if (int[].class.isAssignableFrom(cl)) return Store.Type.INT_ARRAY; - if (long.class.isAssignableFrom(cl)) return Store.Type.LONG; - if (long[].class.isAssignableFrom(cl)) return Store.Type.LONG_ARRAY; - if (float.class.isAssignableFrom(cl)) return Store.Type.FLOAT; - if (float[].class.isAssignableFrom(cl)) return Store.Type.FLOAT_ARRAY; - if (double.class.isAssignableFrom(cl)) return Store.Type.DOUBLE; - if (double[].class.isAssignableFrom(cl)) return Store.Type.DOUBLE_ARRAY; - if (String.class.isAssignableFrom(cl)) return Store.Type.STRING; - if (String[].class.isAssignableFrom(cl)) return Store.Type.STRING_ARRAY; - if (CharSequence.class.isAssignableFrom(cl)) return Store.Type.CHARSEQUENCE; - if (CharSequence[].class.isAssignableFrom(cl)) return Store.Type.CHARSEQUENCE_ARRAY; - if (Parcelable.class.isAssignableFrom(cl)) return Store.Type.PARCELABLE; - if (Parcelable[].class.isAssignableFrom(cl)) return Store.Type.PARCELABLE_ARRAY; - if (Serializable.class.isAssignableFrom(cl)) return Store.Type.SERIALIZABLE; - if (Bundle.class.isAssignableFrom(cl)) return Store.Type.BUNDLE; - return Store.Type.INVALID; - } -} diff --git a/app/src/main/java/de/kuschku/util/instancestateutil/Store.java b/app/src/main/java/de/kuschku/util/instancestateutil/Store.java deleted file mode 100644 index 62a6f531e..000000000 --- a/app/src/main/java/de/kuschku/util/instancestateutil/Store.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.instancestateutil; - -import android.support.annotation.NonNull; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target(ElementType.FIELD) -@Retention(RetentionPolicy.RUNTIME) -public @interface Store { - @NonNull String name() default ""; - - @NonNull Type type() default Type.INVALID; - - enum Type { - INVALID, - BOOLEAN, - BOOLEAN_ARRAY, - BYTE, - BYTE_ARRAY, - CHAR, - CHAR_ARRAY, - SHORT, - SHORT_ARRAY, - INT, - INT_ARRAY, - INTEGER_ARRAYLIST, - LONG, - LONG_ARRAY, - FLOAT, - FLOAT_ARRAY, - DOUBLE, - DOUBLE_ARRAY, - STRING, - STRING_ARRAY, - STRING_ARRAYLIST, - CHARSEQUENCE, - CHARSEQUENCE_ARRAY, - CHARSEQUENCE_ARRAYLIST, - PARCELABLE, - PARCELABLE_ARRAY, - PARCELABLE_ARRAYLIST, - SPARSEPARCELABLE_ARRAY, - SERIALIZABLE, - BUNDLE, - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/IrcCaseMappers.java b/app/src/main/java/de/kuschku/util/irc/IrcCaseMappers.java deleted file mode 100644 index cd3dd28cc..000000000 --- a/app/src/main/java/de/kuschku/util/irc/IrcCaseMappers.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc; - -import android.support.annotation.Nullable; - -import java.util.Locale; - -public class IrcCaseMappers { - public static IrcCaseMapper irc = new UnicodeCaseMapper(); - public static IrcCaseMapper unicode = new ClassicalIrcCaseMapper(); - - private IrcCaseMappers() { - - } - - public interface IrcCaseMapper { - boolean equalsIgnoreCase(@Nullable String a, @Nullable String b); - - @Nullable - String toLowerCase(@Nullable String in); - - @Nullable - String toUpperCase(@Nullable String in); - } - - static class UnicodeCaseMapper implements IrcCaseMapper { - - @Override - public boolean equalsIgnoreCase(@Nullable String a, @Nullable String b) { - if (a == null || b == null) - return a == null && b == null; - else - return a.equalsIgnoreCase(b); - } - - @Nullable - @Override - public String toLowerCase(@Nullable String in) { - return in != null ? in.toLowerCase(Locale.US) : null; - } - - @Nullable - @Override - public String toUpperCase(@Nullable String in) { - return in != null ? in.toUpperCase(Locale.US) : null; - } - } - - static class ClassicalIrcCaseMapper implements IrcCaseMapper { - @Nullable - public String toLowerCase(@Nullable String s) { - return s != null ? s.toLowerCase(Locale.US) - .replace('[', '{') - .replace(']', '}') - .replace('^', '~') : null; - } - - @Nullable - public String toUpperCase(@Nullable String s) { - return s != null ? s.toUpperCase(Locale.US) - .replace('{', '[') - .replace('}', ']') - .replace('~', '^') : null; - } - - @Override - public boolean equalsIgnoreCase(@Nullable String a, @Nullable String b) { - if (a == null || b == null) - return a == null && b == null; - else - return toLowerCase(a).equals(toLowerCase(b)) || toUpperCase(a).equals(toUpperCase(b)); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java b/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java deleted file mode 100644 index 47f5ba912..000000000 --- a/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc; - -import android.support.annotation.NonNull; - -import java.nio.charset.Charset; -import java.util.Locale; - -public class IrcUserUtils { - private IrcUserUtils() { - - } - - public static int getSenderColor(@NonNull String nick) { - nick = trimEnd(nick, '_').toLowerCase(Locale.US); - byte[] data = nick.getBytes(Charset.forName("ISO-8859-1")); - return (0xf & CRCUtils.qChecksum(data)); - } - - @NonNull - private static String trimEnd(@NonNull String str, char character) { - char[] val = str.toCharArray(); - int len = val.length; - while ((0 < len) && (val[len - 1] == character)) { - len--; - } - return ((len < val.length)) ? str.substring(0, len) : str; - } - - @NonNull - public static String getNick(@NonNull String hostmask) { - return hostmask.split("!", -1)[0]; - } - - @NonNull - public static String getUser(@NonNull String hostmask) { - return getMask(hostmask).split("@", -1)[0]; - } - - @NonNull - public static String getHost(@NonNull String hostmask) { - return getMask(hostmask).split("@", -1)[1]; - } - - @NonNull - public static String getMask(@NonNull String hostmask) { - return hostmask.split("!", -1)[1]; - } - - public static class CRCUtils { - private CRCUtils() { - - } - - public static int qChecksum(@NonNull byte[] data) { - int crc = 0xffff; - int crcHighBitMask = 0x8000; - - for (byte b : data) { - int c = reflect(b, 8); - for (int j = 0x80; j > 0; j >>= 1) { - int highBit = crc & crcHighBitMask; - crc <<= 1; - if ((c & j) > 0) { - highBit ^= crcHighBitMask; - } - if (highBit > 0) { - crc ^= 0x1021; - } - } - } - - crc = reflect(crc, 16); - crc ^= 0xffff; - crc &= 0xffff; - - return crc; - } - - private static int reflect(int crc, int n) { - int j = 1, crcout = 0; - for (int i = (1 << (n - 1)); i > 0; i >>= 1) { - if ((crc & i) > 0) { - crcout |= j; - } - j <<= 1; - } - return crcout; - } - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/ModeUtils.java b/app/src/main/java/de/kuschku/util/irc/ModeUtils.java deleted file mode 100644 index 048ee6f5d..000000000 --- a/app/src/main/java/de/kuschku/util/irc/ModeUtils.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.CompatibilityUtils; - -public class ModeUtils { - @NonNull - public static Set<Character> toModes(@Nullable String modes) { - Set<Character> modeSet = new HashSet<>(); - if (modes == null) - return modeSet; - for (String mode : CompatibilityUtils.partStringByChar(modes)) { - if (mode.length() == 1) - modeSet.add(toMode(mode)); - } - return modeSet; - } - - public static String fromModes(@NonNull Set<Character> d_channelModes) { - StringBuilder builder = new StringBuilder(d_channelModes.size()); - for (char c : d_channelModes) { - builder.append(new char[]{c}); - } - return builder.toString(); - } - - public static char toMode(@NonNull String mode) { - return mode.charAt(0); - } - - public static String fromMode(char ch) { - return String.copyValueOf(new char[]{ch}); - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/AbstractIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/AbstractIrcModeProvider.java deleted file mode 100644 index ae23997cf..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/AbstractIrcModeProvider.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -public abstract class AbstractIrcModeProvider implements IrcModeProvider { - - @Override - public int matchQuality(Set<Character> modes) { - HashSet<Character> diff = new HashSet<>(); - for (char c : modes) { - if (!supportedModes().contains(c)) - diff.add(c); - } - for (char c : supportedModes()) { - if (!modes.contains(c)) - diff.add(c); - } - return (diff.size()); - } - - public Set<ChanMode> modesFromString(String chanModes) { - Set<ChanMode> result = new HashSet<>(); - for (char c : chanModes.toCharArray()) { - ChanMode mode = modeFromChar(c); - if (mode != null) - result.add(mode); - } - return result; - } - - protected abstract Collection<Character> supportedModes(); -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/ChanMode.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/ChanMode.java deleted file mode 100644 index da14888e4..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/ChanMode.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes; - -public enum ChanMode { - ALLOW_FORWARD, - ALLOW_INVITE, - ANTIFLOOD, - AUDITORIUM, - BLOCK_ACTION, - BLOCK_AUTOREJOIN, - BLOCK_CAPS, - BLOCK_CTCP, - BLOCK_COLOR, - BLOCK_EXTERNAL, - BLOCK_FORWARDING, - BLOCK_KICK, - BLOCK_KNOCK, - BLOCK_NICKCHANGE, - BLOCK_NOTICE, - BLOCK_REPEAT, - BLOCK_UNIDENTIFIED, - CENSOR, - DISABLE_INVITE, - HIDE_JOINS, - IS_SECURE, - JOIN_THROTTLE, - LIMIT, - MODERATED, - ONLY_HELPOPER, - ONLY_INVITE, - ONLY_OPER, - ONLY_ADMIN, - ONLY_SSL, - PARANOID, - PASSWORD, - PERMANENT, - QUIET_UNIDENTIFIED, - REDUCED_MODERATION, - REGISTERED, - RESTRICT_TOPIC, - STRIP_COLOR, - UNLISTED, - FORWARD, - BAN, - BAN_EXCEPTION, - INVITE_EXCEPTION, - MUTE -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProvider.java deleted file mode 100644 index afc4c58e2..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes; - -import java.util.Set; - -public interface IrcModeProvider { - ChanMode modeFromChar(char mode); - - char charFromMode(ChanMode mode); - - int matchQuality(Set<Character> modes); - - Set<ChanMode> modesFromString(String chanModes); -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java deleted file mode 100644 index 70a613206..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/IrcModeProviderFactory.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.impl.CharybdisIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.DalIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.DancerIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.FqIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.HybridIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.HyperionIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.InspireIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.NeoIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.ShadowIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.SolidIrcModeProvider; -import de.kuschku.util.irc.chanmodes.impl.UnrealIrcModeProvider; - -public class IrcModeProviderFactory { - private static final List<IrcModeProvider> servers = Arrays.asList( - new CharybdisIrcModeProvider(), - new DalIrcModeProvider(), - new DancerIrcModeProvider(), - new FqIrcModeProvider(), - new HybridIrcModeProvider(), - new HyperionIrcModeProvider(), - new InspireIrcModeProvider(), - new NeoIrcModeProvider(), - new ShadowIrcModeProvider(), - new SolidIrcModeProvider(), - new UnrealIrcModeProvider() - ); - - private static Set<Character> toModeSet(String chanModes) { - if (chanModes == null) chanModes = ""; - String replaced = chanModes.replaceAll(",", ""); - Set<Character> modeSet = new HashSet<>(); - for (char c : replaced.toCharArray()) { - modeSet.add(c); - } - return modeSet; - } - - public static IrcModeProvider identifyServer(String modeString) { - return identifyServer(toModeSet(modeString)); - } - - public static IrcModeProvider identifyServer(Set<Character> characters) { - IrcModeProvider bestMatch = null; - int bestMatchCount = Integer.MAX_VALUE; - - for (IrcModeProvider server : servers) { - int matchQuality = server.matchQuality(characters); - if (bestMatchCount > matchQuality) { - bestMatch = server; - bestMatchCount = matchQuality; - } - } - - return bestMatch; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java deleted file mode 100644 index bcd9a8f1b..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/BewareIrcModeProvider.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class BewareIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'C', 'c', 'i', 'k', 'l', 'm', 'n', 'p', 's', 't' - )); - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'C': - return BLOCK_CTCP; - case 'c': - return BLOCK_COLOR; - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case BLOCK_CTCP: - return 'C'; - case BLOCK_COLOR: - return 'c'; - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java deleted file mode 100644 index fee25f5c3..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/CharybdisIrcModeProvider.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_FORWARD; -import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_FORWARDING; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.FORWARD; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.MUTE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_ADMIN; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT; -import static de.kuschku.util.irc.chanmodes.ChanMode.REDUCED_MODERATION; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class CharybdisIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'A', 'C', 'F', 'O', 'P', 'Q', 'S', 'T', 'c', 'f', 'g', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'z' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'A': - return ONLY_ADMIN; - case 'C': - return BLOCK_CTCP; - case 'F': - return ALLOW_FORWARD; - case 'O': - return ONLY_OPER; - case 'P': - return PERMANENT; - case 'Q': - return BLOCK_FORWARDING; - case 'S': - return ONLY_SSL; - case 'T': - return BLOCK_NOTICE; - case 'c': - return BLOCK_COLOR; - case 'f': - return FORWARD; - case 'g': - return ALLOW_INVITE; - case 'i': - return ONLY_INVITE; - case 'j': - return JOIN_THROTTLE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 'r': - return BLOCK_UNIDENTIFIED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - case 'z': - return REDUCED_MODERATION; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - case 'q': - return MUTE; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case ONLY_ADMIN: - return 'A'; - case BLOCK_CTCP: - return 'C'; - case ALLOW_FORWARD: - return 'F'; - case ONLY_OPER: - return 'O'; - case PERMANENT: - return 'P'; - case BLOCK_FORWARDING: - return 'Q'; - case ONLY_SSL: - return 'S'; - case BLOCK_NOTICE: - return 'T'; - case BLOCK_COLOR: - return 'c'; - case FORWARD: - return 'f'; - case ALLOW_INVITE: - return 'g'; - case ONLY_INVITE: - return 'i'; - case JOIN_THROTTLE: - return 'j'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case BLOCK_UNIDENTIFIED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - case REDUCED_MODERATION: - return 'z'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - case MUTE: - return 'q'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java deleted file mode 100644 index 20bcb0f0f..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DalIrcModeProvider.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.AUDITORIUM; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class DalIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'A', 'M', 'O', 'R', 'S', 'c', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'A': - return AUDITORIUM; - case 'M': - return QUIET_UNIDENTIFIED; - case 'O': - return ONLY_OPER; - case 'R': - return BLOCK_UNIDENTIFIED; - case 'S': - return ONLY_SSL; - case 'c': - return BLOCK_COLOR; - case 'i': - return ONLY_INVITE; - case 'j': - return JOIN_THROTTLE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 'r': - return REGISTERED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case AUDITORIUM: - return 'A'; - case QUIET_UNIDENTIFIED: - return 'M'; - case ONLY_OPER: - return 'O'; - case BLOCK_UNIDENTIFIED: - return 'R'; - case ONLY_SSL: - return 'S'; - case BLOCK_COLOR: - return 'c'; - case ONLY_INVITE: - return 'i'; - case JOIN_THROTTLE: - return 'j'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case REGISTERED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java deleted file mode 100644 index d4ab60753..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/DancerIrcModeProvider.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_FORWARDING; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.REDUCED_MODERATION; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class DancerIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'J', 'P', 'Q', 'R', 'c', 'g', 'i', 'k', 'l', 'm', 'n', 'r', 's', 'z' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'J': - return JOIN_THROTTLE; - case 'P': - return PERMANENT; - case 'Q': - return BLOCK_FORWARDING; - case 'R': - return QUIET_UNIDENTIFIED; - case 'c': - return BLOCK_COLOR; - case 'g': - return ALLOW_INVITE; - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'r': - return BLOCK_UNIDENTIFIED; - case 's': - return UNLISTED; - case 'z': - return REDUCED_MODERATION; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case JOIN_THROTTLE: - return 'J'; - case PERMANENT: - return 'P'; - case BLOCK_FORWARDING: - return 'Q'; - case QUIET_UNIDENTIFIED: - return 'R'; - case BLOCK_COLOR: - return 'c'; - case ALLOW_INVITE: - return 'g'; - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case BLOCK_UNIDENTIFIED: - return 'r'; - case UNLISTED: - return 's'; - case REDUCED_MODERATION: - return 'z'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java deleted file mode 100644 index 8f67ed5c5..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/FqIrcModeProvider.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class FqIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'M', 'O', 'R', 'S', 'c', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'M': - return QUIET_UNIDENTIFIED; - case 'O': - return ONLY_OPER; - case 'R': - return BLOCK_UNIDENTIFIED; - case 'S': - return ONLY_SSL; - case 'c': - return BLOCK_COLOR; - case 'i': - return ONLY_INVITE; - case 'j': - return JOIN_THROTTLE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 'q': - return BLOCK_UNIDENTIFIED; - case 'r': - return REGISTERED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case QUIET_UNIDENTIFIED: - return 'M'; - case ONLY_OPER: - return 'O'; - case ONLY_SSL: - return 'S'; - case BLOCK_COLOR: - return 'c'; - case ONLY_INVITE: - return 'i'; - case JOIN_THROTTLE: - return 'j'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case BLOCK_UNIDENTIFIED: - return 'q'; - case REGISTERED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java deleted file mode 100644 index 13354aa50..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HybridIrcModeProvider.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class HybridIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'M', 'O', 'R', 'S', 'c', 'i', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'M': - return QUIET_UNIDENTIFIED; - case 'O': - return ONLY_OPER; - case 'R': - return BLOCK_UNIDENTIFIED; - case 'S': - return ONLY_SSL; - case 'c': - return BLOCK_COLOR; - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 'r': - return REGISTERED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case QUIET_UNIDENTIFIED: - return 'M'; - case ONLY_OPER: - return 'O'; - case BLOCK_UNIDENTIFIED: - return 'R'; - case ONLY_SSL: - return 'S'; - case BLOCK_COLOR: - return 'c'; - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case REGISTERED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java deleted file mode 100644 index e4dffc37c..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/HyperionIrcModeProvider.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_FORWARDING; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.REDUCED_MODERATION; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class HyperionIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'Q', 'R', 'c', 'g', 'i', 'k', 'l', 'm', 'n', 'r', 's', 'z' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'Q': - return BLOCK_FORWARDING; - case 'R': - return QUIET_UNIDENTIFIED; - case 'c': - return BLOCK_COLOR; - case 'g': - return ALLOW_INVITE; - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'r': - return BLOCK_UNIDENTIFIED; - case 's': - return UNLISTED; - case 'z': - return REDUCED_MODERATION; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case BLOCK_FORWARDING: - return 'Q'; - case QUIET_UNIDENTIFIED: - return 'R'; - case BLOCK_COLOR: - return 'c'; - case ALLOW_INVITE: - return 'g'; - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case BLOCK_UNIDENTIFIED: - return 'r'; - case UNLISTED: - return 's'; - case REDUCED_MODERATION: - return 'z'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java deleted file mode 100644 index 15a33499e..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/InspireIrcModeProvider.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ANTIFLOOD; -import static de.kuschku.util.irc.chanmodes.ChanMode.AUDITORIUM; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CAPS; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KNOCK; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.CENSOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.FORWARD; -import static de.kuschku.util.irc.chanmodes.ChanMode.HIDE_JOINS; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.STRIP_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class InspireIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'A', 'B', 'C', 'D', 'G', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'c', 'f', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'u', 'z' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'A': - return ALLOW_INVITE; - case 'B': - return BLOCK_CAPS; - case 'C': - return BLOCK_CTCP; - case 'D': - return HIDE_JOINS; - case 'G': - return CENSOR; - case 'K': - return BLOCK_KNOCK; - case 'L': - return FORWARD; - case 'M': - return QUIET_UNIDENTIFIED; - case 'N': - return BLOCK_NICKCHANGE; - case 'O': - return ONLY_OPER; - case 'P': - return PERMANENT; - case 'Q': - return BLOCK_KICK; - case 'R': - return BLOCK_UNIDENTIFIED; - case 'S': - return STRIP_COLOR; - case 'T': - return BLOCK_NOTICE; - case 'c': - return BLOCK_COLOR; - case 'f': - return ANTIFLOOD; - case 'i': - return ONLY_INVITE; - case 'j': - return JOIN_THROTTLE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 'r': - return REGISTERED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - case 'u': - return AUDITORIUM; - case 'z': - return ONLY_SSL; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case ALLOW_INVITE: - return 'A'; - case BLOCK_CAPS: - return 'B'; - case BLOCK_CTCP: - return 'C'; - case HIDE_JOINS: - return 'D'; - case CENSOR: - return 'G'; - case BLOCK_KNOCK: - return 'K'; - case FORWARD: - return 'L'; - case QUIET_UNIDENTIFIED: - return 'M'; - case BLOCK_NICKCHANGE: - return 'N'; - case ONLY_OPER: - return 'O'; - case PERMANENT: - return 'P'; - case BLOCK_KICK: - return 'Q'; - case BLOCK_UNIDENTIFIED: - return 'R'; - case STRIP_COLOR: - return 'S'; - case BLOCK_NOTICE: - return 'T'; - case BLOCK_COLOR: - return 'c'; - case ANTIFLOOD: - return 'f'; - case ONLY_INVITE: - return 'i'; - case JOIN_THROTTLE: - return 'j'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case REGISTERED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - case AUDITORIUM: - return 'u'; - case ONLY_SSL: - return 'z'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java deleted file mode 100644 index 1048d3e99..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NeoIrcModeProvider.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.DISABLE_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class NeoIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'M', 'N', 'O', 'P', 'Q', 'R', 'V', 'i', 'k', 'l', 'm', 'n', 'r', 's', 't', 'z' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'M': - return QUIET_UNIDENTIFIED; - case 'N': - return BLOCK_NICKCHANGE; - case 'O': - return ONLY_OPER; - case 'P': - return PERMANENT; - case 'Q': - return BLOCK_KICK; - case 'R': - return BLOCK_UNIDENTIFIED; - case 'V': - return DISABLE_INVITE; - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'r': - return REGISTERED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - case 'z': - return ONLY_SSL; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case QUIET_UNIDENTIFIED: - return 'M'; - case BLOCK_NICKCHANGE: - return 'N'; - case ONLY_OPER: - return 'O'; - case PERMANENT: - return 'P'; - case BLOCK_KICK: - return 'Q'; - case BLOCK_UNIDENTIFIED: - return 'R'; - case DISABLE_INVITE: - return 'V'; - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case REGISTERED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - case ONLY_SSL: - return 'z'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java deleted file mode 100644 index 0d97b55a9..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/NightstarIrcModeProvider.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class NightstarIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'C', 'i', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't' - )); - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'C': - return BLOCK_COLOR; - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 'r': - return REGISTERED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case BLOCK_COLOR: - return 'C'; - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case REGISTERED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java deleted file mode 100644 index 99cff9cda..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/RfcIrcModeProvider.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class RfcIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'p', 's', 'i', 't', 'n', 'm', 'l', 'k' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'p': - return PARANOID; - case 's': - return UNLISTED; - case 'i': - return ONLY_INVITE; - case 't': - return RESTRICT_TOPIC; - case 'n': - return BLOCK_EXTERNAL; - case 'm': - return MODERATED; - case 'l': - return LIMIT; - case 'k': - return PASSWORD; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case PARANOID: - return 'p'; - case UNLISTED: - return 's'; - case ONLY_INVITE: - return 'i'; - case RESTRICT_TOPIC: - return 't'; - case BLOCK_EXTERNAL: - return 'n'; - case MODERATED: - return 'm'; - case LIMIT: - return 'l'; - case PASSWORD: - return 'k'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java deleted file mode 100644 index 871708455..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/ShadowIrcModeProvider.java +++ /dev/null @@ -1,209 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_FORWARD; -import static de.kuschku.util.irc.chanmodes.ChanMode.ALLOW_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_ACTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_AUTOREJOIN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CAPS; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_FORWARDING; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_REPEAT; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.JOIN_THROTTLE; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_ADMIN; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT; -import static de.kuschku.util.irc.chanmodes.ChanMode.REDUCED_MODERATION; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.STRIP_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class ShadowIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'A', 'C', 'D', 'E', 'F', 'G', 'J', 'K', 'O', 'P', 'Q', 'S', 'T', 'c', 'd', 'g', 'i', 'j', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'z' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'A': - return ONLY_ADMIN; - case 'C': - return BLOCK_CTCP; - case 'D': - return BLOCK_ACTION; - case 'E': - return BLOCK_KICK; - case 'F': - return ALLOW_FORWARD; - case 'G': - return BLOCK_CAPS; - case 'J': - return BLOCK_AUTOREJOIN; - case 'K': - return BLOCK_REPEAT; - case 'O': - return ONLY_OPER; - case 'P': - return PERMANENT; - case 'Q': - return BLOCK_FORWARDING; - case 'S': - return ONLY_SSL; - case 'T': - return BLOCK_NOTICE; - case 'c': - return STRIP_COLOR; - case 'd': - return BLOCK_NICKCHANGE; - case 'g': - return ALLOW_INVITE; - case 'i': - return ONLY_INVITE; - case 'j': - return JOIN_THROTTLE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 'r': - return BLOCK_UNIDENTIFIED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - case 'z': - return REDUCED_MODERATION; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case ONLY_ADMIN: - return 'A'; - case BLOCK_CTCP: - return 'C'; - case BLOCK_ACTION: - return 'D'; - case BLOCK_KICK: - return 'E'; - case ALLOW_FORWARD: - return 'F'; - case BLOCK_CAPS: - return 'G'; - case BLOCK_AUTOREJOIN: - return 'J'; - case BLOCK_REPEAT: - return 'K'; - case ONLY_OPER: - return 'O'; - case PERMANENT: - return 'P'; - case BLOCK_FORWARDING: - return 'Q'; - case ONLY_SSL: - return 'S'; - case BLOCK_NOTICE: - return 'T'; - case STRIP_COLOR: - return 'c'; - case BLOCK_NICKCHANGE: - return 'd'; - case ALLOW_INVITE: - return 'g'; - case ONLY_INVITE: - return 'i'; - case JOIN_THROTTLE: - return 'j'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case BLOCK_UNIDENTIFIED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - case REDUCED_MODERATION: - return 'z'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java deleted file mode 100644 index 39b90fe6f..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/SolidIrcModeProvider.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.ANTIFLOOD; -import static de.kuschku.util.irc.chanmodes.ChanMode.AUDITORIUM; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CAPS; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KNOCK; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.CENSOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.DISABLE_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.STRIP_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class SolidIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'B', 'C', 'G', 'K', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'c', 'f', 'i', 'k', 'l', 'm', 'n', 'p', 's', 't', 'u', 'z' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'B': - return BLOCK_CAPS; - case 'C': - return BLOCK_CTCP; - case 'G': - return CENSOR; - case 'K': - return BLOCK_KNOCK; - case 'M': - return QUIET_UNIDENTIFIED; - case 'N': - return BLOCK_NICKCHANGE; - case 'P': - return PERMANENT; - case 'Q': - return BLOCK_KICK; - case 'R': - return BLOCK_UNIDENTIFIED; - case 'S': - return STRIP_COLOR; - case 'T': - return BLOCK_NOTICE; - case 'V': - return DISABLE_INVITE; - case 'c': - return BLOCK_COLOR; - case 'f': - return ANTIFLOOD; - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - case 'u': - return AUDITORIUM; - case 'z': - return ONLY_SSL; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case BLOCK_CAPS: - return 'B'; - case BLOCK_CTCP: - return 'C'; - case CENSOR: - return 'G'; - case BLOCK_KNOCK: - return 'K'; - case QUIET_UNIDENTIFIED: - return 'M'; - case BLOCK_NICKCHANGE: - return 'N'; - case PERMANENT: - return 'P'; - case BLOCK_KICK: - return 'Q'; - case BLOCK_UNIDENTIFIED: - return 'R'; - case STRIP_COLOR: - return 'S'; - case BLOCK_NOTICE: - return 'T'; - case DISABLE_INVITE: - return 'V'; - case BLOCK_COLOR: - return 'c'; - case ANTIFLOOD: - return 'f'; - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - case AUDITORIUM: - return 'u'; - case ONLY_SSL: - return 'z'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java deleted file mode 100644 index d9d96d9a9..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UndernetIrcModeProvider.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class UndernetIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'i', 'k', 'l', 'm', 'n', 'p', 's', 't' - )); - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java b/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java deleted file mode 100644 index cf2007761..000000000 --- a/app/src/main/java/de/kuschku/util/irc/chanmodes/impl/UnrealIrcModeProvider.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.chanmodes.impl; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.irc.chanmodes.AbstractIrcModeProvider; -import de.kuschku.util.irc.chanmodes.ChanMode; - -import static de.kuschku.util.irc.chanmodes.ChanMode.ANTIFLOOD; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN; -import static de.kuschku.util.irc.chanmodes.ChanMode.BAN_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_CTCP; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_EXTERNAL; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KICK; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_KNOCK; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NICKCHANGE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_NOTICE; -import static de.kuschku.util.irc.chanmodes.ChanMode.BLOCK_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.CENSOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.DISABLE_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.FORWARD; -import static de.kuschku.util.irc.chanmodes.ChanMode.INVITE_EXCEPTION; -import static de.kuschku.util.irc.chanmodes.ChanMode.IS_SECURE; -import static de.kuschku.util.irc.chanmodes.ChanMode.LIMIT; -import static de.kuschku.util.irc.chanmodes.ChanMode.MODERATED; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_INVITE; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_OPER; -import static de.kuschku.util.irc.chanmodes.ChanMode.ONLY_SSL; -import static de.kuschku.util.irc.chanmodes.ChanMode.PARANOID; -import static de.kuschku.util.irc.chanmodes.ChanMode.PASSWORD; -import static de.kuschku.util.irc.chanmodes.ChanMode.PERMANENT; -import static de.kuschku.util.irc.chanmodes.ChanMode.QUIET_UNIDENTIFIED; -import static de.kuschku.util.irc.chanmodes.ChanMode.REGISTERED; -import static de.kuschku.util.irc.chanmodes.ChanMode.RESTRICT_TOPIC; -import static de.kuschku.util.irc.chanmodes.ChanMode.STRIP_COLOR; -import static de.kuschku.util.irc.chanmodes.ChanMode.UNLISTED; - -public class UnrealIrcModeProvider extends AbstractIrcModeProvider { - - protected final Set<Character> supportedModes = new HashSet<>(Arrays.asList( - 'C', 'F', 'G', 'K', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'V', 'Z', 'c', 'f', 'i', 'k', 'l', 'm', 'n', 'p', 'r', 's', 't', 'z' - )); - - @Override - public ChanMode modeFromChar(char mode) { - switch (mode) { - case 'C': - return BLOCK_CTCP; - case 'F': - return FORWARD; - case 'G': - return CENSOR; - case 'K': - return BLOCK_KNOCK; - case 'M': - return QUIET_UNIDENTIFIED; - case 'N': - return BLOCK_NICKCHANGE; - case 'O': - return ONLY_OPER; - case 'P': - return PERMANENT; - case 'Q': - return BLOCK_KICK; - case 'R': - return BLOCK_UNIDENTIFIED; - case 'S': - return STRIP_COLOR; - case 'T': - return BLOCK_NOTICE; - case 'V': - return DISABLE_INVITE; - case 'Z': - return IS_SECURE; - case 'c': - return BLOCK_COLOR; - case 'f': - return ANTIFLOOD; - case 'i': - return ONLY_INVITE; - case 'k': - return PASSWORD; - case 'l': - return LIMIT; - case 'm': - return MODERATED; - case 'n': - return BLOCK_EXTERNAL; - case 'p': - return PARANOID; - case 'r': - return REGISTERED; - case 's': - return UNLISTED; - case 't': - return RESTRICT_TOPIC; - case 'z': - return ONLY_SSL; - - case 'b': - return BAN; - case 'e': - return BAN_EXCEPTION; - case 'I': - return INVITE_EXCEPTION; - } - return null; - } - - @Override - public char charFromMode(ChanMode mode) { - switch (mode) { - case BLOCK_CTCP: - return 'C'; - case FORWARD: - return 'F'; - case CENSOR: - return 'G'; - case BLOCK_KNOCK: - return 'K'; - case QUIET_UNIDENTIFIED: - return 'M'; - case BLOCK_NICKCHANGE: - return 'N'; - case ONLY_OPER: - return 'O'; - case PERMANENT: - return 'P'; - case BLOCK_KICK: - return 'Q'; - case BLOCK_UNIDENTIFIED: - return 'R'; - case STRIP_COLOR: - return 'S'; - case BLOCK_NOTICE: - return 'T'; - case DISABLE_INVITE: - return 'V'; - case IS_SECURE: - return 'Z'; - case BLOCK_COLOR: - return 'c'; - case ANTIFLOOD: - return 'f'; - case ONLY_INVITE: - return 'i'; - case PASSWORD: - return 'k'; - case LIMIT: - return 'l'; - case MODERATED: - return 'm'; - case BLOCK_EXTERNAL: - return 'n'; - case PARANOID: - return 'p'; - case REGISTERED: - return 'r'; - case UNLISTED: - return 's'; - case RESTRICT_TOPIC: - return 't'; - case ONLY_SSL: - return 'z'; - - case BAN: - return 'b'; - case BAN_EXCEPTION: - return 'e'; - case INVITE_EXCEPTION: - return 'I'; - } - return ' '; - } - - @Override - protected Collection<Character> supportedModes() { - return supportedModes; - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatDeserializer.java b/app/src/main/java/de/kuschku/util/irc/format/IrcFormatDeserializer.java deleted file mode 100644 index d67fe3eee..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatDeserializer.java +++ /dev/null @@ -1,361 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format; - - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.text.SpannableStringBuilder; -import android.text.Spanned; -import android.text.style.UnderlineSpan; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.irc.format.spans.IrcBackgroundColorSpan; -import de.kuschku.util.irc.format.spans.IrcBoldSpan; -import de.kuschku.util.irc.format.spans.IrcForegroundColorSpan; -import de.kuschku.util.irc.format.spans.IrcItalicSpan; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -/** - * A helper class to turn mIRC formatted Strings into Android’s SpannableStrings with the same - * color and format codes - */ -public class IrcFormatDeserializer { - public static final int CODE_BOLD = 0x02; - public static final int CODE_COLOR = 0x03; - public static final int CODE_ITALIC = 0x1D; - public static final int CODE_UNDERLINE = 0x1F; - public static final int CODE_SWAP = 0x16; - public static final int CODE_RESET = 0x0F; - - private final AppContext context; - - public IrcFormatDeserializer(AppContext context) { - this.context = context; - } - - /** - * Try to read a number from a String in specified bounds - * - * @param str String to be read from - * @param start Start index (inclusive) - * @param end End index (exclusive) - * @return The byte represented by the digits read from the string - */ - public static byte readNumber(@NonNull String str, int start, int end) { - String result = str.substring(start, end); - if (result.isEmpty()) - return -1; - else - return (byte) Integer.parseInt(result, 10); - } - - /** - * @param str String to be searched in - * @param start Start position (inclusive) - * @return Index of first character that is not a digit - */ - private static int findEndOfNumber(@NonNull String str, int start) { - Set<Character> validCharCodes = new HashSet<>(Arrays.asList('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')); - String searchFrame = str.substring(start); - int i; - for (i = 0; i < 2 && i < searchFrame.length(); i++) { - if (!validCharCodes.contains(searchFrame.charAt(i))) { - break; - } - } - return start + i; - } - - @Nullable - private static IrcFormat fromId(char id) { - switch (id) { - case CODE_BOLD: - return new BoldIrcFormat(); - case CODE_ITALIC: - return new ItalicIrcFormat(); - case CODE_UNDERLINE: - return new UnderlineIrcFormat(); - default: - return null; - } - } - - /** - * Function to handle mIRC formatted strings - * - * @param str mIRC formatted String - * @return a CharSequence with Android’s span format representing the input string - */ - @NonNull - public CharSequence formatString(@Nullable String str) { - if (str == null) return ""; - - SpannableStringBuilder plainText = new SpannableStringBuilder(); - FormatDescription bold = null; - FormatDescription italic = null; - FormatDescription underline = null; - FormatDescription color = null; - boolean colorize = context.settings().preferenceColors.get(); - - // Iterating over every character - int normalCount = 0; - for (int i = 0; i < str.length(); i++) { - char character = str.charAt(i); - switch (character) { - case CODE_BOLD: { - plainText.append(str.substring(i - normalCount, i)); - normalCount = 0; - - // If there is an element on stack with the same code, close it - if (bold != null) { - if (colorize) bold.apply(plainText, plainText.length()); - bold = null; - // Otherwise create a new one - } else { - IrcFormat format = fromId(character); - assertNotNull(format); - bold = new FormatDescription(plainText.length(), format); - } - } - break; - case CODE_ITALIC: { - plainText.append(str.substring(i - normalCount, i)); - normalCount = 0; - - // If there is an element on stack with the same code, close it - if (italic != null) { - if (colorize) italic.apply(plainText, plainText.length()); - italic = null; - // Otherwise create a new one - } else { - IrcFormat format = fromId(character); - assertNotNull(format); - italic = new FormatDescription(plainText.length(), format); - } - } - break; - case CODE_UNDERLINE: { - plainText.append(str.substring(i - normalCount, i)); - normalCount = 0; - - // If there is an element on stack with the same code, close it - if (underline != null) { - if (colorize) underline.apply(plainText, plainText.length()); - underline = null; - // Otherwise create a new one - } else { - IrcFormat format = fromId(character); - assertNotNull(format); - underline = new FormatDescription(plainText.length(), format); - } - } - break; - case CODE_COLOR: { - plainText.append(str.substring(i - normalCount, i)); - normalCount = 0; - - int foregroundStart = i + 1; - int foregroundEnd = findEndOfNumber(str, foregroundStart); - // If we have a foreground element - if (foregroundEnd > foregroundStart) { - byte foreground = readNumber(str, foregroundStart, foregroundEnd); - - byte background = -1; - int backgroundEnd = -1; - // If we have a background code, read it - if (str.length() > foregroundEnd && str.charAt(foregroundEnd) == ',') { - backgroundEnd = findEndOfNumber(str, foregroundEnd + 1); - background = readNumber(str, foregroundEnd + 1, backgroundEnd); - } - // If previous element was also a color element, try to reuse background - if (color != null) { - // Apply old format - if (colorize) color.apply(plainText, plainText.length()); - // Reuse old background, if possible - if (background == -1) - background = ((ColorIrcFormat) color.format).background; - } - // Add new format - color = new FormatDescription(plainText.length(), new ColorIrcFormat(foreground, background)); - - // i points in front of the next character - i = ((backgroundEnd == -1) ? foregroundEnd : backgroundEnd) - 1; - - // Otherwise assume this is a closing tag - } else if (color != null) { - if (colorize) color.apply(plainText, plainText.length()); - color = null; - } - } - break; - case CODE_SWAP: { - plainText.append(str.substring(i - normalCount, i)); - normalCount = 0; - - // If we have a color tag before, apply it, and create a new one with swapped colors - if (color != null) { - if (colorize) color.apply(plainText, plainText.length()); - color = new FormatDescription(plainText.length(), ((ColorIrcFormat) color.format).copySwapped()); - } - } - break; - case CODE_RESET: { - plainText.append(str.substring(i - normalCount, i)); - normalCount = 0; - - // End all formatting tags - if (bold != null) { - if (colorize) bold.apply(plainText, plainText.length()); - bold = null; - } - if (italic != null) { - if (colorize) italic.apply(plainText, plainText.length()); - italic = null; - } - if (underline != null) { - if (colorize) underline.apply(plainText, plainText.length()); - underline = null; - } - if (color != null) { - if (colorize) color.apply(plainText, plainText.length()); - color = null; - } - } - break; - default: { - // Just append it, if it’s not special - normalCount++; - } - } - } - - // End all formatting tags - if (bold != null) { - if (colorize) bold.apply(plainText, plainText.length()); - } - if (italic != null) { - if (colorize) italic.apply(plainText, plainText.length()); - } - if (underline != null) { - if (colorize) underline.apply(plainText, plainText.length()); - } - if (color != null) { - if (colorize) color.apply(plainText, plainText.length()); - } - plainText.append(str.substring(str.length() - normalCount, str.length())); - return plainText; - } - - private interface IrcFormat { - void applyTo(@NonNull SpannableStringBuilder editable, int from, int to); - - byte id(); - } - - private static class FormatDescription { - public final int start; - @NonNull - public final IrcFormat format; - - public FormatDescription(int start, @NonNull IrcFormat format) { - this.start = start; - this.format = format; - } - - public void apply(@NonNull SpannableStringBuilder editable, int end) { - format.applyTo(editable, start, end); - } - } - - private static class ItalicIrcFormat implements IrcFormat { - @Override - public void applyTo(@NonNull SpannableStringBuilder editable, int from, int to) { - editable.setSpan(new IrcItalicSpan(), from, to, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - } - - @Override - public byte id() { - return CODE_ITALIC; - } - } - - private static class UnderlineIrcFormat implements IrcFormat { - @Override - public void applyTo(@NonNull SpannableStringBuilder editable, int from, int to) { - editable.setSpan(new UnderlineSpan(), from, to, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - } - - @Override - public byte id() { - return CODE_UNDERLINE; - } - } - - private static class BoldIrcFormat implements IrcFormat { - @Override - public void applyTo(@NonNull SpannableStringBuilder editable, int from, int to) { - editable.setSpan(new IrcBoldSpan(), from, to, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - } - - @Override - public byte id() { - return CODE_BOLD; - } - } - - private class ColorIrcFormat implements IrcFormat { - private final byte foreground; - private final byte background; - - public ColorIrcFormat(byte foreground, byte background) { - this.foreground = foreground; - this.background = background; - } - - @Override - public void applyTo(@NonNull SpannableStringBuilder editable, int from, int to) { - int[] mircColors = context.themeUtil().res.mircColors; - if (foreground != -1 && foreground != 99) { - editable.setSpan(new IrcForegroundColorSpan(foreground, mircColors[foreground % 16]), from, to, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - } - if (background != -1 && background != 99) { - editable.setSpan(new IrcBackgroundColorSpan(background, mircColors[background % 16]), from, to, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - } - } - - @NonNull - public ColorIrcFormat copySwapped() { - return new ColorIrcFormat(background, foreground); - } - - @Override - public byte id() { - return CODE_COLOR; - } - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java b/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java deleted file mode 100644 index 970ad4030..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatHelper.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format; - - -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.graphics.Typeface; -import android.net.Uri; -import android.provider.Browser; -import android.support.annotation.NonNull; -import android.text.SpannableString; -import android.text.Spanned; -import android.text.style.ClickableSpan; -import android.text.style.ForegroundColorSpan; -import android.text.style.StyleSpan; -import android.util.Log; -import android.view.View; - -import java.util.LinkedList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import de.kuschku.libquassel.client.Client; -import de.kuschku.libquassel.localtypes.buffers.Buffer; -import de.kuschku.libquassel.message.Message; -import de.kuschku.libquassel.primitives.types.BufferInfo; -import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.irc.IrcUserUtils; - -public class IrcFormatHelper { - @NonNull - private static final String scheme = "(?:(?:mailto:|(?:[+.-]?\\w)+://)|www(?=\\.\\S+\\.))"; - @NonNull - private static final String authority = "(?:(?:[,.;@:]?[-\\w]+)+\\.?|\\[[0-9a-f:.]+\\])(?::\\d+)?"; - @NonNull - private static final String urlChars = "(?:[,.;:]*[\\w~@/?&=+$()!%#*-])"; - @NonNull - private static final String urlEnd = "((?:>|[,.;:\"]*\\s|\\b|$))"; - @NonNull - private static final Pattern urlPattern = Pattern.compile(String.format("\\b(%s%s(?:/%s*)?)%s", scheme, authority, urlChars, urlEnd), Pattern.CASE_INSENSITIVE); - @NonNull - private static final Pattern channelPattern = Pattern.compile("((?:#|![A-Z0-9]{5})[^,:\\s]+(?::[^,:\\s]+)?)\\b", Pattern.CASE_INSENSITIVE); - - @NonNull - private final AppContext context; - - public IrcFormatHelper(@NonNull AppContext context) { - this.context = context; - } - - @NonNull - public CharSequence formatUserNick(@NonNull String nick) { - int colorIndex = IrcUserUtils.getSenderColor(nick); - int color = context.themeUtil().res.senderColors[colorIndex]; - - SpannableString str = new SpannableString(nick); - str.setSpan(new ForegroundColorSpan(color), 0, nick.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - str.setSpan(new StyleSpan(Typeface.BOLD), 0, nick.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - return str; - } - - @NonNull - public CharSequence formatIrcMessage(@NonNull Client client, @NonNull Message message) { - return formatIrcMessage(client, message.content, message.bufferInfo, null); - } - - @NonNull - public CharSequence formatIrcMessage(@NonNull Client client, @NonNull String text, BufferInfo bufferInfo, View.OnClickListener listener) { - List<FutureClickableSpan> spans = new LinkedList<>(); - - SpannableString str = new SpannableString(context.deserializer().formatString(text)); - Matcher urlMatcher = urlPattern.matcher(str); - while (urlMatcher.find()) { - spans.add(new FutureClickableSpan(new CustomURLSpan(urlMatcher.group(1)), urlMatcher.start(), urlMatcher.start() + urlMatcher.group(1).length())); - } - Matcher channelMatcher = channelPattern.matcher(str); - while (channelMatcher.find()) { - QIrcChannel channel = client.networkManager().network(bufferInfo.networkId).ircChannel(channelMatcher.group()); - Buffer buffer = client.bufferManager().channel(channel); - if (buffer != null) - spans.add(new FutureClickableSpan(new ChannelSpan(client, buffer.getInfo().id, listener), channelMatcher.start(), channelMatcher.end())); - } - for (FutureClickableSpan span : spans) { - str.setSpan(span.span, span.start, span.end, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); - } - return str; - } - - private static class FutureClickableSpan { - @NonNull - public final ClickableSpan span; - public final int start; - public final int end; - - public FutureClickableSpan(@NonNull ClickableSpan span, int start, int end) { - this.span = span; - this.start = start; - this.end = end; - } - } - - private static class CustomURLSpan extends ClickableSpan { - private final String mURL; - - public CustomURLSpan(@NonNull String url) { - mURL = url; - } - - @Override - public void onClick(View widget) { - Uri uri = Uri.parse(mURL); - Context context = widget.getContext(); - Intent intent = new Intent(Intent.ACTION_VIEW, uri); - intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName()); - try { - context.startActivity(intent); - } catch (ActivityNotFoundException e) { - Log.w("URLSpan", "Actvity was not found for intent, " + intent.toString()); - } - } - } - - private class ChannelSpan extends ClickableSpan { - @NonNull - private final Client client; - private final int bufferid; - private final View.OnClickListener listener; - - public ChannelSpan(@NonNull Client client, int bufferid, View.OnClickListener listener) { - this.client = client; - this.bufferid = bufferid; - this.listener = listener; - } - - @Override - public void onClick(View widget) { - client.backlogManager().open(bufferid); - if (listener != null) - listener.onClick(widget); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatSerializer.java b/app/src/main/java/de/kuschku/util/irc/format/IrcFormatSerializer.java deleted file mode 100644 index f2de6ec06..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/IrcFormatSerializer.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format; - -import android.support.annotation.NonNull; -import android.text.Spanned; -import android.text.style.BackgroundColorSpan; -import android.text.style.CharacterStyle; -import android.text.style.ForegroundColorSpan; -import android.text.style.UnderlineSpan; - -import java.util.Locale; - -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.irc.format.spans.IrcBackgroundColorSpan; -import de.kuschku.util.irc.format.spans.IrcBoldSpan; -import de.kuschku.util.irc.format.spans.IrcForegroundColorSpan; -import de.kuschku.util.irc.format.spans.IrcItalicSpan; - -public class IrcFormatSerializer { - public static final char CODE_BOLD = 0x02; - public static final char CODE_COLOR = 0x03; - public static final char CODE_ITALIC = 0x1D; - public static final char CODE_UNDERLINE = 0x1F; - public static final char CODE_SWAP = 0x16; - public static final char CODE_RESET = 0x0F; - - private final AppContext context; - - public IrcFormatSerializer(AppContext context) { - this.context = context; - } - - @NonNull - public String toEscapeCodes(@NonNull Spanned text) { - StringBuilder out = new StringBuilder(); - withinParagraph(out, text, 0, text.length()); - return out.toString(); - } - - private void withinParagraph(@NonNull StringBuilder out, @NonNull Spanned text, - int start, int end) { - int next; - int foreground = -1; - int background = -1; - boolean bold = false; - boolean underline = false; - boolean italic = false; - - for (int i = start; i < end; i = next) { - next = text.nextSpanTransition(i, end, CharacterStyle.class); - CharacterStyle[] style = text.getSpans(i, next, CharacterStyle.class); - - int afterForeground = -1; - int afterBackground = -1; - boolean afterBold = false; - boolean afterUnderline = false; - boolean afterItalic = false; - - for (CharacterStyle aStyle : style) { - if ((text.getSpanFlags(aStyle) & Spanned.SPAN_COMPOSING) != 0) - continue; - - if (aStyle instanceof IrcBoldSpan) { - afterBold = true; - } else if (aStyle instanceof IrcItalicSpan) { - afterItalic = true; - } else if (aStyle instanceof UnderlineSpan) { - afterUnderline = true; - } else if (aStyle instanceof IrcForegroundColorSpan) { - afterForeground = ((IrcForegroundColorSpan) aStyle).mircColor; - } else if (aStyle instanceof IrcBackgroundColorSpan) { - afterBackground = ((IrcBackgroundColorSpan) aStyle).mircColor; - } else if (aStyle instanceof ForegroundColorSpan) { - afterForeground = context.themeUtil().res.colorToId(((ForegroundColorSpan) aStyle).getForegroundColor()); - } else if (aStyle instanceof BackgroundColorSpan) { - afterBackground = context.themeUtil().res.colorToId(((BackgroundColorSpan) aStyle).getBackgroundColor()); - } - } - - if (afterBold != bold) { - out.append(CODE_BOLD); - } - - if (afterUnderline != underline) { - out.append(CODE_UNDERLINE); - } - - if (afterItalic != italic) { - out.append(CODE_ITALIC); - } - - if (afterForeground != foreground || afterBackground != background) { - if (afterForeground == background && afterBackground == foreground) { - out.append(CODE_SWAP); - } else { - out.append(CODE_COLOR); - if (afterBackground == -1) { - if (afterForeground == -1) { - // Foreground changed from a value to null, we don’t set any new foreground - // Background changed from a value to null, we don’t set any new background - } else { - out.append(CODE_COLOR); - out.append(String.format(Locale.US, "%02d", afterForeground)); - } - } else if (background == afterBackground) { - if (afterForeground == -1) { - out.append(String.format(Locale.US, "%02d", context.themeUtil().res.colorForegroundMirc)); - } else { - out.append(String.format(Locale.US, "%02d", afterForeground)); - } - } else { - if (afterForeground == -1) { - out.append(String.format(Locale.US, "%02d,%02d", context.themeUtil().res.colorForegroundMirc, afterBackground)); - } else { - out.append(String.format(Locale.US, "%02d,%02d", afterForeground, afterBackground)); - } - } - } - } - - out.append(text.subSequence(i, next)); - - bold = afterBold; - italic = afterItalic; - underline = afterUnderline; - background = afterBackground; - foreground = afterForeground; - } - - if (bold || italic || underline || background != -1 || foreground != -1) - out.append(CODE_RESET); - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/spans/Copyable.java b/app/src/main/java/de/kuschku/util/irc/format/spans/Copyable.java deleted file mode 100644 index 45307ac8b..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/spans/Copyable.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format.spans; - -public interface Copyable<T> { - T copy(); -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcBackgroundColorSpan.java b/app/src/main/java/de/kuschku/util/irc/format/spans/IrcBackgroundColorSpan.java deleted file mode 100644 index 758408fcd..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcBackgroundColorSpan.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format.spans; - -import android.support.annotation.ColorInt; -import android.text.style.BackgroundColorSpan; - -public class IrcBackgroundColorSpan extends BackgroundColorSpan implements Copyable<IrcBackgroundColorSpan> { - public final int mircColor; - - public IrcBackgroundColorSpan(int mircColor, @ColorInt int color) { - super(color); - this.mircColor = mircColor; - } - - @Override - public IrcBackgroundColorSpan copy() { - return new IrcBackgroundColorSpan(mircColor, getBackgroundColor()); - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcBoldSpan.java b/app/src/main/java/de/kuschku/util/irc/format/spans/IrcBoldSpan.java deleted file mode 100644 index aa4361ddf..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcBoldSpan.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format.spans; - -import android.graphics.Typeface; -import android.text.style.StyleSpan; - -public class IrcBoldSpan extends StyleSpan implements Copyable<IrcBoldSpan> { - public IrcBoldSpan() { - super(Typeface.BOLD); - } - - @Override - public IrcBoldSpan copy() { - return new IrcBoldSpan(); - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcForegroundColorSpan.java b/app/src/main/java/de/kuschku/util/irc/format/spans/IrcForegroundColorSpan.java deleted file mode 100644 index 5cf8c7ebb..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcForegroundColorSpan.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format.spans; - -import android.support.annotation.ColorInt; -import android.text.style.ForegroundColorSpan; - -public class IrcForegroundColorSpan extends ForegroundColorSpan implements Copyable<IrcForegroundColorSpan> { - public final int mircColor; - - public IrcForegroundColorSpan(int mircColor, @ColorInt int color) { - super(color); - this.mircColor = mircColor; - } - - @Override - public IrcForegroundColorSpan copy() { - return new IrcForegroundColorSpan(mircColor, getForegroundColor()); - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcItalicSpan.java b/app/src/main/java/de/kuschku/util/irc/format/spans/IrcItalicSpan.java deleted file mode 100644 index 149a4012d..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcItalicSpan.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format.spans; - -import android.graphics.Typeface; -import android.text.style.StyleSpan; - -public class IrcItalicSpan extends StyleSpan implements Copyable<IrcItalicSpan> { - public IrcItalicSpan() { - super(Typeface.ITALIC); - } - - @Override - public IrcItalicSpan copy() { - return new IrcItalicSpan(); - } -} diff --git a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcUnderlineSpan.java b/app/src/main/java/de/kuschku/util/irc/format/spans/IrcUnderlineSpan.java deleted file mode 100644 index 1eef3ebad..000000000 --- a/app/src/main/java/de/kuschku/util/irc/format/spans/IrcUnderlineSpan.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.irc.format.spans; - -import android.text.style.UnderlineSpan; - -public class IrcUnderlineSpan extends UnderlineSpan implements Copyable<IrcUnderlineSpan> { - @Override - public IrcUnderlineSpan copy() { - return new IrcUnderlineSpan(); - } -} diff --git a/app/src/main/java/de/kuschku/util/niohelpers/Helper.java b/app/src/main/java/de/kuschku/util/niohelpers/Helper.java deleted file mode 100644 index 7ce8bbe04..000000000 --- a/app/src/main/java/de/kuschku/util/niohelpers/Helper.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.niohelpers; - -import android.support.annotation.NonNull; -import android.util.Log; - -import java.util.LinkedList; -import java.util.List; - -public class Helper { - // Making default constructor invisible - private Helper() { - - } - - public static void printHexDump(String prefix, @NonNull byte[] data) { - List<String> strs = new LinkedList<>(); - Log.e("HexDump" + prefix, "========"); - String bytes = ""; - int i; - for (i = 0; i < data.length; i++) { - bytes += String.format("%02x ", data[i]); - if (i > 0 && (i + 1) % 32 == 0) { - strs.add(bytes); - bytes = ""; - } - } - strs.add(bytes); - for (int j = 0; j < strs.size(); j++) { - Log.e("HexDump" + prefix + ":" + j, strs.get(j)); - } - } - - public static void printHexDump(@NonNull byte[] data) { - printHexDump("", data); - } -} diff --git a/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java b/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java deleted file mode 100644 index 7f73372ce..000000000 --- a/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.niohelpers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.Flushable; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; -import java.nio.ByteBuffer; -import java.nio.channels.ByteChannel; -import java.nio.channels.ClosedChannelException; -import java.nio.channels.InterruptibleChannel; -import java.security.GeneralSecurityException; -import java.security.cert.X509Certificate; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.InflaterInputStream; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; - -import de.kuschku.libquassel.ssl.CertificateManager; -import de.kuschku.libquassel.ssl.QuasselTrustManager; -import de.kuschku.util.CompatibilityUtils; -import de.kuschku.util.accounts.ServerAddress; -import de.kuschku.util.backports.Consumer; - -public class WrappedChannel implements Flushable, ByteChannel, InterruptibleChannel { - @Nullable - private final InputStream rawIn; - @Nullable - private final OutputStream rawOut; - @Nullable - private DataInputStream in; - @Nullable - private DataOutputStream out; - - @Nullable - private Socket socket = null; - - private WrappedChannel(@Nullable InputStream in, @Nullable OutputStream out) { - this.rawIn = in; - this.rawOut = out; - if (this.rawIn != null) this.in = new DataInputStream(rawIn); - if (this.rawOut != null) this.out = new DataOutputStream(rawOut); - } - - public WrappedChannel(@NonNull Socket s) throws IOException { - this(s.getInputStream(), s.getOutputStream()); - this.socket = s; - } - - @NonNull - public static WrappedChannel ofStreams(@Nullable InputStream in, @Nullable OutputStream out) { - return new WrappedChannel(in, out); - } - - @NonNull - public static WrappedChannel ofSocket(@NonNull Socket s) throws IOException { - return new WrappedChannel(s); - } - - @Nullable - public static WrappedChannel withCompression(@NonNull WrappedChannel channel) { - return new WrappedChannel( - new InflaterInputStream(channel.rawIn), - CompatibilityUtils.createDeflaterOutputStream(channel.rawOut) - ); - } - - - public static WrappedChannel withSSL(@NonNull WrappedChannel channel, - @NonNull CertificateManager certificateManager, - @NonNull ServerAddress address, - @NonNull Consumer<X509Certificate[]> callback) throws GeneralSecurityException, IOException { - SSLContext context = SSLContext.getInstance("TLSv1.2"); - TrustManager[] managers = new TrustManager[]{QuasselTrustManager.fromDefault(certificateManager, address, callback)}; - context.init(null, managers, null); - SSLSocketFactory factory = context.getSocketFactory(); - SSLSocket socket = (SSLSocket) factory.createSocket(channel.socket, address.host, address.port, true); - socket.setUseClientMode(true); - socket.startHandshake(); - return WrappedChannel.ofSocket(socket); - } - - /** - * Reads a sequence of bytes from this channel into the given buffer. - * <p> - * <p> An attempt is made to read up to <i>r</i> bytes from the channel, - * where <i>r</i> is the number of bytes remaining in the buffer, that is, - * <tt>dst.remaining()</tt>, at the moment this method is invoked. - * <p> - * <p> Suppose that a byte sequence of length <i>n</i> is read, where - * <tt>0</tt> <tt><=</tt> <i>n</i> <tt><=</tt> <i>r</i>. - * This byte sequence will be transferred into the buffer so that the first - * byte in the sequence is at index <i>p</i> and the last byte is at index - * <i>p</i> <tt>+</tt> <i>n</i> <tt>-</tt> <tt>1</tt>, - * where <i>p</i> is the buffer's position at the moment this method is - * invoked. Upon return the buffer's position will be equal to - * <i>p</i> <tt>+</tt> <i>n</i>; its limit will not have changed. - * <p> - * <p> A read operation might not fill the buffer, and in fact it might not - * read any bytes at all. Whether or not it does so depends upon the - * nature and state of the channel. A socket channel in non-blocking mode, - * for example, cannot read any more bytes than are immediately available - * from the socket's input buffer; similarly, a file channel cannot read - * any more bytes than remain in the file. It is guaranteed, however, that - * if a channel is in blocking mode and there is at least one byte - * remaining in the buffer then this method will block until at least one - * byte is read. - * <p> - * <p> This method may be invoked at any time. If another thread has - * already initiated a read operation upon this channel, however, then an - * invocation of this method will block until the first operation is - * complete. </p> - * - * @param dst The buffer into which bytes are to be transferred - * @return The number of bytes read, possibly zero, or <tt>-1</tt> if the - * channel has reached end-of-stream - * @throws IOException If some other I/O Error occurs - */ - @Override - public int read(@NonNull ByteBuffer dst) throws IOException { - if (in == null) return 0; - - in.readFully(dst.array(), dst.arrayOffset(), dst.array().length - dst.arrayOffset()); - return dst.array().length; - } - - /** - * Writes a sequence of bytes to this channel from the given buffer. - * <p> - * <p> An attempt is made to write up to <i>r</i> bytes to the channel, - * where <i>r</i> is the number of bytes remaining in the buffer, that is, - * <tt>src.remaining()</tt>, at the moment this method is invoked. - * <p> - * <p> Suppose that a byte sequence of length <i>n</i> is written, where - * <tt>0</tt> <tt><=</tt> <i>n</i> <tt><=</tt> <i>r</i>. - * This byte sequence will be transferred from the buffer starting at index - * <i>p</i>, where <i>p</i> is the buffer's position at the moment this - * method is invoked; the index of the last byte written will be - * <i>p</i> <tt>+</tt> <i>n</i> <tt>-</tt> <tt>1</tt>. - * Upon return the buffer's position will be equal to - * <i>p</i> <tt>+</tt> <i>n</i>; its limit will not have changed. - * <p> - * <p> Unless otherwise specified, a write operation will return only after - * writing all of the <i>r</i> requested bytes. Some types of channels, - * depending upon their state, may write only some of the bytes or possibly - * none at all. A socket channel in non-blocking mode, for example, cannot - * write any more bytes than are free in the socket's output buffer. - * <p> - * <p> This method may be invoked at any time. If another thread has - * already initiated a write operation upon this channel, however, then an - * invocation of this method will block until the first operation is - * complete. </p> - * - * @param src The buffer from which bytes are to be retrieved - * @return The number of bytes written, possibly zero - * @throws IOException If some other I/O Error occurs - */ - @Override - public int write(@NonNull ByteBuffer src) throws IOException { - if (out == null) return 0; - - out.write(src.array(), src.arrayOffset(), src.array().length - src.arrayOffset()); - return src.array().length; - } - - /** - * Tells whether or not this channel is open. - * - * @return <tt>true</tt> if, and only if, this channel is open - */ - @Override - public boolean isOpen() { - return in != null || out != null; - } - - /** - * Closes this channel. - * <p> - * <p> After a channel is closed, any further attempt to invoke I/O - * operations upon it will cause a {@link ClosedChannelException} to be - * thrown. - * <p> - * <p> If this channel is already closed then invoking this method has no - * effect. - * <p> - * <p> This method may be invoked at any time. If some other thread has - * already invoked it, however, then another invocation will block until - * the first invocation is complete, after which it will return without - * effect. </p> - * - * @throws IOException If an I/O Error occurs - */ - @Override - public void close() throws IOException { - if (rawIn != null) rawIn.close(); - in = null; - if (rawOut != null) rawOut.close(); - out = null; - } - - /** - * Flushes this stream by writing any buffered output to the underlying - * stream. - * - * @throws IOException If an I/O Error occurs - */ - @Override - public void flush() throws IOException { - if (rawOut instanceof DeflaterOutputStream) rawOut.flush(); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/AutoScroller.java b/app/src/main/java/de/kuschku/util/observables/AutoScroller.java deleted file mode 100644 index 75db1aaf5..000000000 --- a/app/src/main/java/de/kuschku/util/observables/AutoScroller.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables; - -import android.support.annotation.NonNull; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; - -public class AutoScroller { - private final LinearLayoutManager manager; - - public AutoScroller(@NonNull RecyclerView recyclerView) { - this((LinearLayoutManager) recyclerView.getLayoutManager()); - } - - public AutoScroller(LinearLayoutManager manager) { - this.manager = manager; - } - - public void notifyScroll() { - if (manager.findFirstVisibleItemPosition() == 0) - manager.scrollToPosition(0); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/ContentComparable.java b/app/src/main/java/de/kuschku/util/observables/ContentComparable.java deleted file mode 100644 index 8ad75c784..000000000 --- a/app/src/main/java/de/kuschku/util/observables/ContentComparable.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables; - -import android.support.annotation.NonNull; - -public interface ContentComparable<T extends ContentComparable<T>> extends Comparable<T> { - boolean areItemsTheSame(@NonNull T other); - - boolean areContentsTheSame(@NonNull T other); -} diff --git a/app/src/main/java/de/kuschku/util/observables/IObservable.java b/app/src/main/java/de/kuschku/util/observables/IObservable.java deleted file mode 100644 index 3ac3faf3e..000000000 --- a/app/src/main/java/de/kuschku/util/observables/IObservable.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables; - -public interface IObservable<T> { - void addCallback(T callback); - - void removeCallback(T callback); - - void removeCallbacks(); -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/DrawerItemCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/DrawerItemCallback.java deleted file mode 100644 index 054c5d36d..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/DrawerItemCallback.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks; - -import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; - -public interface DrawerItemCallback { - void notifyChanged(IDrawerItem item); -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/ElementCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/ElementCallback.java deleted file mode 100644 index 20fcdfc69..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/ElementCallback.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks; - -import android.support.annotation.UiThread; - -public interface ElementCallback<T> { - @UiThread - void notifyItemInserted(T element); - - @UiThread - void notifyItemRemoved(T element); - - @UiThread - void notifyItemChanged(T element); -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralCallback.java deleted file mode 100644 index a88a725e5..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralCallback.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks; - -public interface GeneralCallback<T> { - void notifyChanged(T object); -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java b/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java deleted file mode 100644 index 79dcc78d7..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/GeneralObservable.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks; - -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.libquassel.syncables.types.interfaces.QObservable; - -public class GeneralObservable<T> implements QObservable<T>, GeneralCallback<T> { - final Set<GeneralCallback<T>> callbackSet = new HashSet<>(); - - @Override - public void addObserver(GeneralCallback<T> o) { - callbackSet.add(o); - } - - @Override - public void deleteObserver(GeneralCallback<T> o) { - callbackSet.remove(o); - } - - - @Override - public void notifyChanged(T object) { - for (GeneralCallback<T> callback : callbackSet) { - callback.notifyChanged(object); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/UICallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/UICallback.java deleted file mode 100644 index 19019a514..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/UICallback.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks; - -import android.support.annotation.UiThread; - -public interface UICallback { - @UiThread - void notifyItemInserted(int position); - - @UiThread - void notifyItemChanged(int position); - - @UiThread - void notifyItemRemoved(int position); - - @UiThread - void notifyItemMoved(int from, int to); - - @UiThread - void notifyItemRangeInserted(int position, int count); - - @UiThread - void notifyItemRangeChanged(int position, int count); - - @UiThread - void notifyItemRangeRemoved(int position, int count); -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/UIChildCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/UIChildCallback.java deleted file mode 100644 index e8a7901d7..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/UIChildCallback.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks; - -import android.support.annotation.UiThread; - -public interface UIChildCallback { - @UiThread - void notifyChildItemInserted(int group, int position); - - @UiThread - void notifyChildItemChanged(int group, int position); - - @UiThread - void notifyChildItemRemoved(int group, int position); -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/UIChildParentCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/UIChildParentCallback.java deleted file mode 100644 index 7c7f69add..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/UIChildParentCallback.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks; - -public interface UIChildParentCallback extends UIChildCallback, UIParentCallback { -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/UIParentCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/UIParentCallback.java deleted file mode 100644 index faecff3fd..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/UIParentCallback.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks; - -import android.support.annotation.UiThread; - -public interface UIParentCallback { - @UiThread - void notifyParentItemInserted(int position); - - @UiThread - void notifyParentItemRemoved(int position); - - @UiThread - void notifyParentItemChanged(int position); - - @UiThread - void notifyParentItemRangeInserted(int from, int to); -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/AdapterUICallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/AdapterUICallbackWrapper.java deleted file mode 100644 index db99f22f0..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/AdapterUICallbackWrapper.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.UiThread; -import android.support.v7.widget.RecyclerView; - -import de.kuschku.util.observables.AutoScroller; -import de.kuschku.util.observables.callbacks.UICallback; - -@UiThread -public class AdapterUICallbackWrapper implements UICallback { - @NonNull - private final RecyclerView.Adapter adapter; - - @Nullable - private final AutoScroller scroller; - - public AdapterUICallbackWrapper(@NonNull RecyclerView.Adapter adapter) { - this(adapter, null); - } - - public AdapterUICallbackWrapper(@NonNull RecyclerView.Adapter adapter, @Nullable AutoScroller scroller) { - this.adapter = adapter; - this.scroller = scroller; - } - - @Override - public void notifyItemInserted(int position) { - adapter.notifyItemInserted(position); - if (position == 0 && scroller != null) scroller.notifyScroll(); - } - - @Override - public void notifyItemChanged(int position) { - adapter.notifyItemChanged(position); - } - - @Override - public void notifyItemRemoved(int position) { - adapter.notifyItemRemoved(position); - } - - @Override - public void notifyItemMoved(int from, int to) { - adapter.notifyItemMoved(from, to); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - adapter.notifyItemRangeInserted(position, count); - if (position == 0 && scroller != null) scroller.notifyScroll(); - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - adapter.notifyItemRangeChanged(position, count); - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - adapter.notifyItemRangeRemoved(position, count); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/ChildUICallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/ChildUICallbackWrapper.java deleted file mode 100644 index 0590cee65..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/ChildUICallbackWrapper.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; -import android.support.annotation.UiThread; - -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.callbacks.UIChildCallback; - -@UiThread -public class ChildUICallbackWrapper implements UICallback { - @NonNull - private final UIChildCallback wrapped; - private int groupPosition; - - public ChildUICallbackWrapper(@NonNull UIChildCallback wrapped) { - this.wrapped = wrapped; - } - - public int getGroupPosition() { - return groupPosition; - } - - public void setGroupPosition(int groupPosition) { - this.groupPosition = groupPosition; - } - - @Override - public void notifyItemInserted(int position) { - wrapped.notifyChildItemInserted(groupPosition, position); - } - - @Override - public void notifyItemChanged(int position) { - wrapped.notifyChildItemChanged(groupPosition, position); - } - - @Override - public void notifyItemRemoved(int position) { - wrapped.notifyChildItemRemoved(groupPosition, position); - } - - @Override - public void notifyItemMoved(int from, int to) { - notifyItemRemoved(from); - notifyItemInserted(to); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - for (int i = position; i < position + count; i++) { - notifyItemInserted(i); - } - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - for (int i = position; i < position + count; i++) { - notifyItemChanged(i); - } - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - for (int i = position; i < position + count; i++) { - notifyItemRemoved(i); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralUICallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralUICallbackWrapper.java deleted file mode 100644 index 25fb58566..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/GeneralUICallbackWrapper.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import de.kuschku.util.observables.callbacks.UICallback; - -public abstract class GeneralUICallbackWrapper implements UICallback { - public abstract void notifyChanged(); - - @Override - public void notifyItemInserted(int position) { - notifyChanged(); - } - - @Override - public void notifyItemChanged(int position) { - notifyChanged(); - } - - @Override - public void notifyItemRemoved(int position) { - notifyChanged(); - } - - @Override - public void notifyItemMoved(int from, int to) { - notifyChanged(); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - notifyChanged(); - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - notifyChanged(); - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - notifyChanged(); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java deleted file mode 100644 index a47b30b37..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiDrawerItemCallback.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; - -import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import de.kuschku.util.observables.IObservable; -import de.kuschku.util.observables.callbacks.DrawerItemCallback; - -public class MultiDrawerItemCallback implements DrawerItemCallback, IObservable<DrawerItemCallback> { - @NonNull - final Set<DrawerItemCallback> callbacks; - - private MultiDrawerItemCallback(@NonNull List<DrawerItemCallback> multiGeneralCallbacks) { - this.callbacks = new HashSet<>(multiGeneralCallbacks); - } - - @NonNull - public static MultiDrawerItemCallback of(DrawerItemCallback... callbacks) { - return new MultiDrawerItemCallback(Arrays.asList(callbacks)); - } - - @Override - public void notifyChanged(IDrawerItem item) { - for (DrawerItemCallback callback : callbacks) { - callback.notifyChanged(item); - } - } - - @Override - public void addCallback(DrawerItemCallback callback) { - callbacks.add(callback); - } - - @Override - public void removeCallback(DrawerItemCallback callback) { - callbacks.remove(callback); - } - - @Override - public void removeCallbacks() { - callbacks.clear(); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java deleted file mode 100644 index 4d3e767bd..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiElementCallbackWrapper.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.UiThread; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.observables.callbacks.ElementCallback; - -@UiThread -public class MultiElementCallbackWrapper<T> implements ElementCallback<T> { - @NonNull - private final Set<ElementCallback<T>> callbacks = new HashSet<>(); - - private MultiElementCallbackWrapper(@NonNull Collection<ElementCallback<T>> callbacks) { - this.callbacks.addAll(callbacks); - } - - @SafeVarargs - @NonNull - public static <T> MultiElementCallbackWrapper<T> of(@NonNull ElementCallback<T>... callbacks) { - return new MultiElementCallbackWrapper<>(Arrays.asList(callbacks)); - } - - public void addCallback(@NonNull ElementCallback<T> callback) { - callbacks.add(callback); - } - - public void removeCallback(@NonNull ElementCallback<T> callback) { - callbacks.remove(callback); - } - - @Override - public void notifyItemInserted(@Nullable T element) { - for (ElementCallback<T> callback : callbacks) { - callback.notifyItemInserted(element); - } - } - - @Override - public void notifyItemRemoved(@Nullable T element) { - for (ElementCallback<T> callback : callbacks) { - callback.notifyItemRemoved(element); - } - } - - @Override - public void notifyItemChanged(@Nullable T element) { - for (ElementCallback<T> callback : callbacks) { - callback.notifyItemChanged(element); - } - } - - public void removeCallbacks() { - callbacks.clear(); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java deleted file mode 100644 index e631589c3..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiGeneralCallback.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import de.kuschku.util.observables.IObservable; -import de.kuschku.util.observables.callbacks.GeneralCallback; - -public class MultiGeneralCallback<T> implements IObservable<GeneralCallback<T>>, GeneralCallback<T> { - @NonNull - final Set<GeneralCallback<T>> callbacks; - - private MultiGeneralCallback(@NonNull List<MultiGeneralCallback<T>> multiGeneralCallbacks) { - this.callbacks = new HashSet<>(multiGeneralCallbacks); - } - - @SafeVarargs - @NonNull - public static <U> MultiGeneralCallback<U> of(MultiGeneralCallback<U>... callbacks) { - return new MultiGeneralCallback<>(Arrays.asList(callbacks)); - } - - @Override - public void notifyChanged(T obj) { - for (GeneralCallback<T> callback : callbacks) { - callback.notifyChanged(obj); - } - } - - @Override - public void addCallback(GeneralCallback<T> callback) { - callbacks.add(callback); - } - - @Override - public void removeCallback(GeneralCallback<T> callback) { - callbacks.remove(callback); - } - - @Override - public void removeCallbacks() { - callbacks.clear(); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUICallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUICallbackWrapper.java deleted file mode 100644 index acca32cb8..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUICallbackWrapper.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; -import android.support.annotation.UiThread; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.observables.callbacks.UICallback; - -@UiThread -public class MultiUICallbackWrapper implements UICallback { - @NonNull - private final Set<UICallback> callbacks = new HashSet<>(); - - private MultiUICallbackWrapper(@NonNull Collection<UICallback> callbacks) { - this.callbacks.addAll(callbacks); - } - - @NonNull - public static MultiUICallbackWrapper of(@NonNull UICallback... callbacks) { - return new MultiUICallbackWrapper(Arrays.asList(callbacks)); - } - - public void addCallback(@NonNull UICallback callback) { - callbacks.add(callback); - } - - public void removeCallback(@NonNull UICallback callback) { - callbacks.remove(callback); - } - - @Override - public void notifyItemInserted(int position) { - for (UICallback callback : callbacks) { - callback.notifyItemInserted(position); - } - } - - @Override - public void notifyItemChanged(int position) { - for (UICallback callback : callbacks) { - callback.notifyItemChanged(position); - } - } - - @Override - public void notifyItemRemoved(int position) { - for (UICallback callback : callbacks) { - callback.notifyItemRemoved(position); - } - } - - @Override - public void notifyItemMoved(int from, int to) { - for (UICallback callback : callbacks) { - callback.notifyItemMoved(from, to); - } - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - for (UICallback callback : callbacks) { - callback.notifyItemRangeInserted(position, count); - } - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - for (UICallback callback : callbacks) { - callback.notifyItemRangeChanged(position, count); - } - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - for (UICallback callback : callbacks) { - callback.notifyItemRangeRemoved(position, count); - } - } - - public void removeCallbacks() { - callbacks.clear(); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUIChildCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUIChildCallback.java deleted file mode 100644 index 939cf3180..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUIChildCallback.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; -import android.support.annotation.UiThread; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.observables.callbacks.UIChildCallback; - -@UiThread -public class MultiUIChildCallback implements UIChildCallback { - @NonNull - private final Set<UIChildCallback> callbacks = new HashSet<>(); - - private MultiUIChildCallback(@NonNull Collection<UIChildCallback> callbacks) { - this.callbacks.addAll(callbacks); - } - - @NonNull - public static MultiUIChildCallback of(@NonNull UIChildCallback... callbacks) { - return new MultiUIChildCallback(Arrays.asList(callbacks)); - } - - - public void addCallback(@NonNull UIChildCallback callback) { - this.callbacks.add(callback); - } - - public void removeCallback(@NonNull UIChildCallback callback) { - this.callbacks.remove(callback); - } - - @Override - public void notifyChildItemInserted(int group, int position) { - for (UIChildCallback callback : callbacks) - callback.notifyChildItemInserted(group, position); - } - - @Override - public void notifyChildItemChanged(int group, int position) { - for (UIChildCallback callback : callbacks) - callback.notifyChildItemChanged(group, position); - } - - @Override - public void notifyChildItemRemoved(int group, int position) { - for (UIChildCallback callback : callbacks) - callback.notifyChildItemRemoved(group, position); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUIChildParentCallback.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUIChildParentCallback.java deleted file mode 100644 index b5081813f..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/MultiUIChildParentCallback.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; -import android.support.annotation.UiThread; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import de.kuschku.util.observables.callbacks.UIChildParentCallback; - -@UiThread -public class MultiUIChildParentCallback implements UIChildParentCallback { - @NonNull - private final Set<UIChildParentCallback> callbacks = new HashSet<>(); - - private MultiUIChildParentCallback(@NonNull Collection<UIChildParentCallback> callbacks) { - this.callbacks.addAll(callbacks); - } - - @NonNull - public static MultiUIChildParentCallback of(@NonNull UIChildParentCallback... callbacks) { - return new MultiUIChildParentCallback(Arrays.asList(callbacks)); - } - - - public void addCallback(@NonNull UIChildParentCallback callback) { - this.callbacks.add(callback); - } - - public void removeCallback(@NonNull UIChildParentCallback callback) { - this.callbacks.remove(callback); - } - - @Override - public void notifyChildItemInserted(int group, int position) { - for (UIChildParentCallback callback : callbacks) - callback.notifyChildItemInserted(group, position); - } - - @Override - public void notifyChildItemChanged(int group, int position) { - for (UIChildParentCallback callback : callbacks) - callback.notifyChildItemChanged(group, position); - } - - @Override - public void notifyChildItemRemoved(int group, int position) { - for (UIChildParentCallback callback : callbacks) - callback.notifyChildItemRemoved(group, position); - } - - @Override - public void notifyParentItemInserted(int position) { - for (UIChildParentCallback callback : callbacks) - callback.notifyParentItemInserted(position); - } - - @Override - public void notifyParentItemRemoved(int position) { - for (UIChildParentCallback callback : callbacks) - callback.notifyParentItemRemoved(position); - } - - @Override - public void notifyParentItemChanged(int position) { - for (UIChildParentCallback callback : callbacks) - callback.notifyParentItemChanged(position); - } - - @Override - public void notifyParentItemRangeInserted(int from, int to) { - for (UIChildParentCallback callback : callbacks) - callback.notifyParentItemRangeInserted(from, to); - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/ParentUICallbackWrapper.java b/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/ParentUICallbackWrapper.java deleted file mode 100644 index 39bf33941..000000000 --- a/app/src/main/java/de/kuschku/util/observables/callbacks/wrappers/ParentUICallbackWrapper.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.callbacks.wrappers; - -import android.support.annotation.NonNull; -import android.support.annotation.UiThread; - -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.callbacks.UIParentCallback; - -@UiThread -public class ParentUICallbackWrapper implements UICallback { - @NonNull - private final UIParentCallback wrapped; - - public ParentUICallbackWrapper(@NonNull UIParentCallback wrapped) { - this.wrapped = wrapped; - } - - @Override - public void notifyItemInserted(int position) { - wrapped.notifyParentItemInserted(position); - } - - @Override - public void notifyItemChanged(int position) { - wrapped.notifyParentItemChanged(position); - } - - @Override - public void notifyItemRemoved(int position) { - wrapped.notifyParentItemRemoved(position); - } - - @Override - public void notifyItemMoved(int from, int to) { - notifyItemRemoved(from); - notifyItemInserted(to); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - for (int i = position; i < position + count; i++) { - notifyItemInserted(i); - } - } - - @Override - public void notifyItemRangeChanged(int position, int count) { - for (int i = position; i < position + count; i++) { - notifyItemChanged(i); - } - } - - @Override - public void notifyItemRangeRemoved(int position, int count) { - for (int i = position; i < position + count; i++) { - notifyItemRemoved(i); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/AndroidObservableComparableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/AndroidObservableComparableSortedList.java deleted file mode 100644 index 47adf2fde..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/AndroidObservableComparableSortedList.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import android.support.annotation.NonNull; - -import java.util.List; - -import de.kuschku.util.observables.ContentComparable; -import de.kuschku.util.observables.callbacks.UICallback; - -public class AndroidObservableComparableSortedList<T extends ContentComparable<T>> extends AndroidObservableSortedList<T> implements IObservableList<UICallback, T>, List<T> { - - - public AndroidObservableComparableSortedList(@NonNull Class<T> cl) { - super(cl, new SimpleItemComparator<>()); - } - - public AndroidObservableComparableSortedList(@NonNull Class<T> cl, boolean reverse) { - super(cl, new SimpleItemComparator<>(), reverse); - } - - public static class SimpleItemComparator<T extends ContentComparable<T>> implements ItemComparator<T> { - @Override - public int compare(@NonNull T o1, @NonNull T o2) { - return o1.compareTo(o2); - } - - @Override - public boolean areContentsTheSame(@NonNull T oldItem, @NonNull T newItem) { - return oldItem.areContentsTheSame(newItem); - } - - @Override - public boolean areItemsTheSame(@NonNull T item1, @NonNull T item2) { - return item1.areItemsTheSame(item2); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/AndroidObservableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/AndroidObservableSortedList.java deleted file mode 100644 index 95951037d..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/AndroidObservableSortedList.java +++ /dev/null @@ -1,372 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v7.util.SortedList; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; - -import de.kuschku.util.backports.Stream; -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.callbacks.wrappers.MultiUICallbackWrapper; - -import static de.kuschku.util.AndroidAssert.assertTrue; - -@SuppressWarnings("unchecked") -public class AndroidObservableSortedList<T> implements IObservableList<UICallback, T> { - @NonNull - private final SortedList<T> list; - private final boolean reverse; - - @NonNull - private final MultiUICallbackWrapper callback = MultiUICallbackWrapper.of(); - @NonNull - private ItemComparator<T> comparator; - - public AndroidObservableSortedList(@NonNull Class<T> cl, @NonNull ItemComparator<T> comparator) { - this(cl, comparator, false); - } - - public AndroidObservableSortedList(@NonNull Class<T> cl, @NonNull ItemComparator<T> comparator, boolean reverse) { - this.list = new SortedList<>(cl, new Callback()); - this.comparator = comparator; - this.reverse = reverse; - } - - @Override - public void addCallback(@NonNull UICallback callback) { - this.callback.addCallback(callback); - } - - @Override - public void removeCallback(@NonNull UICallback callback) { - this.callback.removeCallback(callback); - } - - @Override - public void removeCallbacks() { - callback.removeCallbacks(); - } - - public void setComparator(@NonNull ItemComparator<T> comparator) { - this.comparator = comparator; - } - - @Nullable - public T last() { - if (list.size() == 0) return null; - - return list.get(list.size() - 1); - } - - @Override - public void add(int location, T object) { - list.add(object); - } - - @Override - public boolean add(T object) { - list.add(object); - return true; - } - - @Override - public boolean addAll(int location, @NonNull Collection<? extends T> collection) { - list.addAll((Collection<T>) collection); - return true; - } - - @Override - public boolean addAll(@NonNull Collection<? extends T> collection) { - list.addAll((Collection<T>) collection); - return false; - } - - @Override - public void clear() { - list.clear(); - } - - @Override - public boolean contains(Object object) { - return indexOf(object) != SortedList.INVALID_POSITION; - } - - @Override - public boolean containsAll(@NonNull Collection<?> collection) { - return new Stream<>(collection).allMatch(this::contains); - } - - @Override - public T get(int location) { - return list.get(location); - } - - @Override - public int indexOf(Object object) { - return list.indexOf((T) object); - } - - @Override - public boolean isEmpty() { - return list.size() == 0; - } - - @NonNull - @Override - public Iterator<T> iterator() { - return new CallbackedSortedListIterator(); - } - - @Override - public int lastIndexOf(Object object) { - return indexOf(object); - } - - @NonNull - @Override - public ListIterator<T> listIterator() { - return new CallbackedSortedListIterator(); - } - - @NonNull - @Override - public ListIterator<T> listIterator(int location) { - return new CallbackedSortedListIterator(location); - } - - @Nullable - @Override - public T remove(int location) { - T item = list.get(location); - list.remove(item); - return item; - } - - @Override - public boolean remove(Object object) { - try { - list.remove((T) object); - return true; - } catch (ClassCastException e) { - return false; - } - } - - @Override - public boolean removeAll(@NonNull Collection<?> collection) { - boolean result = true; - for (Object o : collection) { - result &= remove(o); - } - return result; - } - - @Override - public boolean retainAll(@NonNull Collection<?> collection) { - return false; - } - - @Nullable - @Override - public T set(int location, T object) { - return null; - } - - @Override - public int size() { - return list.size(); - } - - @NonNull - @Override - public List<T> subList(int start, int end) { - assertTrue(start <= end); - assertTrue(start >= 0); - assertTrue(end <= list.size()); - - List<T> subList = new ArrayList<>(end - start); - for (int i = start; i < end; i++) { - subList.add(list.get(i)); - } - return subList; - } - - @NonNull - @Override - public Object[] toArray() { - Object[] array = new Object[list.size()]; - for (int i = 0; i < list.size(); i++) { - array[i] = list.get(i); - } - return array; - } - - @NonNull - @Override - public <T1> T1[] toArray(@NonNull T1[] a) { - try { - Object[] elements = toArray(); - if (a.length < elements.length) - // Make a new array of a's runtime type, but my contents: - return (T1[]) Arrays.copyOf(elements, elements.length, a.getClass()); - System.arraycopy(elements, 0, a, 0, elements.length); - if (a.length > elements.length) - a[elements.length] = null; - return a; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public void notifyItemChanged(int position) { - T obj = get(position); - list.recalculatePositionOfItemAt(position); - callback.notifyItemChanged(indexOf(obj)); - } - - @NonNull - @Override - public String toString() { - return Arrays.toString(toArray()); - } - - public interface ItemComparator<T> { - int compare(T o1, T o2); - - boolean areContentsTheSame(T oldItem, T newItem); - - boolean areItemsTheSame(T item1, T item2); - } - - class Callback extends SortedList.Callback<T> { - @Override - public int compare(T o1, T o2) { - return (reverse) ? comparator.compare(o2, o1) : comparator.compare(o1, o2); - } - - @Override - public void onInserted(int position, int count) { - if (count == 1) - callback.notifyItemInserted(position); - else - callback.notifyItemRangeInserted(position, count); - } - - @Override - public void onRemoved(int position, int count) { - if (count == 1) - callback.notifyItemRemoved(position); - else - callback.notifyItemRangeRemoved(position, count); - } - - @Override - public void onMoved(int fromPosition, int toPosition) { - callback.notifyItemMoved(fromPosition, toPosition); - } - - @Override - public void onChanged(int position, int count) { - if (count == 1) - callback.notifyItemChanged(position); - else - callback.notifyItemRangeChanged(position, count); - } - - @Override - public boolean areContentsTheSame(T oldItem, T newItem) { - return comparator.areContentsTheSame(oldItem, newItem); - } - - @Override - public boolean areItemsTheSame(T item1, T item2) { - return comparator.areItemsTheSame(item1, item2); - } - } - - class CallbackedSortedListIterator implements Iterator<T>, ListIterator<T> { - int position; - - public CallbackedSortedListIterator() { - this(0); - } - - public CallbackedSortedListIterator(int position) { - this.position = position; - } - - @Override - public void add(T object) { - list.add(object); - } - - @Override - public boolean hasNext() { - return position < list.size(); - } - - @Override - public boolean hasPrevious() { - return position >= 0; - } - - @Override - public T next() { - return list.get(position++); - } - - @Override - public int nextIndex() { - return position + 1; - } - - @Override - public T previous() { - return list.get(position--); - } - - @Override - public int previousIndex() { - return position - 1; - } - - @Override - public void remove() { - list.remove(list.get(position)); - callback.notifyItemRemoved(position); - } - - @Override - public void set(T object) { - list.remove(list.get(position)); - list.add(object); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ChildParentAndroidObservableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/ChildParentAndroidObservableSortedList.java deleted file mode 100644 index 5228011d2..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/ChildParentAndroidObservableSortedList.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import android.support.annotation.NonNull; - -import de.kuschku.util.observables.IObservable; -import de.kuschku.util.observables.callbacks.UIChildCallback; -import de.kuschku.util.observables.callbacks.UIChildParentCallback; -import de.kuschku.util.observables.callbacks.UIParentCallback; -import de.kuschku.util.observables.callbacks.wrappers.MultiUIChildParentCallback; -import de.kuschku.util.observables.callbacks.wrappers.ParentUICallbackWrapper; - -public class ChildParentAndroidObservableSortedList<T extends IObservable<UIChildCallback>> extends AndroidObservableSortedList<T> { - @NonNull - private final MultiUIChildParentCallback callback = MultiUIChildParentCallback.of(); - - public ChildParentAndroidObservableSortedList(@NonNull Class<T> cl, @NonNull ItemComparator<T> comparator) { - super(cl, comparator); - registerCallbacks(); - } - - public ChildParentAndroidObservableSortedList(@NonNull Class<T> cl, @NonNull ItemComparator<T> comparator, boolean reverse) { - super(cl, comparator, reverse); - registerCallbacks(); - } - - private void registerCallbacks() { - super.addCallback(new MyWrapper(callback)); - } - - public void addChildParentCallback(@NonNull UIChildParentCallback callback) { - this.callback.addCallback(callback); - } - - public void removeChildParentCallback(@NonNull UIChildParentCallback callback) { - this.callback.removeCallback(callback); - } - - private class MyWrapper extends ParentUICallbackWrapper { - public MyWrapper(@NonNull UIParentCallback wrapped) { - super(wrapped); - } - - @Override - public void notifyItemInserted(int position) { - super.notifyItemInserted(position); - get(position).addCallback(callback); - } - - @Override - public void notifyItemRangeInserted(int position, int count) { - super.notifyItemRangeInserted(position, count); - for (int i = position; i < position + count; i++) { - get(position).addCallback(callback); - } - } - - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/IObservableCollection.java b/app/src/main/java/de/kuschku/util/observables/lists/IObservableCollection.java deleted file mode 100644 index a40010034..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/IObservableCollection.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import android.support.annotation.NonNull; - -import java.util.Collection; -import java.util.Iterator; - -public interface IObservableCollection<E> extends Collection<E> { - @Override - boolean add(E object); - - @Override - boolean addAll(@NonNull Collection<? extends E> collection); - - @Override - void clear(); - - @Override - boolean contains(Object object); - - @Override - boolean containsAll(@NonNull Collection<?> collection); - - @Override - boolean isEmpty(); - - @NonNull - @Override - Iterator<E> iterator(); - - @Override - boolean remove(Object object); - - @Override - boolean removeAll(@NonNull Collection<?> collection); - - @Override - boolean retainAll(@NonNull Collection<?> collection); - - @Override - int size(); - - @NonNull - @Override - Object[] toArray(); - - @NonNull - @Override - <T> T[] toArray(@NonNull T[] array); -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/IObservableList.java b/app/src/main/java/de/kuschku/util/observables/lists/IObservableList.java deleted file mode 100644 index a26bf1236..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/IObservableList.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import java.util.List; - -import de.kuschku.util.observables.IObservable; - -public interface IObservableList<O, T> extends IObservable<O>, List<T> { -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/IObservableSet.java b/app/src/main/java/de/kuschku/util/observables/lists/IObservableSet.java deleted file mode 100644 index 6ee2a78be..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/IObservableSet.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import de.kuschku.util.observables.IObservable; - -public interface IObservableSet<O, T> extends IObservable<O>, IObservableCollection<T> { -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableComparableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableComparableSortedList.java deleted file mode 100644 index a241e1238..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableComparableSortedList.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import java.util.Comparator; - -import de.kuschku.util.observables.callbacks.UICallback; - -public class ObservableComparableSortedList<T extends Comparable<? super T>> extends ObservableSortedList<T> implements IObservableList<UICallback, T> { - public ObservableComparableSortedList() { - super(new ComparableComparator<>()); - } - - public ObservableComparableSortedList(int capacity) { - super(new ComparableComparator<>(), capacity); - } - - public static class ComparableComparator<T extends Comparable<? super T>> implements Comparator<T> { - @Override - public int compare(T o1, T o2) { - return o1.compareTo(o2); - } - } - - public static class ItemComparatorWrapper<T> implements Comparator<T> { - private final AndroidObservableSortedList.ItemComparator<T> itemComparator; - - public ItemComparatorWrapper(AndroidObservableSortedList.ItemComparator<T> itemComparator) { - this.itemComparator = itemComparator; - } - - @Override - public int compare(T o1, T o2) { - return itemComparator.compare(o1, o2); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableElement.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableElement.java deleted file mode 100644 index b7fc36aca..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableElement.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import de.kuschku.util.observables.IObservable; -import de.kuschku.util.observables.callbacks.GeneralCallback; -import de.kuschku.util.observables.callbacks.wrappers.MultiGeneralCallback; - -public class ObservableElement<T> implements IObservable<GeneralCallback<T>> { - private MultiGeneralCallback<T> callbacks = MultiGeneralCallback.of(); - - private T value; - - public ObservableElement(T value) { - this.value = value; - } - - public ObservableElement() { - this.value = null; - } - - @Override - public void addCallback(GeneralCallback<T> callback) { - callbacks.addCallback(callback); - } - - @Override - public void removeCallback(GeneralCallback<T> callback) { - callbacks.removeCallback(callback); - } - - @Override - public void removeCallbacks() { - callbacks.removeCallbacks(); - } - - public void set(T value) { - this.value = value; - } - - public T get() { - return this.value; - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java deleted file mode 100644 index dc45cae95..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableElementList.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; - -import de.kuschku.util.observables.callbacks.ElementCallback; -import de.kuschku.util.observables.callbacks.wrappers.MultiElementCallbackWrapper; - -@SuppressWarnings("unchecked") -public class ObservableElementList<T> extends ArrayList<T> implements IObservableList<ElementCallback<T>, T> { - @NonNull - private final MultiElementCallbackWrapper<T> callback = MultiElementCallbackWrapper.<T>of(); - - public ObservableElementList(int capacity) { - super(capacity); - } - - public ObservableElementList() { - super(); - } - - public ObservableElementList(@NonNull Collection<? extends T> collection) { - super(collection); - } - - public void addCallback(@NonNull ElementCallback<T> callback) { - this.callback.addCallback(callback); - } - - public void removeCallback(@NonNull ElementCallback<T> callback) { - this.callback.removeCallback(callback); - } - - @Override - public void removeCallbacks() { - callback.removeCallbacks(); - } - - private int getPosition() { - return isEmpty() ? 0 : size() - 1; - } - - @Override - public boolean add(T object) { - add(getPosition(), object); - return true; - } - - @Override - public void add(int index, T object) { - super.add(index, object); - callback.notifyItemInserted(object); - } - - @Override - public boolean addAll(@NonNull Collection<? extends T> collection) { - return addAll(getPosition(), collection); - } - - @Override - public boolean addAll(int index, @NonNull Collection<? extends T> collection) { - boolean result = super.addAll(index, collection); - if (result) - for (T element : collection) - callback.notifyItemInserted(element); - return result; - } - - @Override - public T remove(int index) { - T result = super.remove(index); - callback.notifyItemRemoved(result); - return result; - } - - @Override - public boolean remove(Object object) { - int position = indexOf(object); - if (position == -1) { - return false; - } else { - remove(position); - callback.notifyItemRemoved((T) object); - return true; - } - } - - @Override - protected void removeRange(int fromIndex, int toIndex) { - for (int i = fromIndex; i < toIndex; i++) { - remove(get(i)); - } - } - - @Override - public int indexOf(Object object) { - for (int i = 0; i < size(); i++) { - if (get(i) == object) return i; - } - return -1; - } - - @Override - public int lastIndexOf(Object object) { - for (int i = size() - 1; i >= 0; i--) { - if (get(i) == object) return i; - } - return -1; - } - - @NonNull - @Override - public Iterator<T> iterator() { - return new CallbackedArrayListIterator<>(super.iterator()); - } - - class CallbackedArrayListIterator<E> implements Iterator<E> { - final Iterator<E> iterator; - E current; - - public CallbackedArrayListIterator(Iterator<E> iterator) { - this.iterator = iterator; - } - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public E next() { - current = iterator.next(); - return current; - } - - @Override - public void remove() { - iterator.remove(); - callback.notifyItemRemoved((T) current); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableList.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableList.java deleted file mode 100644 index d11b28780..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableList.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; - -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.callbacks.wrappers.MultiUICallbackWrapper; - -public class ObservableList<T> extends ArrayList<T> implements IObservableList<UICallback, T> { - @NonNull - private final MultiUICallbackWrapper callback = MultiUICallbackWrapper.of(); - - public ObservableList() { - super(); - } - - public ObservableList(int capacity) { - super(capacity); - } - - public ObservableList(@NonNull Collection<? extends T> collection) { - super(collection); - } - - public void addCallback(@NonNull UICallback callback) { - this.callback.addCallback(callback); - } - - public void removeCallback(@NonNull UICallback callback) { - this.callback.removeCallback(callback); - } - - @Override - public void removeCallbacks() { - callback.removeCallbacks(); - } - - private int getPosition() { - return isEmpty() ? 0 : size() - 1; - } - - @Override - public boolean add(T object) { - add(getPosition(), object); - return true; - } - - @Override - public void add(int index, T object) { - super.add(index, object); - callback.notifyItemInserted(index); - } - - @Override - public boolean addAll(@NonNull Collection<? extends T> collection) { - return addAll(getPosition(), collection); - } - - @Override - public boolean addAll(int index, @NonNull Collection<? extends T> collection) { - boolean result = super.addAll(index, collection); - if (result) - callback.notifyItemRangeInserted(index, collection.size()); - return result; - } - - @Override - public T remove(int index) { - T result = super.remove(index); - callback.notifyItemRemoved(index); - return result; - } - - @Override - public boolean remove(Object object) { - int position = indexOf(object); - if (position == -1) { - return false; - } else { - remove(position); - return true; - } - } - - @Override - protected void removeRange(int fromIndex, int toIndex) { - super.removeRange(fromIndex, toIndex); - callback.notifyItemRangeRemoved(fromIndex, toIndex - fromIndex); - } - - @Override - public int indexOf(Object object) { - for (int i = 0; i < size(); i++) { - if (get(i) == object) return i; - } - return -1; - } - - @Override - public int lastIndexOf(Object object) { - for (int i = size() - 1; i >= 0; i--) { - if (get(i) == object) return i; - } - return -1; - } - - @Override - public void clear() { - int size = size(); - super.clear(); - callback.notifyItemRangeRemoved(0, size); - } - - @Override - public T set(int index, T element) { - T set = super.set(index, element); - callback.notifyItemChanged(index); - return set; - } - - @NonNull - @Override - public Iterator<T> iterator() { - return new CallbackedArrayListIterator<>(super.iterator()); - } - - class CallbackedArrayListIterator<E> implements Iterator<E> { - final Iterator<E> iterator; - int position = 0; - - public CallbackedArrayListIterator(Iterator<E> iterator) { - this.iterator = iterator; - } - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public E next() { - position++; - return iterator.next(); - } - - @Override - public void remove() { - iterator.remove(); - callback.notifyItemRemoved(position); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java deleted file mode 100644 index a0832a1fb..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSet.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; - -import de.kuschku.util.observables.callbacks.ElementCallback; -import de.kuschku.util.observables.callbacks.wrappers.MultiElementCallbackWrapper; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@SuppressWarnings("unchecked") -public class ObservableSet<T> extends HashSet<T> implements IObservableSet<ElementCallback<T>, T>, ElementCallback<T> { - @NonNull - private final MultiElementCallbackWrapper<T> callback = MultiElementCallbackWrapper.<T>of(); - - public ObservableSet(int capacity) { - super(capacity); - assertNotNull(this.callback); - } - - public ObservableSet() { - super(); - assertNotNull(this.callback); - } - - public ObservableSet(@NonNull Collection<? extends T> collection) { - assertNotNull(this.callback); - - assertNotNull(callback); - } - - public void addCallback(@NonNull ElementCallback<T> callback) { - assertNotNull(this.callback); - - this.callback.addCallback(callback); - } - - public void removeCallback(@NonNull ElementCallback<T> callback) { - assertNotNull(this.callback); - - this.callback.removeCallback(callback); - } - - @Override - public void removeCallbacks() { - callback.removeCallbacks(); - } - - @Override - public boolean add(T object) { - assertNotNull(this.callback); - - boolean result = super.add(object); - callback.notifyItemInserted(object); - return result; - } - - @Override - public boolean addAll(@NonNull Collection<? extends T> collection) { - assertNotNull(this.callback); - - boolean result = super.addAll(collection); - if (result) - for (T element : collection) - callback.notifyItemInserted(element); - return result; - } - - @Override - public boolean remove(@Nullable Object object) { - assertNotNull(this.callback); - - boolean contains = contains(object); - if (contains && object != null) { - super.remove(object); - callback.notifyItemRemoved((T) object); - return true; - } else { - return false; - } - } - - @NonNull - @Override - public Iterator<T> iterator() { - return new CallbackedArrayListIterator<>(super.iterator()); - } - - @Override - public void notifyItemInserted(T element) { - callback.notifyItemInserted(element); - } - - @Override - public void notifyItemRemoved(T element) { - callback.notifyItemRemoved(element); - } - - @Override - public void notifyItemChanged(T element) { - callback.notifyItemChanged(element); - } - - class CallbackedArrayListIterator<E> implements Iterator<E> { - final Iterator<E> iterator; - E current; - - public CallbackedArrayListIterator(Iterator<E> iterator) { - this.iterator = iterator; - } - - @Override - public boolean hasNext() { - assertNotNull(iterator); - return iterator.hasNext(); - } - - @Nullable - @Override - public E next() { - assertNotNull(iterator); - current = iterator.next(); - return current; - } - - @Override - public void remove() { - assertNotNull(callback); - assertNotNull(iterator); - - iterator.remove(); - callback.notifyItemRemoved((T) current); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java b/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java deleted file mode 100644 index 04eceab95..000000000 --- a/app/src/main/java/de/kuschku/util/observables/lists/ObservableSortedList.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.observables.lists; - -import android.support.annotation.NonNull; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; - -import de.kuschku.util.observables.callbacks.UICallback; -import de.kuschku.util.observables.callbacks.wrappers.MultiUICallbackWrapper; - -public class ObservableSortedList<T> extends ArrayList<T> implements IObservableList<UICallback, T> { - @NonNull - private final MultiUICallbackWrapper callback = MultiUICallbackWrapper.of(); - - private final Comparator<T> comparator; - - public ObservableSortedList(Comparator<T> comparator) { - super(); - this.comparator = comparator; - } - - public ObservableSortedList(Comparator<T> comparator, int capacity) { - super(capacity); - this.comparator = comparator; - } - - public ObservableSortedList(AndroidObservableSortedList.ItemComparator<T> itemComparator) { - this.comparator = new ObservableComparableSortedList.ItemComparatorWrapper<>(itemComparator); - } - - public void addCallback(@NonNull UICallback callback) { - this.callback.addCallback(callback); - } - - public void removeCallback(@NonNull UICallback callback) { - this.callback.removeCallback(callback); - } - - @Override - public void removeCallbacks() { - callback.removeCallbacks(); - } - - private int getPosition(T key) { - int low = 0; - int high = size() - 1; - - while (low <= high) { - int mid = (low + high) >>> 1; - T midVal = get(mid); - int cmp = comparator.compare(midVal, key); - - if (cmp < 0) - low = mid + 1; - else if (cmp > 0) - high = mid - 1; - else - return -1; // key found - } - return low; // key not found - } - - @Override - public boolean add(T object) { - int position = addInternal(object); - callback.notifyItemInserted(indexOf(object)); - return position != -1; - } - - public int addInternal(T object) { - int position = getPosition(object); - if (position != -1) super.add(position, object); - return position; - } - - @Override - public void add(int index, T object) { - add(object); - } - - @Override - public boolean addAll(@NonNull Collection<? extends T> collection) { - boolean addedAny = false; - for (T t : collection) { - addedAny |= add(t); - } - return addedAny; - } - - @Override - public boolean addAll(int index, @NonNull Collection<? extends T> collection) { - return addAll(collection); - } - - @Override - public T remove(int index) { - T result = super.remove(index); - callback.notifyItemRemoved(index); - return result; - } - - @Override - public boolean remove(Object object) { - int position = super.indexOf(object); - if (position == -1) { - return false; - } else { - remove(position); - return true; - } - } - - @Override - protected void removeRange(int fromIndex, int toIndex) { - super.removeRange(fromIndex, toIndex); - callback.notifyItemRangeRemoved(fromIndex, toIndex - fromIndex); - } - - @Override - public int indexOf(Object object) { - return Collections.binarySearch(this, (T) object, comparator); - } - - @Override - public int lastIndexOf(Object object) { - return Collections.binarySearch(this, (T) object, comparator); - } - - @Override - public void clear() { - int size = size(); - super.clear(); - callback.notifyItemRangeRemoved(0, size); - } - - @Override - public T set(int index, T element) { - T set = super.set(index, element); - notifyItemChanged(element); - callback.notifyItemChanged(index); - return set; - } - - public void notifyItemChanged(T element) { - int index = super.indexOf(element); - super.remove(index); - int position = getPosition(element); - if (position != index) { - callback.notifyItemRemoved(index); - add(position, element); - } else { - super.add(index, element); - callback.notifyItemChanged(index); - } - } - - @NonNull - @Override - public Iterator<T> iterator() { - return new CallbackedArrayListIterator<>(super.iterator()); - } - - class CallbackedArrayListIterator<E> implements Iterator<E> { - final Iterator<E> iterator; - int position = 0; - - public CallbackedArrayListIterator(Iterator<E> iterator) { - this.iterator = iterator; - } - - @Override - public boolean hasNext() { - return iterator.hasNext(); - } - - @Override - public E next() { - position++; - return iterator.next(); - } - - @Override - public void remove() { - iterator.remove(); - callback.notifyItemRemoved(position); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java b/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java deleted file mode 100644 index 3553577e8..000000000 --- a/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.preferences; - -import android.content.SharedPreferences; - -import java.util.HashSet; -import java.util.Set; - -public abstract class AbstractPreferenceElement<T> implements PreferenceElement<T>, OnChangeListener<T> { - protected final SharedPreferences pref; - protected final String key; - protected final T defValue; - private final Set<OnChangeListener<T>> listeners = new HashSet<>(); - protected SharedPreferences.Editor edit; - - public AbstractPreferenceElement(SharedPreferences pref, String key, T defValue) { - this.pref = pref; - this.key = key; - this.defValue = defValue; - } - - public void change() { - change(get()); - } - - public void change(T value) { - for (OnChangeListener<T> listener : listeners) - listener.change(value); - } - - public void addChangeListener(OnChangeListener<T> listener) { - listeners.add(listener); - } - - public void removeChangeListener(OnChangeListener<T> listener) { - listeners.remove(listener); - } - - protected abstract void put(T value); - - public void batch(SharedPreferences.Editor edit) { - if (this.edit != null) this.edit.commit(); - this.edit = edit; - } - - public T get() { - return or(defValue); - } - - public void set(T value) { - edit = pref.edit(); - put(value); - edit.commit(); - } -} diff --git a/app/src/main/java/de/kuschku/util/preferences/BooleanPreference.java b/app/src/main/java/de/kuschku/util/preferences/BooleanPreference.java deleted file mode 100644 index 1b6f77a38..000000000 --- a/app/src/main/java/de/kuschku/util/preferences/BooleanPreference.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.preferences; - -import android.content.SharedPreferences; - -public class BooleanPreference extends AbstractPreferenceElement<Boolean> { - public BooleanPreference(SharedPreferences pref, String key, Boolean init) { - super(pref, key, init); - } - - @Override - protected void put(Boolean value) { - edit.putBoolean(key, value); - } - - @Override - public Boolean or(Boolean defValue) { - return pref.getBoolean(key, defValue); - } -} diff --git a/app/src/main/java/de/kuschku/util/preferences/FloatPreference.java b/app/src/main/java/de/kuschku/util/preferences/FloatPreference.java deleted file mode 100644 index 81c93ba5a..000000000 --- a/app/src/main/java/de/kuschku/util/preferences/FloatPreference.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.preferences; - -import android.content.SharedPreferences; - -public class FloatPreference extends AbstractPreferenceElement<Float> { - public FloatPreference(SharedPreferences pref, String key, Float init) { - super(pref, key, init); - } - - @Override - protected void put(Float value) { - edit.putFloat(key, value); - } - - @Override - public Float or(Float defValue) { - return pref.getFloat(key, defValue); - } -} diff --git a/app/src/main/java/de/kuschku/util/preferences/IntPreference.java b/app/src/main/java/de/kuschku/util/preferences/IntPreference.java deleted file mode 100644 index 7032bfbaf..000000000 --- a/app/src/main/java/de/kuschku/util/preferences/IntPreference.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.preferences; - -import android.content.SharedPreferences; - -public class IntPreference extends AbstractPreferenceElement<Integer> { - public IntPreference(SharedPreferences pref, String key, Integer defValue) { - super(pref, key, defValue); - } - - @Override - protected void put(Integer value) { - edit.putInt(key, value); - } - - @Override - public Integer or(Integer defValue) { - return pref.getInt(key, defValue); - } -} diff --git a/app/src/main/java/de/kuschku/util/preferences/LongPreference.java b/app/src/main/java/de/kuschku/util/preferences/LongPreference.java deleted file mode 100644 index 0b0d14b80..000000000 --- a/app/src/main/java/de/kuschku/util/preferences/LongPreference.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.preferences; - -import android.content.SharedPreferences; - -public class LongPreference extends AbstractPreferenceElement<Long> { - public LongPreference(SharedPreferences pref, String key, Long defValue) { - super(pref, key, defValue); - } - - @Override - protected void put(Long value) { - edit.putLong(key, value); - } - - @Override - public Long or(Long defValue) { - return pref.getLong(key, defValue); - } -} diff --git a/app/src/main/java/de/kuschku/util/preferences/OnChangeListener.java b/app/src/main/java/de/kuschku/util/preferences/OnChangeListener.java deleted file mode 100644 index 743cec657..000000000 --- a/app/src/main/java/de/kuschku/util/preferences/OnChangeListener.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.preferences; - -public interface OnChangeListener<T> { - void change(T value); -} diff --git a/app/src/main/java/de/kuschku/util/preferences/PreferenceElement.java b/app/src/main/java/de/kuschku/util/preferences/PreferenceElement.java deleted file mode 100644 index 2ad588e3d..000000000 --- a/app/src/main/java/de/kuschku/util/preferences/PreferenceElement.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.preferences; - -public interface PreferenceElement<T> { - void addChangeListener(OnChangeListener<T> listener); - - void removeChangeListener(OnChangeListener<T> listener); - - T get(); - - T or(T otherwise); - - void set(T value); -} diff --git a/app/src/main/java/de/kuschku/util/preferences/StringPreference.java b/app/src/main/java/de/kuschku/util/preferences/StringPreference.java deleted file mode 100644 index 67a802c0e..000000000 --- a/app/src/main/java/de/kuschku/util/preferences/StringPreference.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.preferences; - -import android.content.SharedPreferences; - -public class StringPreference extends AbstractPreferenceElement<String> { - public StringPreference(SharedPreferences pref, String key, String init) { - super(pref, key, init); - } - - @Override - protected void put(String value) { - edit.putString(key, value); - } - - @Override - public String or(String defValue) { - return pref.getString(key, defValue); - } -} diff --git a/app/src/main/java/de/kuschku/util/regex/GlobTransformer.java b/app/src/main/java/de/kuschku/util/regex/GlobTransformer.java deleted file mode 100644 index 043895bed..000000000 --- a/app/src/main/java/de/kuschku/util/regex/GlobTransformer.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.regex; - -import android.support.annotation.NonNull; - -public class GlobTransformer { - private GlobTransformer() { - - } - - /** - * Converts a standard POSIX Shell globbing pattern into a regular expression - * pattern. The result can be used with the standard {@link java.util.regex} API to - * recognize strings which match the glob pattern. - * <p> - * See also, the POSIX Shell language: - * http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_13_01 - * - * @param pattern A glob pattern. - * @return A regex pattern to recognize the given glob pattern. - */ - public static String convertGlobToRegex(@NonNull String pattern) { - StringBuilder sb = new StringBuilder(pattern.length()); - int inGroup = 0; - int inClass = 0; - int firstIndexInClass = -1; - char[] arr = pattern.toCharArray(); - for (int i = 0; i < arr.length; i++) { - char ch = arr[i]; - switch (ch) { - case '\\': - if (++i >= arr.length) { - sb.append('\\'); - } else { - char next = arr[i]; - switch (next) { - case ',': - // escape not needed - break; - case 'Q': - case 'E': - // extra escape needed - sb.append('\\'); - default: - sb.append('\\'); - } - sb.append(next); - } - break; - case '*': - if (inClass == 0) - sb.append(".*"); - else - sb.append('*'); - break; - case '?': - if (inClass == 0) - sb.append('.'); - else - sb.append('?'); - break; - case '[': - inClass++; - firstIndexInClass = i + 1; - sb.append('['); - break; - case ']': - inClass--; - sb.append(']'); - break; - case '.': - case '(': - case ')': - case '+': - case '|': - case '^': - case '$': - case '@': - case '%': - if (inClass == 0 || (firstIndexInClass == i && ch == '^')) - sb.append('\\'); - sb.append(ch); - break; - case '!': - if (firstIndexInClass == i) - sb.append('^'); - else - sb.append('!'); - break; - case '{': - inGroup++; - sb.append('('); - break; - case '}': - inGroup--; - sb.append(')'); - break; - case ',': - if (inGroup > 0) - sb.append('|'); - else - sb.append(','); - break; - default: - sb.append(ch); - } - } - return sb.toString(); - } -} diff --git a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java deleted file mode 100644 index 21a79ba11..000000000 --- a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.regex; - -import android.support.annotation.NonNull; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - - -public class SmartRegEx { - @NonNull - private final Pattern pattern; - @NonNull - private final String rule; - - public SmartRegEx(@NonNull String rule, int flags, @NonNull Syntax syntax) { - this.pattern = fromSyntax(syntax, rule, flags); - this.rule = rule; - } - - @NonNull - public String rule() { - return rule; - } - - public boolean matches(@NonNull String text, boolean inexact) { - Matcher matcher = pattern.matcher(text); - if (inexact) { - return matcher.find(); - } else { - return matcher.matches(); - } - } - - private Pattern fromSyntax(@NonNull Syntax syntax, @NonNull String rule, int flags) { - switch (syntax) { - case WILDCARD: - return transformWildcard(rule, flags); - case REGEX: - default: - return Pattern.compile(rule, flags); - } - } - - private Pattern transformWildcard(@NonNull String glob, int flags) { - return Pattern.compile(GlobTransformer.convertGlobToRegex(glob), flags); - } - - @Override - public String toString() { - return rule; - } - - public enum Syntax { - WILDCARD, - REGEX - } -} diff --git a/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java b/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java deleted file mode 100644 index e9ee18ee2..000000000 --- a/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.servicebound; - -import android.content.ComponentName; -import android.content.ServiceConnection; -import android.os.Bundle; -import android.os.IBinder; -import android.support.annotation.Nullable; -import android.support.annotation.StyleRes; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.app.AppCompatDelegate; -import android.view.Menu; - -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.libquassel.events.ConnectionChangeEvent; -import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; -import de.kuschku.quasseldroid_ng.service.QuasselService; -import de.kuschku.quasseldroid_ng.ui.chat.util.ServiceHelper; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.quasseldroid_ng.ui.theme.AppTheme; -import de.kuschku.util.accounts.Account; -import de.kuschku.util.annotationbind.AutoBinder; -import de.kuschku.util.backports.Consumer; -import de.kuschku.util.ui.MenuTint; - -public abstract class BoundActivity extends AppCompatActivity { - static { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - } - - protected final AppContext context = new AppContext(); - protected QuasselService.LocalBinder binder; - private Consumer<ClientBackgroundThread> consumer = BoundActivity.this::onConnectToThread; - private final ServiceConnection connection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - if (service instanceof QuasselService.LocalBinder) { - binder = (QuasselService.LocalBinder) service; - binder.addCallback(consumer); - onConnectToThread(binder.getBackgroundThread()); - } - } - - @Override - public void onServiceDisconnected(ComponentName name) { - binder = null; - onConnectToThread(null); - } - }; - @StyleRes - private int themeId; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - themeId = ServiceHelper.initContext(context, this); - super.onCreate(savedInstanceState); - context.settings().preferenceTheme.addChangeListener(s -> recreate()); - ServiceHelper.startServiceIfNotRunning(this); - ServiceHelper.connectToService(this, connection); - } - - @Override - protected void onStart() { - super.onStart(); - ServiceHelper.connectToService(this, connection); - if (themeId != AppTheme.themeFromString(context.settings().preferenceTheme.get()).themeId) { - finish(); - startActivity(getIntent()); - } - } - - @Override - protected void onStop() { - super.onStop(); - binder.removeCallback(consumer); - setProvider(null); - ServiceHelper.disconnect(this, connection); - } - - protected void connectToServer(Account account) { - BusProvider provider = new BusProvider(); - binder.startBackgroundThread(provider, account); - } - - protected void onConnectToThread(@Nullable ClientBackgroundThread thread) { - if (thread == null) { - context.withClient(null); - setProvider(null); - } else { - context.withClient(thread.client().client); - setProvider(thread.client().provider); - } - } - - protected void setProvider(BusProvider provider) { - BusProvider oldProvider = context.provider(); - if (oldProvider != null) - oldProvider.event.unregister(this); - context.withProvider(provider); - if (provider != null) - provider.event.register(this); - } - - protected void onConnected() { - } - - protected void onDisconnected() { - } - - @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) - public void onConnectionStatusChange(ConnectionChangeEvent event) { - if (event.status == ConnectionChangeEvent.Status.CONNECTED) - onConnected(); - if (event.status == ConnectionChangeEvent.Status.DISCONNECTED) - onDisconnected(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean value = super.onCreateOptionsMenu(menu); - MenuTint.colorIcons(this, menu, AutoBinder.obtainColor(R.attr.colorFill, getSupportActionBar().getThemedContext().getTheme())); - return value; - } - - protected void stopConnection() { - if (binder != null) { - binder.stopBackgroundThread(); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java b/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java deleted file mode 100644 index c71ac1081..000000000 --- a/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.servicebound; - -import android.content.ComponentName; -import android.content.ServiceConnection; -import android.os.Bundle; -import android.os.IBinder; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; - -import de.kuschku.libquassel.BusProvider; -import de.kuschku.quasseldroid_ng.service.ClientBackgroundThread; -import de.kuschku.quasseldroid_ng.service.QuasselService; -import de.kuschku.quasseldroid_ng.ui.chat.util.ServiceHelper; -import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.util.accounts.Account; -import de.kuschku.util.backports.Consumer; - -public abstract class BoundFragment extends Fragment { - protected final AppContext context = new AppContext(); - private QuasselService.LocalBinder binder; - private Consumer<ClientBackgroundThread> consumer; - private final ServiceConnection connection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - if (service instanceof QuasselService.LocalBinder) { - binder = (QuasselService.LocalBinder) service; - consumer = BoundFragment.this::onConnectToThread; - binder.addCallback(consumer); - onConnectToThread(binder.getBackgroundThread()); - } - } - - @Override - public void onServiceDisconnected(ComponentName name) { - binder = null; - onConnectToThread(null); - } - }; - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - ServiceHelper.initContext(context, getActivity()); - super.onCreate(savedInstanceState); - ServiceHelper.startServiceIfNotRunning(getContext()); - } - - @Override - public void onStart() { - super.onStart(); - ServiceHelper.connectToService(getContext(), connection); - } - - protected void connectToServer(Account account) { - BusProvider provider = new BusProvider(); - binder.startBackgroundThread(provider, account); - } - - @Override - public void onStop() { - super.onStop(); - if (binder != null) - binder.removeCallback(consumer); - ServiceHelper.disconnect(getContext(), connection); - } - - protected void onConnectToThread(@Nullable ClientBackgroundThread thread) { - if (thread == null) { - context.withClient(null); - setProvider(null); - } else { - context.withClient(thread.client().client); - setProvider(thread.client().provider); - } - } - - protected void setProvider(BusProvider provider) { - BusProvider oldProvider = context.provider(); - if (oldProvider != null) - oldProvider.event.unregister(this); - if (provider != null) - provider.event.register(this); - context.withProvider(provider); - } - - protected void stopConnection() { - if (binder != null) { - binder.stopBackgroundThread(); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/AnimationHelper.java b/app/src/main/java/de/kuschku/util/ui/AnimationHelper.java deleted file mode 100644 index 8e68b3dfd..000000000 --- a/app/src/main/java/de/kuschku/util/ui/AnimationHelper.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui; - -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.Animation; -import android.view.animation.Transformation; - -public class AnimationHelper { - public static void expand(final ViewGroup v) { - v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - final int targetHeight = v.getMeasuredHeight(); - - // Older versions of android (pre API 21) cancel animations for views with a height of 0. - v.getLayoutParams().height = 1; - v.setVisibility(View.VISIBLE); - Animation a = new Animation() { - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - v.getLayoutParams().height = interpolatedTime == 1 - ? ViewGroup.LayoutParams.WRAP_CONTENT - : (int) (targetHeight * interpolatedTime); - v.setAlpha(interpolatedTime); - v.requestLayout(); - } - - @Override - public boolean willChangeBounds() { - return true; - } - }; - - // 1dp/ms - a.setDuration((int) (targetHeight / v.getContext().getResources().getDisplayMetrics().density)); - v.startAnimation(a); - } - - public static void collapse(final ViewGroup v) { - final int initialHeight = v.getMeasuredHeight(); - - Animation a = new Animation() { - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - if (interpolatedTime == 1) { - v.setVisibility(View.GONE); - } else { - v.getLayoutParams().height = initialHeight - (int) (initialHeight * interpolatedTime); - v.setAlpha(1 - interpolatedTime); - v.requestLayout(); - } - } - - @Override - public boolean willChangeBounds() { - return true; - } - }; - - a.setDuration((int) (initialHeight / v.getContext().getResources().getDisplayMetrics().density)); - v.startAnimation(a); - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/Bindable.java b/app/src/main/java/de/kuschku/util/ui/Bindable.java deleted file mode 100644 index 0413716cc..000000000 --- a/app/src/main/java/de/kuschku/util/ui/Bindable.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui; - -public interface Bindable<T> { - void bind(T t); -} diff --git a/app/src/main/java/de/kuschku/util/ui/DateTimeFormatHelper.java b/app/src/main/java/de/kuschku/util/ui/DateTimeFormatHelper.java deleted file mode 100644 index de953169b..000000000 --- a/app/src/main/java/de/kuschku/util/ui/DateTimeFormatHelper.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui; - -import android.content.Context; -import android.support.annotation.NonNull; - -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; - -import java.text.SimpleDateFormat; - -public class DateTimeFormatHelper { - @NonNull - private final Context context; - - public DateTimeFormatHelper(@NonNull Context context) { - this.context = context; - } - - @NonNull - public static DateTimeFormatter getTimeFormatter(Context ctx) { - return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getTimeFormat(ctx)).toLocalizedPattern()); - } - - @NonNull - public static DateTimeFormatter getDateFormatter(Context ctx) { - return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getDateFormat(ctx)).toLocalizedPattern()); - } - - @NonNull - public static DateTimeFormatter getLongDateFormatter(Context ctx) { - return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getLongDateFormat(ctx)).toLocalizedPattern()); - } - - @NonNull - public static DateTimeFormatter getMediumDateFormatter(Context ctx) { - return DateTimeFormat.forPattern(((SimpleDateFormat) android.text.format.DateFormat.getMediumDateFormat(ctx)).toLocalizedPattern()); - } - - @NonNull - public DateTimeFormatter getTimeFormatter() { - return getTimeFormatter(context); - } - - @NonNull - public DateTimeFormatter getDateFormatter() { - return getDateFormatter(context); - } - - @NonNull - public DateTimeFormatter getLongDateFormatter() { - return getLongDateFormatter(context); - } - - @NonNull - public DateTimeFormatter getMediumDateFormatter() { - return getMediumDateFormatter(context); - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/DividerItemDecoration.java b/app/src/main/java/de/kuschku/util/ui/DividerItemDecoration.java deleted file mode 100644 index d5843ab2b..000000000 --- a/app/src/main/java/de/kuschku/util/ui/DividerItemDecoration.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.support.v4.content.ContextCompat; -import android.support.v7.widget.RecyclerView; -import android.view.View; - -public class DividerItemDecoration extends RecyclerView.ItemDecoration { - - private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; - - private Drawable mDivider; - - /** - * Default divider will be used - */ - public DividerItemDecoration(Context context) { - final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS); - mDivider = styledAttributes.getDrawable(0); - styledAttributes.recycle(); - } - - /** - * Custom divider will be used - */ - public DividerItemDecoration(Context context, int resId) { - mDivider = ContextCompat.getDrawable(context, resId); - } - - @Override - public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { - int left = parent.getPaddingLeft(); - int right = parent.getWidth() - parent.getPaddingRight(); - - int childCount = parent.getChildCount(); - for (int i = 0; i < childCount; i++) { - View child = parent.getChildAt(i); - - RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); - - int top = child.getBottom() + params.bottomMargin; - int bottom = top + mDivider.getIntrinsicHeight(); - - mDivider.setBounds(left, top, right, bottom); - mDivider.draw(c); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/de/kuschku/util/ui/MaterialActionBarDrawerToggle.java b/app/src/main/java/de/kuschku/util/ui/MaterialActionBarDrawerToggle.java deleted file mode 100644 index b6de73bc0..000000000 --- a/app/src/main/java/de/kuschku/util/ui/MaterialActionBarDrawerToggle.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui; - -import android.app.Activity; -import android.support.annotation.StringRes; -import android.support.annotation.UiThread; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBarDrawerToggle; -import android.support.v7.widget.Toolbar; -import android.view.View; - -@UiThread -public class MaterialActionBarDrawerToggle extends ActionBarDrawerToggle { - public MaterialActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, - Toolbar toolbar, @StringRes int openDrawerContentDescRes, - @StringRes int closeDrawerContentDescRes) { - super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes); - } - - @Override - public void onDrawerSlide(View drawerView, float slideOffset) { - super.onDrawerSlide(drawerView, 0); - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/MenuTint.java b/app/src/main/java/de/kuschku/util/ui/MenuTint.java deleted file mode 100644 index b0251eb33..000000000 --- a/app/src/main/java/de/kuschku/util/ui/MenuTint.java +++ /dev/null @@ -1,622 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* - * Copyright (C) 2015. Jared Rummler <jared.rummler@gmail.com> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package de.kuschku.util.ui; - -import android.app.Activity; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.support.v4.view.MenuItemCompat; -import android.support.v7.view.menu.MenuItemImpl; -import android.support.v7.widget.ActionMenuView; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MenuItem.OnActionExpandListener; -import android.view.SubMenu; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.SearchView; - -import java.lang.reflect.Method; - -/** - * <p>Apply colors and/or transparency to menu icons in a {@link Menu}.</p> - * <p> - * <p>Example usage:</p> - * <p> - * <pre class="prettyprint"> - * public boolean onCreateOptionsMenu(Menu menu) { - * ... - * int color = getResources().getColor(R.color.your_awesome_color); - * int alpha = 204; // 80% transparency - * MenuTint.on(menu).setMenuItemIconColor(color).setMenuItemIconAlpha(alpha).apply(this); - * ... - * } - * </pre> - */ -public class MenuTint { - - private static final String TAG = "MenuTint"; - - private static Method nativeIsActionButton; - private final Menu menu; - private final Integer originalMenuItemIconColor; - private final Integer menuItemIconAlpha; - private final Integer subMenuIconColor; - private final Integer subMenuIconAlpha; - private final Integer overflowDrawableId; - private final boolean reApplyOnChange; - private final boolean forceIcons; - private Integer menuItemIconColor; - private ImageView overflowButton; - private ViewGroup actionBarView; - - private MenuTint(Builder builder) { - menu = builder.menu; - originalMenuItemIconColor = builder.originalMenuItemIconColor; - menuItemIconColor = builder.menuItemIconColor; - menuItemIconAlpha = builder.menuItemIconAlpha; - subMenuIconColor = builder.subMenuIconColor; - subMenuIconAlpha = builder.subMenuIconAlpha; - overflowDrawableId = builder.overflowDrawableId; - reApplyOnChange = builder.reApplyOnChange; - forceIcons = builder.forceIcons; - } - - /** - * Check if an item is showing (not in the overflow menu). - * - * @param item the MenuItem. - * @return {@code true} if the MenuItem is visible on the ActionBar. - */ - public static boolean isActionButton(MenuItem item) { - if (item instanceof MenuItemImpl) { - return ((MenuItemImpl) item).isActionButton(); - } - if (nativeIsActionButton == null) { - try { - Class<?> MenuItemImpl = Class.forName("com.android.internal.view.menu.MenuItemImpl"); - nativeIsActionButton = MenuItemImpl.getDeclaredMethod("isActionButton"); - if (!nativeIsActionButton.isAccessible()) { - nativeIsActionButton.setAccessible(true); - } - } catch (Exception ignored) { - } - } - try { - return (boolean) nativeIsActionButton.invoke(item, (Object[]) null); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - /** - * Check if an item is in the overflow menu. - * - * @param item the MenuItem - * @return {@code true} if the MenuItem is in the overflow menu. - * @see #isActionButton(MenuItem) - */ - public static boolean isInOverflow(MenuItem item) { - return !isActionButton(item); - } - - /** - * Sets the color filter and/or the alpha transparency on a {@link MenuItem}'s icon. - * - * @param menuItem The {@link MenuItem} to theme. - * @param color The color to set for the color filter or {@code null} for no changes. - * @param alpha The alpha value (0...255) to set on the icon or {@code null} for no changes. - */ - public static void colorMenuItem(MenuItem menuItem, Integer color, Integer alpha) { - if (color == null && alpha == null) { - return; // nothing to do. - } - Drawable drawable = menuItem.getIcon(); - if (drawable != null) { - // If we don't mutate the drawable, then all drawables with this id will have the ColorFilter - drawable.mutate(); - if (color != null) { - drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); - } - if (alpha != null) { - drawable.setAlpha(alpha); - } - } - } - - /** - * Set the menu to show MenuItem icons in the overflow window. - * - * @param menu the menu to force icons to show - */ - public static void forceMenuIcons(Menu menu) { - try { - Class<?> MenuBuilder = menu.getClass(); - Method setOptionalIconsVisible = - MenuBuilder.getDeclaredMethod("setOptionalIconsVisible", boolean.class); - if (!setOptionalIconsVisible.isAccessible()) { - setOptionalIconsVisible.setAccessible(true); - } - setOptionalIconsVisible.invoke(menu, true); - } catch (Exception ignored) { - } - } - - public static Builder on(Menu menu) { - return new Builder(menu); - } - - /** - * Apply a ColorFilter with the specified color to all icons in the menu. - * - * @param menu the menu after items have been added. - * @param color the color for the ColorFilter. - */ - public static void colorIcons(Menu menu, int color) { - MenuTint.on(menu).setMenuItemIconColor(color).apply(); - } - - public static void colorIcons(Activity activity, Menu menu, int color) { - MenuTint.on(menu).setMenuItemIconColor(color).apply(activity); - } - - /** - * @param activity the Activity - * @return the OverflowMenuButton or {@code null} if it doesn't exist. - */ - public static ImageView getOverflowMenuButton(Activity activity) { - return findOverflowMenuButton(activity, findActionBar(activity)); - } - - private static ImageView findOverflowMenuButton(Activity activity, ViewGroup viewGroup) { - if (viewGroup == null) { - return null; - } - ImageView overflow = null; - for (int i = 0, count = viewGroup.getChildCount(); i < count; i++) { - View v = viewGroup.getChildAt(i); - if (v instanceof ImageView - && (v.getClass().getSimpleName().equals("OverflowMenuButton") - || v instanceof ActionMenuView.ActionMenuChildView)) { - overflow = (ImageView) v; - } else if (v instanceof ViewGroup) { - overflow = findOverflowMenuButton(activity, (ViewGroup) v); - } - if (overflow != null) { - break; - } - } - return overflow; - } - - private static ViewGroup findActionBar(Activity activity) { - int id = activity.getResources().getIdentifier("action_bar", "id", "android"); - ViewGroup actionBar = null; - if (id != 0) { - actionBar = (ViewGroup) activity.findViewById(id); - } - if (actionBar == null) { - actionBar = findToolbar((ViewGroup) - activity.findViewById(android.R.id.content).getRootView()); - } - return actionBar; - } - - private static ViewGroup findToolbar(ViewGroup viewGroup) { - ViewGroup toolbar = null; - for (int i = 0, len = viewGroup.getChildCount(); i < len; i++) { - View view = viewGroup.getChildAt(i); - if (view.getClass() == android.support.v7.widget.Toolbar.class - || view.getClass().getName().equals("android.widget.Toolbar")) { - toolbar = (ViewGroup) view; - } else if (view instanceof ViewGroup) { - toolbar = findToolbar((ViewGroup) view); - } - if (toolbar != null) { - break; - } - } - return toolbar; - } - - public void apply() { - if (forceIcons) { - forceMenuIcons(menu); - } - - for (int i = 0, size = menu.size(); i < size; i++) { - MenuItem item = menu.getItem(i); - colorMenuItem(item, menuItemIconColor, menuItemIconAlpha); - if (reApplyOnChange) { - View view = item.getActionView(); - if (view != null) { - if (item instanceof MenuItemImpl) { - ((MenuItemImpl) item).setSupportOnActionExpandListener( - new SupportActionExpandListener(this)); - } else { - item.setOnActionExpandListener(new NativeActionExpandListener(this)); - } - } - } - } - } - - /** - * <p>Sets a ColorFilter and/or alpha on all the {@link MenuItem}s in the menu, including the - * OverflowMenuButton.</p> - * <p> - * <p>Call this method after inflating/creating your menu in - * {@link Activity#onCreateOptionsMenu(Menu)}.</p> - * <p> - * <p>Note: This is targeted for the native ActionBar/Toolbar, not AppCompat.</p> - */ - public void apply(Activity activity) { - apply(); - actionBarView = findActionBar(activity); - if (actionBarView == null) { - Log.w(TAG, "Could not find the ActionBar"); - return; - } - - // We must wait for the view to be created to set a color filter on the drawables. - actionBarView.post(() -> { - for (int i = 0, size = menu.size(); i < size; i++) { - MenuItem menuItem = menu.getItem(i); - if (isInOverflow(menuItem)) { - colorMenuItem(menuItem, subMenuIconColor, subMenuIconAlpha); - } - if (menuItem.hasSubMenu()) { - SubMenu subMenu = menuItem.getSubMenu(); - for (int j = 0; j < subMenu.size(); j++) { - colorMenuItem(subMenu.getItem(j), subMenuIconColor, subMenuIconAlpha); - } - } - } - if (menuItemIconColor != null || menuItemIconAlpha != null) { - overflowButton = findOverflowMenuButton(activity, actionBarView); - colorOverflowMenuItem(overflowButton); - } - }); - } - - /** - * <p>Sets a ColorFilter and/or alpha on all the {@link MenuItem}s in the menu, including the - * OverflowMenuButton.</p> - * <p> - * <p>This should only be called after calling {@link #apply(Activity)}. It is useful for when - * {@link MenuItem}s might be re-arranged due to an action view being collapsed or expanded.</p> - */ - public void reapply() { - - for (int i = 0, size = menu.size(); i < size; i++) { - MenuItem item = menu.getItem(i); - if (isActionButton(item)) { - colorMenuItem(menu.getItem(i), menuItemIconColor, menuItemIconAlpha); - } - } - - if (actionBarView == null) { - return; - } - - actionBarView.post(() -> { - for (int i = 0, size = menu.size(); i < size; i++) { - MenuItem menuItem = menu.getItem(i); - if (isInOverflow(menuItem)) { - colorMenuItem(menuItem, subMenuIconColor, subMenuIconAlpha); - } else { - colorMenuItem(menu.getItem(i), menuItemIconColor, menuItemIconAlpha); - } - if (menuItem.hasSubMenu()) { - SubMenu subMenu = menuItem.getSubMenu(); - for (int j = 0; j < subMenu.size(); j++) { - colorMenuItem(subMenu.getItem(j), subMenuIconColor, subMenuIconAlpha); - } - } - } - if (menuItemIconColor != null || menuItemIconAlpha != null) { - colorOverflowMenuItem(overflowButton); - } - }); - } - - private void colorOverflowMenuItem(ImageView overflow) { - if (overflow != null) { - if (overflowDrawableId != null) { - overflow.setImageResource(overflowDrawableId); - } - if (menuItemIconColor != null) { - overflow.setColorFilter(menuItemIconColor); - } - if (menuItemIconAlpha != null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - overflow.setImageAlpha(menuItemIconAlpha); - } else { - //noinspection deprecation - overflow.setAlpha(menuItemIconAlpha); - } - } - } - } - - public Menu getMenu() { - return menu; - } - - public ImageView getOverflowMenuButton() { - return overflowButton; - } - - public void setMenuItemIconColor(Integer color) { - menuItemIconColor = color; - } - - public static class NativeActionExpandListener implements OnActionExpandListener { - - private final MenuTint menuTint; - - public NativeActionExpandListener(MenuTint menuTint) { - this.menuTint = menuTint; - } - - @Override - public boolean onMenuItemActionExpand(MenuItem item) { - int color = menuTint.originalMenuItemIconColor == null ? menuTint.menuItemIconColor : - menuTint.originalMenuItemIconColor; - menuTint.setMenuItemIconColor(color); - menuTint.reapply(); - return true; - } - - @Override - public boolean onMenuItemActionCollapse(MenuItem item) { - int color = menuTint.originalMenuItemIconColor == null ? menuTint.menuItemIconColor : - menuTint.originalMenuItemIconColor; - menuTint.setMenuItemIconColor(color); - menuTint.reapply(); - return true; - } - - } - - public static class SupportActionExpandListener implements - MenuItemCompat.OnActionExpandListener { - - private final MenuTint menuTint; - - public SupportActionExpandListener(MenuTint menuTint) { - this.menuTint = menuTint; - } - - @Override - public boolean onMenuItemActionExpand(MenuItem item) { - int color = menuTint.originalMenuItemIconColor == null ? menuTint.menuItemIconColor : - menuTint.originalMenuItemIconColor; - menuTint.setMenuItemIconColor(color); - menuTint.reapply(); - return true; - } - - @Override - public boolean onMenuItemActionCollapse(MenuItem item) { - int color = menuTint.originalMenuItemIconColor == null ? menuTint.menuItemIconColor : - menuTint.originalMenuItemIconColor; - menuTint.setMenuItemIconColor(color); - menuTint.reapply(); - return true; - } - - } - - // -------------------------------------------------------------------------------------------- - - public static final class Builder { - - private final Menu menu; - private Integer menuItemIconColor; - private Integer menuItemIconAlpha; - private Integer subMenuIconColor; - private Integer subMenuIconAlpha; - private Integer overflowDrawableId; - private Integer originalMenuItemIconColor; - private boolean reApplyOnChange; - private boolean forceIcons; - - private Builder(Menu menu) { - this.menu = menu; - } - - /** - * <p>Sets an {@link OnActionExpandListener} on all {@link MenuItem}s with views, so when the - * menu is updated, the colors will be also.</p> - * <p> - * <p>This is useful when the overflow menu is showing icons and {@link MenuItem}s might be - * pushed to the overflow menu when a action view is expanded e.g. android.widget.SearchView. - * </p> - * - * @param reapply {@code true} to set the listeners on all {@link MenuItem}s with action views. - * @return this Builder object to allow for chaining of calls to set methods - */ - public Builder reapplyOnChange(boolean reapply) { - reApplyOnChange = reapply; - return this; - } - - /** - * Specify an alpha value for visible MenuItem icons, including the OverflowMenuButton. - * - * @param alpha the alpha value for the drawable. 0 means fully transparent, and 255 means fully - * opaque. - * @return this Builder object to allow for chaining of calls to set methods - */ - public Builder setMenuItemIconAlpha(int alpha) { - menuItemIconAlpha = alpha; - return this; - } - - /** - * Specify a color for visible MenuItem icons, including the OverflowMenuButton. - * - * @param color the color to apply on visible MenuItem icons, including the OverflowMenuButton. - * @return this Builder object to allow for chaining of calls to set methods - */ - public Builder setMenuItemIconColor(int color) { - menuItemIconColor = color; - return this; - } - - /** - * Specify a color that is applied when an action view is expanded or collapsed. - * - * @param color the color to apply on MenuItems when an action-view is expanded or collapsed. - * @return this Builder object to allow for chaining of calls to set methods - */ - public Builder setOriginalMenuItemIconColor(int color) { - originalMenuItemIconColor = color; - return this; - } - - /** - * Set the drawable id to set on the OverflowMenuButton. - * - * @param drawableId the resource identifier of the drawable - * @return this Builder object to allow for chaining of calls to set methods - */ - public Builder setOverflowDrawableId(int drawableId) { - overflowDrawableId = drawableId; - return this; - } - - /** - * Specify an alpha value for MenuItems that are in a SubMenu or in the Overflow menu. - * - * @param alpha the alpha value for the drawable. 0 means fully transparent, and 255 means fully - * opaque. - * @return this Builder object to allow for chaining of calls to set methods - */ - public Builder setSubMenuIconAlpha(int alpha) { - subMenuIconAlpha = alpha; - return this; - } - - /** - * Specify a color for MenuItems that are in a SubMenu or in the Overflow menu. - * - * @param color the color to apply on visible MenuItem icons, including the OverflowMenuButton. - * @return this Builder object to allow for chaining of calls to set methods - */ - public Builder setSubMenuIconColor(int color) { - subMenuIconColor = color; - return this; - } - - /** - * Set the menu to show MenuItem icons in the overflow window. - * - * @return this Builder object to allow for chaining of calls to set methods - */ - public Builder forceIcons() { - forceIcons = true; - return this; - } - - /** - * <p>Sets a ColorFilter and/or alpha on all the MenuItems in the menu, including the - * OverflowMenuButton.</p> - * <p> - * <p>Call this method after inflating/creating your menu in</p> - * {@link Activity#onCreateOptionsMenu(Menu)}.</p> - * <p> - * <p>Note: This is targeted for the native ActionBar/Toolbar, not AppCompat.</p> - */ - public MenuTint apply() { - MenuTint theme = new MenuTint(this); - theme.apply(); - return theme; - } - - public MenuTint apply(Activity activity) { - MenuTint theme = new MenuTint(this); - theme.apply(activity); - return theme; - } - - /** - * <p>Creates a {@link MenuTint} with the arguments supplied to this builder.</p> - * <p> - * <p>It does not apply the theme. Call {@link MenuTint#apply(Activity)} to do so.</p> - * - * @see #apply(Activity) - */ - public MenuTint create() { - return new MenuTint(this); - } - - } - - // -------------------------------------------------------------------------------------------- - - /** - * Auto collapses the SearchView when the soft keyboard is dismissed. - */ - public static class SearchViewFocusListener implements View.OnFocusChangeListener { - - private final MenuItem item; - - public SearchViewFocusListener(MenuItem item) { - this.item = item; - } - - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (!hasFocus && item != null) { - item.collapseActionView(); - if (v instanceof SearchView) { - ((SearchView) v).setQuery("", false); - } - } - } - - } - -} diff --git a/app/src/main/java/de/kuschku/util/ui/ObservableTextBinder.java b/app/src/main/java/de/kuschku/util/ui/ObservableTextBinder.java deleted file mode 100644 index 5fa72906d..000000000 --- a/app/src/main/java/de/kuschku/util/ui/ObservableTextBinder.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui; - -import android.widget.TextView; - -import de.kuschku.util.observables.lists.ObservableElement; - -public class ObservableTextBinder { - private final ObservableElement<CharSequence> text; - private TextView view; - - public ObservableTextBinder(ObservableElement<CharSequence> text) { - this.text = text; - this.text.addCallback(object -> updateView()); - } - - private void updateView() { - if (view != null) { - view.setText(text.get()); - } - } - - public void bind(TextView view) { - this.view = view; - updateView(); - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/SpanFormatter.java b/app/src/main/java/de/kuschku/util/ui/SpanFormatter.java deleted file mode 100644 index 0a4a91eda..000000000 --- a/app/src/main/java/de/kuschku/util/ui/SpanFormatter.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -/* -* Copyright © 2014 George T. Steel -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -package de.kuschku.util.ui; - -import android.support.annotation.NonNull; -import android.text.Spannable; -import android.text.SpannableStringBuilder; -import android.text.Spanned; -import android.text.SpannedString; - -import java.util.Locale; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * Provides {@link String#format} style functions that work with {@link Spanned} strings and preserve formatting. - * - * @author George T. Steel - */ -public class SpanFormatter { - private static final Pattern FORMAT_SEQUENCE = Pattern.compile("%([0-9]+\\$|<?)([^a-zA-z%]*)([[a-zA-Z%]&&[^tT]]|[tT][a-zA-Z])"); - - private SpanFormatter() { - } - - /** - * Version of {@link String#format(String, Object...)} that works on {@link Spanned} strings to preserve rich text formatting. - * Both the {@code format} as well as any {@code %s args} can be Spanned and will have their formatting preserved. - * Due to the way {@link Spannable}s work, any argument's spans will can only be included <b>once</b> in the result. - * Any duplicates will appear as text only. - * - * @param format the format string (see {@link java.util.Formatter#format}) - * @param args the list of arguments passed to the formatter. If there are - * more arguments than required by {@code format}, - * additional arguments are ignored. - * @return the formatted string (with spans). - */ - @NonNull - public static SpannedString format(@NonNull CharSequence format, Object... args) { - return format(Locale.getDefault(), format, args); - } - - /** - * Version of {@link String#format(Locale, String, Object...)} that works on {@link Spanned} strings to preserve rich text formatting. - * Both the {@code format} as well as any {@code %s args} can be Spanned and will have their formatting preserved. - * Due to the way {@link Spannable}s work, any argument's spans will can only be included <b>once</b> in the result. - * Any duplicates will appear as text only. - * - * @param locale the locale to apply; {@code null} value means no localization. - * @param format the format string (see {@link java.util.Formatter#format}) - * @param args the list of arguments passed to the formatter. - * @return the formatted string (with spans). - * @see String#format(Locale, String, Object...) - */ - @NonNull - public static SpannedString format(@NonNull Locale locale, @NonNull CharSequence format, Object... args) { - SpannableStringBuilder out = new SpannableStringBuilder(format); - - int i = 0; - int argAt = -1; - - while (i < out.length()) { - Matcher m = FORMAT_SEQUENCE.matcher(out); - if (!m.find(i)) break; - i = m.start(); - int exprEnd = m.end(); - - String argTerm = m.group(1); - String modTerm = m.group(2); - String typeTerm = m.group(3); - - CharSequence cookedArg; - - if (typeTerm.equals("%")) { - cookedArg = "%"; - } else { - int argIdx; - switch (argTerm) { - case "": - argIdx = ++argAt; - break; - case "<": - argIdx = argAt; - break; - default: - argIdx = Integer.parseInt(argTerm.substring(0, argTerm.length() - 1)) - 1; - break; - } - - Object argItem = args[argIdx]; - - if (typeTerm.equals("s") && argItem instanceof Spanned) { - cookedArg = (Spanned) argItem; - } else { - cookedArg = String.format(locale, "%" + modTerm + typeTerm, argItem); - } - } - - out.replace(i, exprEnd, cookedArg); - i += cookedArg.length(); - } - - return new SpannedString(out); - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/parcelableUtil/QVariantParcelable.java b/app/src/main/java/de/kuschku/util/ui/parcelableUtil/QVariantParcelable.java deleted file mode 100644 index e809fdde0..000000000 --- a/app/src/main/java/de/kuschku/util/ui/parcelableUtil/QVariantParcelable.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui.parcelableUtil; - -import android.os.Parcel; -import android.os.Parcelable; -import android.support.annotation.NonNull; - -import java.io.IOException; - -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.QMetaTypeRegistry; -import de.kuschku.libquassel.primitives.types.QVariant; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -@SuppressWarnings("unchecked") -public class QVariantParcelable<T> extends QVariant<T> implements Parcelable { - @NonNull - public Creator<QVariantParcelable> CREATOR = new Creator<QVariantParcelable>() { - @NonNull - @Override - public QVariantParcelable createFromParcel(@NonNull Parcel source) { - try { - QMetaType type = QMetaTypeRegistry.getType(QMetaType.Type.fromId(source.readInt())); - Object data; - switch (type.type) { - case Int: - data = source.readInt(); - break; - case QByteArray: - case QString: - data = source.readString(); - break; - case Bool: - data = (source.readInt() > 0); - break; - default: - throw new IllegalArgumentException("Can’t deserialize type " + type.name); - } - return new QVariantParcelable<>(type.name, data); - } catch (IOException e) { - throw new IllegalArgumentException(e); - } - } - - @NonNull - @Override - public QVariantParcelable[] newArray(int size) { - return new QVariantParcelable[size]; - } - }; - - public QVariantParcelable(@NonNull String typeName, T data) { - super(typeName, data); - } - - public QVariantParcelable(@NonNull QVariant value) { - super(value.type, (T) value.data); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - - - dest.writeInt(type.type.getValue()); - switch (type.type) { - case Int: - assertNotNull(data); - dest.writeInt((Integer) data); - break; - case QString: - dest.writeString((String) data); - break; - case Bool: - assertNotNull(data); - dest.writeInt(((Boolean) data) ? 1 : 0); - break; - default: - throw new IllegalArgumentException("Can’t serialize type " + type.name); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java b/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java deleted file mode 100644 index 95fe1c1cd..000000000 --- a/app/src/main/java/de/kuschku/util/ui/parcelableUtil/StorageBackendParcelable.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui.parcelableUtil; - -import android.os.Parcel; -import android.os.Parcelable; -import android.support.annotation.NonNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import de.kuschku.libquassel.objects.types.StorageBackend; -import de.kuschku.libquassel.primitives.QMetaType; -import de.kuschku.libquassel.primitives.types.QVariant; -import de.kuschku.util.backports.Stream; - -import static de.kuschku.util.AndroidAssert.assertNotNull; - -public class StorageBackendParcelable extends StorageBackend implements Parcelable { - @NonNull - public static Creator<StorageBackendParcelable> CREATOR = new Creator<StorageBackendParcelable>() { - @NonNull - @Override - public StorageBackendParcelable createFromParcel(@NonNull Parcel source) { - String DisplayName = source.readString(); - String Description = source.readString(); - List<String> SetupKeys = new ArrayList<>(); - source.readStringList(SetupKeys); - Map<String, QVariant> SetupDefaults = new HashMap<>(); - int size = source.readInt(); - for (int i = 0; i < size; i++) { - String key = source.readString(); - try { - QMetaType.Type type = QMetaType.Type.fromId(source.readInt()); - switch (type) { - case Int: - SetupDefaults.put(key, new QVariant<>(type, source.readInt())); - break; - case QString: - SetupDefaults.put(key, new QVariant<>(type, source.readString())); - break; - case Bool: - SetupDefaults.put(key, new QVariant<>(type, source.readInt() > 0)); - break; - default: - throw new IllegalArgumentException("Can’t serialize type " + type.name()); - } - } catch (IOException ignored) { - } - } - - assertNotNull(DisplayName); - assertNotNull(Description); - - return new StorageBackendParcelable(DisplayName, SetupDefaults, Description, SetupKeys); - } - - @NonNull - @Override - public StorageBackendParcelable[] newArray(int size) { - return new StorageBackendParcelable[size]; - } - }; - - public StorageBackendParcelable(@NonNull StorageBackend backend) { - this(backend.DisplayName, backend.SetupDefaults, backend.Description, backend.SetupKeys); - } - - public StorageBackendParcelable(@NonNull String displayName, @NonNull Map<String, QVariant> setupDefaults, @NonNull String description, @NonNull List<String> setupKeys) { - super(displayName, setupDefaults, description, setupKeys); - } - - @NonNull - public static ArrayList<StorageBackendParcelable> wrap(@NonNull List<StorageBackend> backends) { - return new ArrayList<>(new Stream<>(backends).map(StorageBackendParcelable::new).list()); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeString(DisplayName); - dest.writeString(Description); - dest.writeStringList(SetupKeys); - dest.writeInt(SetupDefaults.size()); - for (String key : SetupDefaults.keySet()) { - QVariant q = SetupDefaults.get(key); - QMetaType.Type type = q.type.type; - dest.writeString(key); - dest.writeInt(type.getValue()); - switch (type) { - case Int: - assertNotNull(q.data); - dest.writeInt((Integer) q.data); - break; - case QString: - dest.writeString((String) q.data); - break; - case Bool: - assertNotNull(q.data); - dest.writeInt(((Boolean) q.data) ? 1 : 0); - break; - default: - throw new IllegalArgumentException("Can’t serialize type " + q.type.name); - } - } - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListPreference.java b/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListPreference.java deleted file mode 100644 index 1396c604e..000000000 --- a/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListPreference.java +++ /dev/null @@ -1,232 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui.preferences; - -import android.annotation.TargetApi; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Build; -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import android.preference.ListPreference; -import android.support.annotation.NonNull; -import android.util.AttributeSet; -import android.view.View; -import android.widget.ListView; - -import com.afollestad.materialdialogs.MaterialDialog; - -import java.lang.reflect.Field; - -import de.kuschku.util.annotationbind.AutoBinder; - -/** - * @author Marc Holder Kluver (marchold), Aidan Follestad (afollestad) - */ -public class MaterialListPreference extends ListPreference { - - private Context context; - private MaterialDialog mDialog; - - public MaterialListPreference(Context context) { - super(context); - init(context, null); - } - - public MaterialListPreference(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public MaterialListPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(context, attrs); - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public MaterialListPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - init(context, attrs); - } - - private void init(Context context, AttributeSet attrs) { - this.context = context; - PrefUtil.setLayoutResource(context, this, attrs); - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) - setWidgetLayoutResource(0); - } - - @Override - public void setEntries(CharSequence[] entries) { - super.setEntries(entries); - if (mDialog != null) - mDialog.setItems(entries); - } - - @Override - public Dialog getDialog() { - return mDialog; - } - - public ListView getListView() { - if (getDialog() == null) return null; - return ((MaterialDialog) getDialog()).getListView(); - } - - @Override - protected void showDialog(Bundle state) { - if (getEntries() == null || getEntryValues() == null) { - throw new IllegalStateException( - "ListPreference requires an entries array and an entryValues array."); - } - - int preselect = findIndexOfValue(getValue()); - MaterialDialog.Builder builder = new MaterialDialog.Builder(context) - .title(getDialogTitle()) - .icon(getDialogIcon()) - .dismissListener(this) - .onAny((dialog, which) -> { - switch (which) { - default: - MaterialListPreference.this.onClick(dialog, DialogInterface.BUTTON_POSITIVE); - break; - case NEUTRAL: - MaterialListPreference.this.onClick(dialog, DialogInterface.BUTTON_NEUTRAL); - break; - case NEGATIVE: - MaterialListPreference.this.onClick(dialog, DialogInterface.BUTTON_NEGATIVE); - break; - } - }) - .backgroundColor(AutoBinder.obtainColor(de.kuschku.quasseldroid_ng.R.attr.colorBackgroundDialog, context.getTheme())) - .negativeText(getNegativeButtonText()) - .items(getEntries()) - .autoDismiss(true) // immediately close the dialog after selection - .itemsCallbackSingleChoice(preselect, (dialog, itemView, which, text) -> { - onClick(null, DialogInterface.BUTTON_POSITIVE); - if (which >= 0 && getEntryValues() != null) { - try { - Field clickedIndex = ListPreference.class.getDeclaredField("mClickedDialogEntryIndex"); - clickedIndex.setAccessible(true); - clickedIndex.set(MaterialListPreference.this, which); - } catch (Exception e) { - e.printStackTrace(); - } - } - return true; - }); - - final View contentView = onCreateDialogView(); - if (contentView != null) { - onBindDialogView(contentView); - builder.customView(contentView, false); - } else { - builder.content(getDialogMessage()); - } - - PrefUtil.registerOnActivityDestroyListener(this, this); - - mDialog = builder.build(); - if (state != null) - mDialog.onRestoreInstanceState(state); - onClick(mDialog, DialogInterface.BUTTON_NEGATIVE); - mDialog.show(); - } - - @Override - public void onDismiss(DialogInterface dialog) { - super.onDismiss(dialog); - PrefUtil.unregisterOnActivityDestroyListener(this, this); - } - - @Override - public void onActivityDestroy() { - super.onActivityDestroy(); - if (mDialog != null && mDialog.isShowing()) - mDialog.dismiss(); - } - - @Override - protected Parcelable onSaveInstanceState() { - final Parcelable superState = super.onSaveInstanceState(); - Dialog dialog = getDialog(); - if (dialog == null || !dialog.isShowing()) { - return superState; - } - - final SavedState myState = new SavedState(superState); - myState.isDialogShowing = true; - myState.dialogBundle = dialog.onSaveInstanceState(); - return myState; - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - if (state == null || !state.getClass().equals(SavedState.class)) { - // Didn't save state for us in onSaveInstanceState - super.onRestoreInstanceState(state); - return; - } - - SavedState myState = (SavedState) state; - super.onRestoreInstanceState(myState.getSuperState()); - if (myState.isDialogShowing) { - showDialog(myState.dialogBundle); - } - } - - // From DialogPreference - private static class SavedState extends BaseSavedState { - public static final Parcelable.Creator<SavedState> CREATOR = - new Parcelable.Creator<SavedState>() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - boolean isDialogShowing; - Bundle dialogBundle; - - public SavedState(Parcel source) { - super(source); - isDialogShowing = source.readInt() == 1; - dialogBundle = source.readBundle(getClass().getClassLoader()); - } - - public SavedState(Parcelable superState) { - super(superState); - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(isDialogShowing ? 1 : 0); - dest.writeBundle(dialogBundle); - } - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListSummaryPreference.java b/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListSummaryPreference.java deleted file mode 100644 index ea2049323..000000000 --- a/app/src/main/java/de/kuschku/util/ui/preferences/MaterialListSummaryPreference.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui.preferences; - -import android.content.Context; -import android.os.Bundle; -import android.util.AttributeSet; -import android.view.View; - -public class MaterialListSummaryPreference extends MaterialListPreference { - public MaterialListSummaryPreference(Context context) { - super(context); - setSummary(getEntry()); - } - - public MaterialListSummaryPreference(Context context, AttributeSet attrs) { - super(context, attrs); - setSummary(getEntry()); - } - - public MaterialListSummaryPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - setSummary(getEntry()); - } - - public MaterialListSummaryPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - setSummary(getEntry()); - } - - @Override - protected void onDialogClosed(boolean positiveResult) { - super.onDialogClosed(positiveResult); - setSummary(getEntry()); - } - - @Override - protected void showDialog(Bundle state) { - super.showDialog(state); - } - - @Override - protected void onBindView(View view) { - setSummary(getEntry()); - super.onBindView(view); - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/preferences/PrefUtil.java b/app/src/main/java/de/kuschku/util/ui/preferences/PrefUtil.java deleted file mode 100644 index 4ec183d58..000000000 --- a/app/src/main/java/de/kuschku/util/ui/preferences/PrefUtil.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui.preferences; - -import android.content.Context; -import android.content.res.TypedArray; -import android.content.res.XmlResourceParser; -import android.preference.Preference; -import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.AttributeSet; - -import com.afollestad.materialdialogs.commons.R; - -import java.lang.reflect.Method; - -/** - * @author Aidan Follestad (afollestad) - */ -class PrefUtil { - - private PrefUtil() { - } - - public static void setLayoutResource(@NonNull Context context, @NonNull Preference preference, @Nullable AttributeSet attrs) { - boolean foundLayout = false; - if (attrs != null) { - for (int i = 0; i < attrs.getAttributeCount(); i++) { - final String namespace = ((XmlResourceParser) attrs).getAttributeNamespace(0); - if (namespace.equals("http://schemas.android.com/apk/res/android") && - attrs.getAttributeName(i).equals("layout")) { - foundLayout = true; - break; - } - } - } - - boolean useStockLayout = false; - if (attrs != null) { - TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Preference, 0, 0); - try { - useStockLayout = a.getBoolean(R.styleable.Preference_useStockLayout, false); - } finally { - a.recycle(); - } - } - - if (!foundLayout && !useStockLayout) - preference.setLayoutResource(R.layout.md_preference_custom); - } - - public static void registerOnActivityDestroyListener(@NonNull Preference preference, @NonNull PreferenceManager.OnActivityDestroyListener listener) { - try { - PreferenceManager pm = preference.getPreferenceManager(); - Method method = pm.getClass().getDeclaredMethod( - "registerOnActivityDestroyListener", - PreferenceManager.OnActivityDestroyListener.class); - method.setAccessible(true); - method.invoke(pm, listener); - } catch (Exception ignored) { - } - } - - public static void unregisterOnActivityDestroyListener(@NonNull Preference preference, @NonNull PreferenceManager.OnActivityDestroyListener listener) { - try { - PreferenceManager pm = preference.getPreferenceManager(); - Method method = pm.getClass().getDeclaredMethod( - "unregisterOnActivityDestroyListener", - PreferenceManager.OnActivityDestroyListener.class); - method.setAccessible(true); - method.invoke(pm, listener); - } catch (Exception ignored) { - } - } -} diff --git a/app/src/main/java/de/kuschku/util/ui/preferences/SeekBarPreference.java b/app/src/main/java/de/kuschku/util/ui/preferences/SeekBarPreference.java deleted file mode 100644 index c2d2bc662..000000000 --- a/app/src/main/java/de/kuschku/util/ui/preferences/SeekBarPreference.java +++ /dev/null @@ -1,208 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package de.kuschku.util.ui.preferences; - -import android.content.Context; -import android.content.res.TypedArray; -import android.preference.Preference; -import android.support.v7.widget.AppCompatSeekBar; -import android.util.AttributeSet; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; -import android.widget.LinearLayout; -import android.widget.SeekBar; -import android.widget.SeekBar.OnSeekBarChangeListener; -import android.widget.TextView; - -import de.kuschku.quasseldroid_ng.R; - -public class SeekBarPreference extends Preference implements OnSeekBarChangeListener { - - private static final String ANDROIDNS = "http://schemas.android.com/apk/res/android"; - private static final String APPLICATIONNS = "http://robobunny.com"; - private static final int DEFAULT_VALUE = 50; - private final String TAG = getClass().getName(); - private int mMaxValue = 100; - private int mMinValue = 0; - private int mInterval = 1; - private int mCurrentValue; - private AppCompatSeekBar mSeekBar; - - private TextView mStatusText; - - public SeekBarPreference(Context context, AttributeSet attrs) { - super(context, attrs); - initPreference(context, attrs); - } - - public SeekBarPreference(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - initPreference(context, attrs); - } - - private void initPreference(Context context, AttributeSet attrs) { - setValuesFromXml(attrs); - mSeekBar = new AppCompatSeekBar(context, attrs); - mSeekBar.setMax(mMaxValue - mMinValue); - mSeekBar.setOnSeekBarChangeListener(this); - - setWidgetLayoutResource(R.layout.seek_bar_preference); - } - - private void setValuesFromXml(AttributeSet attrs) { - mMaxValue = attrs.getAttributeIntValue(ANDROIDNS, "max", 100); - mMinValue = attrs.getAttributeIntValue(APPLICATIONNS, "min", 0); - - try { - String newInterval = attrs.getAttributeValue(APPLICATIONNS, "interval"); - if (newInterval != null) - mInterval = Integer.parseInt(newInterval); - } catch (Exception e) { - Log.e(TAG, "Invalid interval value", e); - } - - } - - @Override - protected View onCreateView(ViewGroup parent) { - View view = super.onCreateView(parent); - - // The basic preference layout puts the widget frame to the right of the title and summary, - // so we need to change it a bit - the seekbar should be under them. - LinearLayout layout = (LinearLayout) view; - layout.setOrientation(LinearLayout.VERTICAL); - - return view; - } - - @Override - public void onBindView(View view) { - super.onBindView(view); - if (view != null) { - mSeekBar = (AppCompatSeekBar) view.findViewById(R.id.seekBarPrefSeekBar); - mSeekBar.setMax(mMaxValue - mMinValue); - mSeekBar.setOnSeekBarChangeListener(this); - } - - updateView(view); - } - - /** - * Update a SeekBarPreference view with our current state - * - * @param view - */ - protected void updateView(View view) { - - try { - mStatusText = (TextView) view.findViewById(R.id.seekBarPrefValue); - - mStatusText.setText(String.valueOf(mCurrentValue)); - mStatusText.setMinimumWidth(30); - - mSeekBar.setProgress(mCurrentValue - mMinValue); - - } catch (Exception e) { - Log.e(TAG, "Error updating seek bar preference", e); - } - - } - - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - int newValue = progress + mMinValue; - - if (newValue > mMaxValue) - newValue = mMaxValue; - else if (newValue < mMinValue) - newValue = mMinValue; - else if (mInterval != 1 && newValue % mInterval != 0) - newValue = Math.round(((float) newValue) / mInterval) * mInterval; - - // change rejected, revert to the previous value - if (!callChangeListener(newValue)) { - seekBar.setProgress(mCurrentValue - mMinValue); - return; - } - - // change accepted, store it - mCurrentValue = newValue; - mStatusText.setText(String.valueOf(newValue)); - persistInt(newValue); - - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - notifyChanged(); - } - - - @Override - protected Object onGetDefaultValue(TypedArray ta, int index) { - return ta.getInt(index, DEFAULT_VALUE); - - } - - @Override - protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { - - if (restoreValue) { - mCurrentValue = getPersistedInt(mCurrentValue); - } else { - int temp = 0; - try { - temp = (Integer) defaultValue; - } catch (Exception ex) { - Log.e(TAG, "Invalid default value: " + defaultValue.toString()); - } - - persistInt(temp); - mCurrentValue = temp; - } - - } - - /** - * make sure that the seekbar is disabled if the preference is disabled - */ - @Override - public void setEnabled(boolean enabled) { - super.setEnabled(enabled); - mSeekBar.setEnabled(enabled); - } - - @Override - public void onDependencyChanged(Preference dependency, boolean disableDependent) { - super.onDependencyChanged(dependency, disableDependent); - - //Disable movement of seek bar when dependency is false - if (mSeekBar != null) { - mSeekBar.setEnabled(!disableDependent); - } - } -} diff --git a/app/src/main/res/drawable-hdpi/ic_splash.png b/app/src/main/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000000000000000000000000000000000000..866a830e57094c84e6c1a65d43512ca8d7d32b82 GIT binary patch literal 11789 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 E4^xop`Tzg` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_splash.png b/app/src/main/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000000000000000000000000000000000000..bd41d82f31eab00a5f7bfb4bdc7b088d63352cad GIT binary patch literal 8421 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 F{{tWIY>WT^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-nodpi/bg2.jpg~ b/app/src/main/res/drawable-nodpi/bg2.jpg~ deleted file mode 100644 index d55595ae5a8581e48647b76cd641524359cd2684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1183302 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Ç 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ƞ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%0DqLnld-El%zb1A$5_4A*4$dNf49D~ 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%0AUk&`UFV;KD(YfL$Dk1(xH<;Qd%d&7P{BzfUrgx% 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ƧPqroF$X(9=05lpL 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 MCF^5{j$^w2+0|c@GXMYp diff --git a/app/src/main/res/drawable-xhdpi/ic_splash.png b/app/src/main/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000000000000000000000000000000000000..e28b16a1e83087f7179d1bc8060e54ba24df4be0 GIT binary patch literal 18337 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_splash.png b/app/src/main/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000000000000000000000000000000000000..f84ad44e0e7b8486d8bbbf63f3aafb4f4c0c869f GIT binary patch literal 31338 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 F{|6H?OH%*< literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_splash.png b/app/src/main/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000000000000000000000000000000000000..053f97c092414272ba3a1ba67da52806ae6d3427 GIT binary patch literal 44876 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 Dp{qWP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/badge.xml b/app/src/main/res/drawable/badge.xml deleted file mode 100644 index ce6e0a023..000000000 --- a/app/src/main/res/drawable/badge.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<shape xmlns:android="http://schemas.android.com/apk/res/android"> - <solid/> - <padding - android:bottom="4dp" - android:left="8dp" - android:right="8dp" - android:top="4dp"/> - <corners android:radius="16dp"/> -</shape> diff --git a/app/src/main/res/drawable/bg_splash.xml b/app/src/main/res/drawable/bg_splash.xml new file mode 100644 index 000000000..418a8dfab --- /dev/null +++ b/app/src/main/res/drawable/bg_splash.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@color/colorPrimary" /> + <item> + <bitmap + android:gravity="center" + android:src="@drawable/ic_splash" /> + </item> +</layer-list> diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml index a316fd109..0d2aa51b0 100644 --- a/app/src/main/res/drawable/ic_add.xml +++ b/app/src/main/res/drawable/ic_add.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/app/src/main/res/drawable/ic_arrow_right.xml index f366a6c78..50e06d4b9 100644 --- a/app/src/main/res/drawable/ic_arrow_right.xml +++ b/app/src/main/res/drawable/ic_arrow_right.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_check.xml b/app/src/main/res/drawable/ic_check.xml index 36a77023f..adb35a931 100644 --- a/app/src/main/res/drawable/ic_check.xml +++ b/app/src/main/res/drawable/ic_check.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_debug.xml b/app/src/main/res/drawable/ic_debug.xml index 17351b664..5da4c72cf 100644 --- a/app/src/main/res/drawable/ic_debug.xml +++ b/app/src/main/res/drawable/ic_debug.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M14,12H10V10H14M14,16H10V14H14M20,8H17.19C16.74,7.22 16.12,6.55 15.37,6.04L17,4.41L15.59,3L13.42,5.17C12.96,5.06 12.5,5 12,5C11.5,5 11.04,5.06 10.59,5.17L8.41,3L7,4.41L8.62,6.04C7.88,6.55 7.26,7.22 6.81,8H4V10H6.09C6.04,10.33 6,10.66 6,11V12H4V14H6V15C6,15.34 6.04,15.67 6.09,16H4V18H6.81C7.85,19.79 9.78,21 12,21C14.22,21 16.15,19.79 17.19,18H20V16H17.91C17.96,15.67 18,15.34 18,15V14H20V12H18V11C18,10.66 17.96,10.33 17.91,10H20V8Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M14,12H10V10H14M14,16H10V14H14M20,8H17.19C16.74,7.22 16.12,6.55 15.37,6.04L17,4.41L15.59,3L13.42,5.17C12.96,5.06 12.5,5 12,5C11.5,5 11.04,5.06 10.59,5.17L8.41,3L7,4.41L8.62,6.04C7.88,6.55 7.26,7.22 6.81,8H4V10H6.09C6.04,10.33 6,10.66 6,11V12H4V14H6V15C6,15.34 6.04,15.67 6.09,16H4V18H6.81C7.85,19.79 9.78,21 12,21C14.22,21 16.15,19.79 17.19,18H20V16H17.91C17.96,15.67 18,15.34 18,15V14H20V12H18V11C18,10.66 17.96,10.33 17.91,10H20V8Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml index 61336eeb1..d17b5c1b7 100644 --- a/app/src/main/res/drawable/ic_delete.xml +++ b/app/src/main/res/drawable/ic_delete.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M19,4H15.5L14.5,3H9.5L8.5,4H5V6H19M6,19A2,2 0 0,0 8,21H16A2,2 0 0,0 18,19V7H6V19Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_filter.xml b/app/src/main/res/drawable/ic_filter.xml index f2509e7d4..19feffee2 100644 --- a/app/src/main/res/drawable/ic_filter.xml +++ b/app/src/main/res/drawable/ic_filter.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M3,2H21V2H21V4H20.92L14,10.92V22.91L10,18.91V10.91L3.09,4H3V2Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M3,2H21V2H21V4H20.92L14,10.92V22.91L10,18.91V10.91L3.09,4H3V2Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_format_bold.xml b/app/src/main/res/drawable/ic_format_bold.xml index 203a23815..1e70c5e66 100644 --- a/app/src/main/res/drawable/ic_format_bold.xml +++ b/app/src/main/res/drawable/ic_format_bold.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M13.5,15.5H10V12.5H13.5A1.5,1.5 0 0,1 15,14A1.5,1.5 0 0,1 13.5,15.5M10,6.5H13A1.5,1.5 0 0,1 14.5,8A1.5,1.5 0 0,1 13,9.5H10M15.6,10.79C16.57,10.11 17.25,9 17.25,8C17.25,5.74 15.5,4 13.25,4H7V18H14.04C16.14,18 17.75,16.3 17.75,14.21C17.75,12.69 16.89,11.39 15.6,10.79Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M13.5,15.5H10V12.5H13.5A1.5,1.5 0 0,1 15,14A1.5,1.5 0 0,1 13.5,15.5M10,6.5H13A1.5,1.5 0 0,1 14.5,8A1.5,1.5 0 0,1 13,9.5H10M15.6,10.79C16.57,10.11 17.25,9 17.25,8C17.25,5.74 15.5,4 13.25,4H7V18H14.04C16.14,18 17.75,16.3 17.75,14.21C17.75,12.69 16.89,11.39 15.6,10.79Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_format_fill.xml b/app/src/main/res/drawable/ic_format_fill.xml index bc7cb3ed5..950ec4dee 100644 --- a/app/src/main/res/drawable/ic_format_fill.xml +++ b/app/src/main/res/drawable/ic_format_fill.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M19,11.5C19,11.5 17,13.67 17,15A2,2 0 0,0 19,17A2,2 0 0,0 21,15C21,13.67 19,11.5 19,11.5M5.21,10L10,5.21L14.79,10M16.56,8.94L7.62,0L6.21,1.41L8.59,3.79L3.44,8.94C2.85,9.5 2.85,10.47 3.44,11.06L8.94,16.56C9.23,16.85 9.62,17 10,17C10.38,17 10.77,16.85 11.06,16.56L16.56,11.06C17.15,10.47 17.15,9.5 16.56,8.94Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M19,11.5C19,11.5 17,13.67 17,15A2,2 0 0,0 19,17A2,2 0 0,0 21,15C21,13.67 19,11.5 19,11.5M5.21,10L10,5.21L14.79,10M16.56,8.94L7.62,0L6.21,1.41L8.59,3.79L3.44,8.94C2.85,9.5 2.85,10.47 3.44,11.06L8.94,16.56C9.23,16.85 9.62,17 10,17C10.38,17 10.77,16.85 11.06,16.56L16.56,11.06C17.15,10.47 17.15,9.5 16.56,8.94Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_format_italic.xml b/app/src/main/res/drawable/ic_format_italic.xml index b18f1fae6..5007fd7c8 100644 --- a/app/src/main/res/drawable/ic_format_italic.xml +++ b/app/src/main/res/drawable/ic_format_italic.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M10,4V7H12.21L8.79,15H6V18H14V15H11.79L15.21,7H18V4H10Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M10,4V7H12.21L8.79,15H6V18H14V15H11.79L15.21,7H18V4H10Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_format_paint.xml b/app/src/main/res/drawable/ic_format_paint.xml index 8faf4745e..698113842 100644 --- a/app/src/main/res/drawable/ic_format_paint.xml +++ b/app/src/main/res/drawable/ic_format_paint.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M18,4V3A1,1 0 0,0 17,2H5A1,1 0 0,0 4,3V7A1,1 0 0,0 5,8H17A1,1 0 0,0 18,7V6H19V10H9V21A1,1 0 0,0 10,22H12A1,1 0 0,0 13,21V12H21V4H18Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M18,4V3A1,1 0 0,0 17,2H5A1,1 0 0,0 4,3V7A1,1 0 0,0 5,8H17A1,1 0 0,0 18,7V6H19V10H9V21A1,1 0 0,0 10,22H12A1,1 0 0,0 13,21V12H21V4H18Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_format_underline.xml b/app/src/main/res/drawable/ic_format_underline.xml index fc1ca77ac..7e79bdc6d 100644 --- a/app/src/main/res/drawable/ic_format_underline.xml +++ b/app/src/main/res/drawable/ic_format_underline.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M5,21H19V19H5V21M12,17A6,6 0 0,0 18,11V3H15.5V11A3.5,3.5 0 0,1 12,14.5A3.5,3.5 0 0,1 8.5,11V3H6V11A6,6 0 0,0 12,17Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M5,21H19V19H5V21M12,17A6,6 0 0,0 18,11V3H15.5V11A3.5,3.5 0 0,1 12,14.5A3.5,3.5 0 0,1 8.5,11V3H6V11A6,6 0 0,0 12,17Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_help.xml b/app/src/main/res/drawable/ic_help.xml index eb6c5d28a..ae0a04424 100644 --- a/app/src/main/res/drawable/ic_help.xml +++ b/app/src/main/res/drawable/ic_help.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M15.07,11.25L14.17,12.17C13.45,12.89 13,13.5 13,15H11V14.5C11,13.39 11.45,12.39 12.17,11.67L13.41,10.41C13.78,10.05 14,9.55 14,9C14,7.89 13.1,7 12,7A2,2 0 0,0 10,9H8A4,4 0 0,1 12,5A4,4 0 0,1 16,9C16,9.88 15.64,10.67 15.07,11.25M13,19H11V17H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M15.07,11.25L14.17,12.17C13.45,12.89 13,13.5 13,15H11V14.5C11,13.39 11.45,12.39 12.17,11.67L13.41,10.41C13.78,10.05 14,9.55 14,9C14,7.89 13.1,7 12,7A2,2 0 0,0 10,9H8A4,4 0 0,1 12,5A4,4 0 0,1 16,9C16,9.88 15.64,10.67 15.07,11.25M13,19H11V17H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml index 2274de148..bad03f613 100644 --- a/app/src/main/res/drawable/ic_history.xml +++ b/app/src/main/res/drawable/ic_history.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M11,7V12.11L15.71,14.9L16.5,13.62L12.5,11.25V7M12.5,2C8.97,2 5.91,3.92 4.27,6.77L2,4.5V11H8.5L5.75,8.25C6.96,5.73 9.5,4 12.5,4A7.5,7.5 0 0,1 20,11.5A7.5,7.5 0 0,1 12.5,19C9.23,19 6.47,16.91 5.44,14H3.34C4.44,18.03 8.11,21 12.5,21C17.74,21 22,16.75 22,11.5A9.5,9.5 0 0,0 12.5,2Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M11,7V12.11L15.71,14.9L16.5,13.62L12.5,11.25V7M12.5,2C8.97,2 5.91,3.92 4.27,6.77L2,4.5V11H8.5L5.75,8.25C6.96,5.73 9.5,4 12.5,4A7.5,7.5 0 0,1 20,11.5A7.5,7.5 0 0,1 12.5,19C9.23,19 6.47,16.91 5.44,14H3.34C4.44,18.03 8.11,21 12.5,21C17.74,21 22,16.75 22,11.5A9.5,9.5 0 0,0 12.5,2Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml index 6cdc36b13..dba5a1ad5 100644 --- a/app/src/main/res/drawable/ic_lock.xml +++ b/app/src/main/res/drawable/ic_lock.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_lock_open.xml b/app/src/main/res/drawable/ic_lock_open.xml index 68f8dee0b..da3b6fdf0 100644 --- a/app/src/main/res/drawable/ic_lock_open.xml +++ b/app/src/main/res/drawable/ic_lock_open.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M18,20V10H6V20H18M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V10A2,2 0 0,1 6,8H15V6A3,3 0 0,0 12,3A3,3 0 0,0 9,6H7A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,17A2,2 0 0,1 10,15A2,2 0 0,1 12,13A2,2 0 0,1 14,15A2,2 0 0,1 12,17Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M18,20V10H6V20H18M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6C4.89,22 4,21.1 4,20V10A2,2 0 0,1 6,8H15V6A3,3 0 0,0 12,3A3,3 0 0,0 9,6H7A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,17A2,2 0 0,1 10,15A2,2 0 0,1 12,13A2,2 0 0,1 14,15A2,2 0 0,1 12,17Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_modify.xml b/app/src/main/res/drawable/ic_modify.xml index 9cc1a500e..b919ec831 100644 --- a/app/src/main/res/drawable/ic_modify.xml +++ b/app/src/main/res/drawable/ic_modify.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_reorder.xml b/app/src/main/res/drawable/ic_reorder.xml index 1dcc92507..77a4c4e27 100644 --- a/app/src/main/res/drawable/ic_reorder.xml +++ b/app/src/main/res/drawable/ic_reorder.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M3,15H21V13H3V15M3,19H21V17H3V19M3,11H21V9H3V11M3,5V7H21V5H3Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M3,15H21V13H3V15M3,19H21V17H3V19M3,11H21V9H3V11M3,5V7H21V5H3Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_scroll_down.xml b/app/src/main/res/drawable/ic_scroll_down.xml index 1241c136c..0fbf78884 100644 --- a/app/src/main/res/drawable/ic_scroll_down.xml +++ b/app/src/main/res/drawable/ic_scroll_down.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M16.59,5.59L18,7L12,13L6,7L7.41,5.59L12,10.17L16.59,5.59M16.59,11.59L18,13L12,19L6,13L7.41,11.59L12,16.17L16.59,11.59Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M16.59,5.59L18,7L12,13L6,7L7.41,5.59L12,10.17L16.59,5.59M16.59,11.59L18,13L12,19L6,13L7.41,11.59L12,16.17L16.59,11.59Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_send.xml b/app/src/main/res/drawable/ic_send.xml index 32fe2d36e..8ca7d5986 100644 --- a/app/src/main/res/drawable/ic_send.xml +++ b/app/src/main/res/drawable/ic_send.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M2,21L23,12L2,3V10L17,12L2,14V21Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M2,21L23,12L2,3V10L17,12L2,14V21Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_server.xml b/app/src/main/res/drawable/ic_server.xml index 304fe929c..624297401 100644 --- a/app/src/main/res/drawable/ic_server.xml +++ b/app/src/main/res/drawable/ic_server.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24" android:viewportWidth="24"> - <path - android:fillColor="#000" - android:pathData="M13,18H14A1,1 0 0,1 15,19H22V21H15A1,1 0 0,1 14,22H10A1,1 0 0,1 9,21H2V19H9A1,1 0 0,1 10,18H11V16H4A1,1 0 0,1 3,15V11A1,1 0 0,1 4,10H20A1,1 0 0,1 21,11V15A1,1 0 0,1 20,16H13V18M4,2H20A1,1 0 0,1 21,3V7A1,1 0 0,1 20,8H4A1,1 0 0,1 3,7V3A1,1 0 0,1 4,2M9,6H10V4H9V6M9,14H10V12H9V14M5,4V6H7V4H5M5,12V14H7V12H5Z"/> -</vector> \ No newline at end of file + <path + android:fillColor="#000" + android:pathData="M13,18H14A1,1 0 0,1 15,19H22V21H15A1,1 0 0,1 14,22H10A1,1 0 0,1 9,21H2V19H9A1,1 0 0,1 10,18H11V16H4A1,1 0 0,1 3,15V11A1,1 0 0,1 4,10H20A1,1 0 0,1 21,11V15A1,1 0 0,1 20,16H13V18M4,2H20A1,1 0 0,1 21,3V7A1,1 0 0,1 20,8H4A1,1 0 0,1 3,7V3A1,1 0 0,1 4,2M9,6H10V4H9V6M9,14H10V12H9V14M5,4V6H7V4H5M5,12V14H7V12H5Z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_shortcut_channel.xml b/app/src/main/res/drawable/ic_shortcut_channel.xml new file mode 100644 index 000000000..5b574046b --- /dev/null +++ b/app/src/main/res/drawable/ic_shortcut_channel.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/colorPrimaryDark" /> + <foreground android:drawable="@drawable/ic_shortcut_channel_foreground" /> +</adaptive-icon> diff --git a/app/src/main/res/drawable/ic_shortcut_channel_foreground.xml b/app/src/main/res/drawable/ic_shortcut_channel_foreground.xml new file mode 100644 index 000000000..45610df38 --- /dev/null +++ b/app/src/main/res/drawable/ic_shortcut_channel_foreground.xml @@ -0,0 +1,11 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportHeight="108" + android:viewportWidth="108"> + <path + android:fillColor="#fff" + android:pathData="m42.467 69.75 1.2425-7h-7l0.6125-3.5h7l1.855-10.5h-7l0.6125-3.5h7l1.2425-7h + 3.5l-1.2425 7h10.5l1.2425-7h3.5l-1.2425 7h7l-0.6125 3.5h-7l-1.855 10.5h7l-0.6125 3.5h-7l-1.2425 + 7h-3.5l1.2425-7h-10.5l-1.2425 7h-3.5m7.21-21-1.855 10.5h10.5l1.855-10.5h-10.5z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_shortcut_query.xml b/app/src/main/res/drawable/ic_shortcut_query.xml new file mode 100644 index 000000000..9803f68b1 --- /dev/null +++ b/app/src/main/res/drawable/ic_shortcut_query.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/colorPrimaryDark" /> + <foreground android:drawable="@drawable/ic_shortcut_query_foreground" /> +</adaptive-icon> diff --git a/app/src/main/res/drawable/ic_shortcut_query_foreground.xml b/app/src/main/res/drawable/ic_shortcut_query_foreground.xml new file mode 100644 index 000000000..058bc71b7 --- /dev/null +++ b/app/src/main/res/drawable/ic_shortcut_query_foreground.xml @@ -0,0 +1,10 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="108dp" + android:height="108dp" + android:viewportHeight="108" + android:viewportWidth="108"> + <path + android:fillColor="#fff" + android:pathData="m 54,40 a 7,7 0 0 1 7,7 7,7 0 0 1 -7,7 7,7 0 0 1 -7,-7 7,7 0 0 1 7,-7 m 0,17 c + 7.735,0 14,3.1325 14,7 l 0,3.5 -28,0 0,-3.5 c 0,-3.8675 6.265,-7 14,-7 z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_status.xml b/app/src/main/res/drawable/ic_status.xml index 54c07abe0..9d9344517 100644 --- a/app/src/main/res/drawable/ic_status.xml +++ b/app/src/main/res/drawable/ic_status.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.000002"> - <path - android:fillColor="#FF000000" - android:pathData="M12,12m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0"/> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-10,0a10,10 0,1 1,20 0a10,10 0,1 1,-20 0" /> </vector> diff --git a/app/src/main/res/drawable/ic_status_channel.xml b/app/src/main/res/drawable/ic_status_channel.xml index 379bc7ed3..ec005a7a2 100644 --- a/app/src/main/res/drawable/ic_status_channel.xml +++ b/app/src/main/res/drawable/ic_status_channel.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.000002"> - <path - android:fillColor="#FF000000" - android:pathData="m12,2c-5.523,0 -10,4.477 -10,10s4.477,10 10,10 10,-4.477 10,-10 -4.477,-10 -10,-10zM10.663,7.049a0.625,0.625 0,0 1,0.063 0.004,0.625 0.625,0 0,1 0.062,0.011 0.625,0.625 0,0 1,0.06 0.017,0.625 0.625,0 0,1 0.058,0.023 0.625,0.625 0,0 1,0.056 0.028,0.625 0.625,0 0,1 0.053,0.034 0.625,0.625 0,0 1,0.049 0.039,0.625 0.625,0 0,1 0.045,0.044 0.625,0.625 0,0 1,0.04 0.048,0.625 0.625,0 0,1 0.035,0.051 0.625,0.625 0,0 1,0.03 0.055,0.625 0.625,0 0,1 0.024,0.058 0.625,0.625 0,0 1,0.018 0.06,0.625 0.625,0 0,1 0.013,0.061 0.625,0.625 0,0 1,0.006 0.063,0.625 0.625,0 0,1 0,0.063 0.625,0.625 0,0 1,-0.006 0.062l-0.271,1.953 2.78,-0.015 0.292,-2.109a0.625,0.625 0,0 1,0.007 -0.043,0.625 0.625,0 0,1 0.015,-0.061 0.625,0.625 0,0 1,0.021 -0.059,0.625 0.625,0 0,1 0.027,-0.056 0.625,0.625 0,0 1,0.033 -0.054,0.625 0.625,0 0,1 0.037,-0.05 0.625,0.625 0,0 1,0.043 -0.046,0.625 0.625,0 0,1 0.047,-0.041 0.625,0.625 0,0 1,0.05 -0.037,0.625 0.625,0 0,1 0.054,-0.032 0.625,0.625 0,0 1,0.057 -0.026,0.625 0.625,0 0,1 0.059,-0.02 0.625,0.625 0,0 1,0.061 -0.014,0.625 0.625,0 0,1 0.062,-0.008 0.625,0.625 0,0 1,0.063 -0.001,0.625 0.625,0 0,1 0.062,0.004 0.625,0.625 0,0 1,0.062 0.011,0.625 0.625,0 0,1 0.06,0.017 0.625,0.625 0,0 1,0.058 0.023,0.625 0.625,0 0,1 0.056,0.028 0.625,0.625 0,0 1,0.053 0.034,0.625 0.625,0 0,1 0.049,0.039 0.625,0.625 0,0 1,0.045 0.044,0.625 0.625,0 0,1 0.04,0.048 0.625,0.625 0,0 1,0.035 0.051,0.625 0.625,0 0,1 0.03,0.055 0.625,0.625 0,0 1,0.024 0.058,0.625 0.625,0 0,1 0.018,0.06 0.625,0.625 0,0 1,0.013 0.061,0.625 0.625,0 0,1 0.006,0.063 0.625,0.625 0,0 1,0 0.063,0.625 0.625,0 0,1 -0.006,0.062l-0.268,1.932 1.609,-0.008a0.625,0.625 0,0 1,0.041 0.001,0.625 0.625,0 0,1 0.062,0.006 0.625,0.625 0,0 1,0.061 0.012,0.625 0.625,0 0,1 0.06,0.019 0.625,0.625 0,0 1,0.058 0.024,0.625 0.625,0 0,1 0.055,0.03 0.625,0.625 0,0 1,0.052 0.035,0.625 0.625,0 0,1 0.048,0.04 0.625,0.625 0,0 1,0.043 0.045,0.625 0.625,0 0,1 0.039,0.049 0.625,0.625 0,0 1,0.034 0.053,0.625 0.625,0 0,1 0.028,0.056 0.625,0.625 0,0 1,0.023 0.058,0.625 0.625,0 0,1 0.017,0.06 0.625,0.625 0,0 1,0.011 0.062,0.625 0.625,0 0,1 0.004,0.063 0.625,0.625 0,0 1,-0.002 0.063,0.625 0.625,0 0,1 -0.008,0.062 0.625,0.625 0,0 1,-0.014 0.061,0.625 0.625,0 0,1 -0.02,0.059 0.625,0.625 0,0 1,-0.026 0.057,0.625 0.625,0 0,1 -0.032,0.054 0.625,0.625 0,0 1,-0.037 0.051,0.625 0.625,0 0,1 -0.041,0.046 0.625,0.625 0,0 1,-0.046 0.043,0.625 0.625,0 0,1 -0.05,0.038 0.625,0.625 0,0 1,-0.053 0.032,0.625 0.625,0 0,1 -0.057,0.026 0.625,0.625 0,0 1,-0.059 0.021,0.625 0.625,0 0,1 -0.06,0.015 0.625,0.625 0,0 1,-0.062 0.009,0.625 0.625,0 0,1 -0.063,0.003l-1.789,0.009 -0.331,2.388 1.712,-0.009a0.625,0.625 0,0 1,0.043 0.001,0.625 0.625,0 0,1 0.062,0.006 0.625,0.625 0,0 1,0.061 0.012,0.625 0.625,0 0,1 0.06,0.019 0.625,0.625 0,0 1,0.058 0.024,0.625 0.625,0 0,1 0.055,0.03 0.625,0.625 0,0 1,0.052 0.035,0.625 0.625,0 0,1 0.048,0.041 0.625,0.625 0,0 1,0.043 0.044,0.625 0.625,0 0,1 0.039,0.049 0.625,0.625 0,0 1,0.034 0.053,0.625 0.625,0 0,1 0.028,0.056 0.625,0.625 0,0 1,0.023 0.058,0.625 0.625,0 0,1 0.017,0.06 0.625,0.625 0,0 1,0.01 0.062,0.625 0.625,0 0,1 0.005,0.062 0.625,0.625 0,0 1,-0.002 0.063,0.625 0.625,0 0,1 -0.008,0.062 0.625,0.625 0,0 1,-0.014 0.061,0.625 0.625,0 0,1 -0.021,0.059 0.625,0.625 0,0 1,-0.026 0.057,0.625 0.625,0 0,1 -0.031,0.054 0.625,0.625 0,0 1,-0.037 0.05,0.625 0.625,0 0,1 -0.041,0.047 0.625,0.625 0,0 1,-0.046 0.042,0.625 0.625,0 0,1 -0.05,0.038 0.625,0.625 0,0 1,-0.053 0.032,0.625 0.625,0 0,1 -0.057,0.027 0.625,0.625 0,0 1,-0.059 0.021,0.625 0.625,0 0,1 -0.06,0.015 0.625,0.625 0,0 1,-0.062 0.009,0.625 0.625,0 0,1 -0.063,0.002l-1.892,0.01 -0.305,2.197a0.625,0.625 0,0 1,-0.004 0.026,0.625 0.625,0 0,1 -0.015,0.06 0.625,0.625 0,0 1,-0.02 0.06,0.625 0.625,0 0,1 -0.026,0.057 0.625,0.625 0,0 1,-0.032 0.054,0.625 0.625,0 0,1 -0.037,0.051 0.625,0.625 0,0 1,-0.042 0.046,0.625 0.625,0 0,1 -0.046,0.042 0.625,0.625 0,0 1,-0.05 0.038,0.625 0.625,0 0,1 -0.053,0.032 0.625,0.625 0,0 1,-0.057 0.027,0.625 0.625,0 0,1 -0.059,0.021 0.625,0.625 0,0 1,-0.06 0.015,0.625 0.625,0 0,1 -0.062,0.009 0.625,0.625 0,0 1,-0.063 0.002,0.625 0.625,0 0,1 -0.063,-0.003 0.625,0.625 0,0 1,-0.062 -0.01,0.625 0.625,0 0,1 -0.06,-0.016 0.625,0.625 0,0 1,-0.059 -0.022,0.625 0.625,0 0,1 -0.056,-0.028 0.625,0.625 0,0 1,-0.053 -0.033,0.625 0.625,0 0,1 -0.049,-0.038 0.625,0.625 0,0 1,-0.045 -0.043,0.625 0.625,0 0,1 -0.041,-0.047 0.625,0.625 0,0 1,-0.036 -0.051,0.625 0.625,0 0,1 -0.031,-0.054 0.625,0.625 0,0 1,-0.025 -0.058,0.625 0.625,0 0,1 -0.019,-0.059 0.625,0.625 0,0 1,-0.013 -0.061,0.625 0.625,0 0,1 -0.007,-0.063 0.625,0.625 0,0 1,-0.001 -0.063,0.625 0.625,0 0,1 0.005,-0.062l0.28,-2.019 -2.78,0.015 -0.302,2.176a0.625,0.625 0,0 1,-0.004 0.026,0.625 0.625,0 0,1 -0.015,0.061 0.625,0.625 0,0 1,-0.02 0.059,0.625 0.625,0 0,1 -0.026,0.057 0.625,0.625 0,0 1,-0.032 0.054,0.625 0.625,0 0,1 -0.037,0.051 0.625,0.625 0,0 1,-0.041 0.046,0.625 0.625,0 0,1 -0.046,0.042 0.625,0.625 0,0 1,-0.05 0.038,0.625 0.625,0 0,1 -0.054,0.032 0.625,0.625 0,0 1,-0.057 0.027,0.625 0.625,0 0,1 -0.059,0.021 0.625,0.625 0,0 1,-0.061 0.015,0.625 0.625,0 0,1 -0.062,0.009 0.625,0.625 0,0 1,-0.063 0.002,0.625 0.625,0 0,1 -0.063,-0.003 0.625,0.625 0,0 1,-0.062 -0.01,0.625 0.625,0 0,1 -0.061,-0.016 0.625,0.625 0,0 1,-0.059 -0.022,0.625 0.625,0 0,1 -0.056,-0.028 0.625,0.625 0,0 1,-0.053 -0.033,0.625 0.625,0 0,1 -0.049,-0.038 0.625,0.625 0,0 1,-0.045 -0.043,0.625 0.625,0 0,1 -0.041,-0.047 0.625,0.625 0,0 1,-0.036 -0.051,0.625 0.625,0 0,1 -0.031,-0.054 0.625,0.625 0,0 1,-0.025 -0.057,0.625 0.625,0 0,1 -0.019,-0.06 0.625,0.625 0,0 1,-0.013 -0.061,0.625 0.625,0 0,1 -0.007,-0.062 0.625,0.625 0,0 1,-0.001 -0.063,0.625 0.625,0 0,1 0.005,-0.063l0.277,-1.998 -1.418,0.007a0.625,0.625 0,0 1,-0.043 -0.001,0.625 0.625,0 0,1 -0.062,-0.006 0.625,0.625 0,0 1,-0.062 -0.012,0.625 0.625,0 0,1 -0.06,-0.019 0.625,0.625 0,0 1,-0.058 -0.024,0.625 0.625,0 0,1 -0.055,-0.03 0.625,0.625 0,0 1,-0.052 -0.036,0.625 0.625,0 0,1 -0.048,-0.04 0.625,0.625 0,0 1,-0.043 -0.045,0.625 0.625,0 0,1 -0.039,-0.049 0.625,0.625 0,0 1,-0.034 -0.053,0.625 0.625,0 0,1 -0.028,-0.056 0.625,0.625 0,0 1,-0.023 -0.058,0.625 0.625,0 0,1 -0.017,-0.06 0.625,0.625 0,0 1,-0.011 -0.062,0.625 0.625,0 0,1 -0.004,-0.063 0.625,0.625 0,0 1,0.002 -0.063,0.625 0.625,0 0,1 0.008,-0.062 0.625,0.625 0,0 1,0.014 -0.06,0.625 0.625,0 0,1 0.02,-0.059 0.625,0.625 0,0 1,0.026 -0.057,0.625 0.625,0 0,1 0.031,-0.054 0.625,0.625 0,0 1,0.037 -0.051,0.625 0.625,0 0,1 0.042,-0.046 0.625,0.625 0,0 1,0.046 -0.043,0.625 0.625,0 0,1 0.05,-0.037 0.625,0.625 0,0 1,0.054 -0.032,0.625 0.625,0 0,1 0.057,-0.027 0.625,0.625 0,0 1,0.059 -0.021,0.625 0.625,0 0,1 0.06,-0.015 0.625,0.625 0,0 1,0.062 -0.009,0.625 0.625,0 0,1 0.063,-0.002l1.598,-0.008 0.331,-2.388 -1.52,0.008a0.625,0.625 0,0 1,-0.042 -0.001,0.625 0.625,0 0,1 -0.062,-0.006 0.625,0.625 0,0 1,-0.062 -0.012,0.625 0.625,0 0,1 -0.06,-0.019 0.625,0.625 0,0 1,-0.058 -0.024,0.625 0.625,0 0,1 -0.055,-0.03 0.625,0.625 0,0 1,-0.052 -0.035,0.625 0.625,0 0,1 -0.048,-0.041 0.625,0.625 0,0 1,-0.043 -0.044,0.625 0.625,0 0,1 -0.039,-0.049 0.625,0.625 0,0 1,-0.034 -0.052,0.625 0.625,0 0,1 -0.028,-0.056 0.625,0.625 0,0 1,-0.023 -0.058,0.625 0.625,0 0,1 -0.017,-0.06 0.625,0.625 0,0 1,-0.01 -0.062,0.625 0.625,0 0,1 -0.005,-0.062 0.625,0.625 0,0 1,0.002 -0.063,0.625 0.625,0 0,1 0.008,-0.062 0.625,0.625 0,0 1,0.014 -0.061,0.625 0.625,0 0,1 0.021,-0.059 0.625,0.625 0,0 1,0.026 -0.057,0.625 0.625,0 0,1 0.031,-0.054 0.625,0.625 0,0 1,0.037 -0.05,0.625 0.625,0 0,1 0.041,-0.047 0.625,0.625 0,0 1,0.046 -0.042,0.625 0.625,0 0,1 0.05,-0.038 0.625,0.625 0,0 1,0.054 -0.032,0.625 0.625,0 0,1 0.057,-0.027 0.625,0.625 0,0 1,0.059 -0.021,0.625 0.625,0 0,1 0.06,-0.015 0.625,0.625 0,0 1,0.062 -0.009,0.625 0.625,0 0,1 0.063,-0.002l1.7,-0.009 0.295,-2.13a0.625,0.625 0,0 1,0.007 -0.043,0.625 0.625,0 0,1 0.015,-0.06 0.625,0.625 0,0 1,0.021 -0.059,0.625 0.625,0 0,1 0.027,-0.056 0.625,0.625 0,0 1,0.032 -0.054,0.625 0.625,0 0,1 0.038,-0.05 0.625,0.625 0,0 1,0.042 -0.046,0.625 0.625,0 0,1 0.047,-0.041 0.625,0.625 0,0 1,0.05 -0.037,0.625 0.625,0 0,1 0.054,-0.031 0.625,0.625 0,0 1,0.057 -0.026,0.625 0.625,0 0,1 0.06,-0.02 0.625,0.625 0,0 1,0.06 -0.014,0.625 0.625,0 0,1 0.062,-0.008 0.625,0.625 0,0 1,0.063 -0.002zM13.603,10.957 L10.823,10.972 10.492,13.36 13.271,13.345 13.603,10.958z"/> + <path + android:fillColor="#FF000000" + android:pathData="m12,2c-5.523,0 -10,4.477 -10,10s4.477,10 10,10 10,-4.477 10,-10 -4.477,-10 -10,-10zM10.663,7.049a0.625,0.625 0,0 1,0.063 0.004,0.625 0.625,0 0,1 0.062,0.011 0.625,0.625 0,0 1,0.06 0.017,0.625 0.625,0 0,1 0.058,0.023 0.625,0.625 0,0 1,0.056 0.028,0.625 0.625,0 0,1 0.053,0.034 0.625,0.625 0,0 1,0.049 0.039,0.625 0.625,0 0,1 0.045,0.044 0.625,0.625 0,0 1,0.04 0.048,0.625 0.625,0 0,1 0.035,0.051 0.625,0.625 0,0 1,0.03 0.055,0.625 0.625,0 0,1 0.024,0.058 0.625,0.625 0,0 1,0.018 0.06,0.625 0.625,0 0,1 0.013,0.061 0.625,0.625 0,0 1,0.006 0.063,0.625 0.625,0 0,1 0,0.063 0.625,0.625 0,0 1,-0.006 0.062l-0.271,1.953 2.78,-0.015 0.292,-2.109a0.625,0.625 0,0 1,0.007 -0.043,0.625 0.625,0 0,1 0.015,-0.061 0.625,0.625 0,0 1,0.021 -0.059,0.625 0.625,0 0,1 0.027,-0.056 0.625,0.625 0,0 1,0.033 -0.054,0.625 0.625,0 0,1 0.037,-0.05 0.625,0.625 0,0 1,0.043 -0.046,0.625 0.625,0 0,1 0.047,-0.041 0.625,0.625 0,0 1,0.05 -0.037,0.625 0.625,0 0,1 0.054,-0.032 0.625,0.625 0,0 1,0.057 -0.026,0.625 0.625,0 0,1 0.059,-0.02 0.625,0.625 0,0 1,0.061 -0.014,0.625 0.625,0 0,1 0.062,-0.008 0.625,0.625 0,0 1,0.063 -0.001,0.625 0.625,0 0,1 0.062,0.004 0.625,0.625 0,0 1,0.062 0.011,0.625 0.625,0 0,1 0.06,0.017 0.625,0.625 0,0 1,0.058 0.023,0.625 0.625,0 0,1 0.056,0.028 0.625,0.625 0,0 1,0.053 0.034,0.625 0.625,0 0,1 0.049,0.039 0.625,0.625 0,0 1,0.045 0.044,0.625 0.625,0 0,1 0.04,0.048 0.625,0.625 0,0 1,0.035 0.051,0.625 0.625,0 0,1 0.03,0.055 0.625,0.625 0,0 1,0.024 0.058,0.625 0.625,0 0,1 0.018,0.06 0.625,0.625 0,0 1,0.013 0.061,0.625 0.625,0 0,1 0.006,0.063 0.625,0.625 0,0 1,0 0.063,0.625 0.625,0 0,1 -0.006,0.062l-0.268,1.932 1.609,-0.008a0.625,0.625 0,0 1,0.041 0.001,0.625 0.625,0 0,1 0.062,0.006 0.625,0.625 0,0 1,0.061 0.012,0.625 0.625,0 0,1 0.06,0.019 0.625,0.625 0,0 1,0.058 0.024,0.625 0.625,0 0,1 0.055,0.03 0.625,0.625 0,0 1,0.052 0.035,0.625 0.625,0 0,1 0.048,0.04 0.625,0.625 0,0 1,0.043 0.045,0.625 0.625,0 0,1 0.039,0.049 0.625,0.625 0,0 1,0.034 0.053,0.625 0.625,0 0,1 0.028,0.056 0.625,0.625 0,0 1,0.023 0.058,0.625 0.625,0 0,1 0.017,0.06 0.625,0.625 0,0 1,0.011 0.062,0.625 0.625,0 0,1 0.004,0.063 0.625,0.625 0,0 1,-0.002 0.063,0.625 0.625,0 0,1 -0.008,0.062 0.625,0.625 0,0 1,-0.014 0.061,0.625 0.625,0 0,1 -0.02,0.059 0.625,0.625 0,0 1,-0.026 0.057,0.625 0.625,0 0,1 -0.032,0.054 0.625,0.625 0,0 1,-0.037 0.051,0.625 0.625,0 0,1 -0.041,0.046 0.625,0.625 0,0 1,-0.046 0.043,0.625 0.625,0 0,1 -0.05,0.038 0.625,0.625 0,0 1,-0.053 0.032,0.625 0.625,0 0,1 -0.057,0.026 0.625,0.625 0,0 1,-0.059 0.021,0.625 0.625,0 0,1 -0.06,0.015 0.625,0.625 0,0 1,-0.062 0.009,0.625 0.625,0 0,1 -0.063,0.003l-1.789,0.009 -0.331,2.388 1.712,-0.009a0.625,0.625 0,0 1,0.043 0.001,0.625 0.625,0 0,1 0.062,0.006 0.625,0.625 0,0 1,0.061 0.012,0.625 0.625,0 0,1 0.06,0.019 0.625,0.625 0,0 1,0.058 0.024,0.625 0.625,0 0,1 0.055,0.03 0.625,0.625 0,0 1,0.052 0.035,0.625 0.625,0 0,1 0.048,0.041 0.625,0.625 0,0 1,0.043 0.044,0.625 0.625,0 0,1 0.039,0.049 0.625,0.625 0,0 1,0.034 0.053,0.625 0.625,0 0,1 0.028,0.056 0.625,0.625 0,0 1,0.023 0.058,0.625 0.625,0 0,1 0.017,0.06 0.625,0.625 0,0 1,0.01 0.062,0.625 0.625,0 0,1 0.005,0.062 0.625,0.625 0,0 1,-0.002 0.063,0.625 0.625,0 0,1 -0.008,0.062 0.625,0.625 0,0 1,-0.014 0.061,0.625 0.625,0 0,1 -0.021,0.059 0.625,0.625 0,0 1,-0.026 0.057,0.625 0.625,0 0,1 -0.031,0.054 0.625,0.625 0,0 1,-0.037 0.05,0.625 0.625,0 0,1 -0.041,0.047 0.625,0.625 0,0 1,-0.046 0.042,0.625 0.625,0 0,1 -0.05,0.038 0.625,0.625 0,0 1,-0.053 0.032,0.625 0.625,0 0,1 -0.057,0.027 0.625,0.625 0,0 1,-0.059 0.021,0.625 0.625,0 0,1 -0.06,0.015 0.625,0.625 0,0 1,-0.062 0.009,0.625 0.625,0 0,1 -0.063,0.002l-1.892,0.01 -0.305,2.197a0.625,0.625 0,0 1,-0.004 0.026,0.625 0.625,0 0,1 -0.015,0.06 0.625,0.625 0,0 1,-0.02 0.06,0.625 0.625,0 0,1 -0.026,0.057 0.625,0.625 0,0 1,-0.032 0.054,0.625 0.625,0 0,1 -0.037,0.051 0.625,0.625 0,0 1,-0.042 0.046,0.625 0.625,0 0,1 -0.046,0.042 0.625,0.625 0,0 1,-0.05 0.038,0.625 0.625,0 0,1 -0.053,0.032 0.625,0.625 0,0 1,-0.057 0.027,0.625 0.625,0 0,1 -0.059,0.021 0.625,0.625 0,0 1,-0.06 0.015,0.625 0.625,0 0,1 -0.062,0.009 0.625,0.625 0,0 1,-0.063 0.002,0.625 0.625,0 0,1 -0.063,-0.003 0.625,0.625 0,0 1,-0.062 -0.01,0.625 0.625,0 0,1 -0.06,-0.016 0.625,0.625 0,0 1,-0.059 -0.022,0.625 0.625,0 0,1 -0.056,-0.028 0.625,0.625 0,0 1,-0.053 -0.033,0.625 0.625,0 0,1 -0.049,-0.038 0.625,0.625 0,0 1,-0.045 -0.043,0.625 0.625,0 0,1 -0.041,-0.047 0.625,0.625 0,0 1,-0.036 -0.051,0.625 0.625,0 0,1 -0.031,-0.054 0.625,0.625 0,0 1,-0.025 -0.058,0.625 0.625,0 0,1 -0.019,-0.059 0.625,0.625 0,0 1,-0.013 -0.061,0.625 0.625,0 0,1 -0.007,-0.063 0.625,0.625 0,0 1,-0.001 -0.063,0.625 0.625,0 0,1 0.005,-0.062l0.28,-2.019 -2.78,0.015 -0.302,2.176a0.625,0.625 0,0 1,-0.004 0.026,0.625 0.625,0 0,1 -0.015,0.061 0.625,0.625 0,0 1,-0.02 0.059,0.625 0.625,0 0,1 -0.026,0.057 0.625,0.625 0,0 1,-0.032 0.054,0.625 0.625,0 0,1 -0.037,0.051 0.625,0.625 0,0 1,-0.041 0.046,0.625 0.625,0 0,1 -0.046,0.042 0.625,0.625 0,0 1,-0.05 0.038,0.625 0.625,0 0,1 -0.054,0.032 0.625,0.625 0,0 1,-0.057 0.027,0.625 0.625,0 0,1 -0.059,0.021 0.625,0.625 0,0 1,-0.061 0.015,0.625 0.625,0 0,1 -0.062,0.009 0.625,0.625 0,0 1,-0.063 0.002,0.625 0.625,0 0,1 -0.063,-0.003 0.625,0.625 0,0 1,-0.062 -0.01,0.625 0.625,0 0,1 -0.061,-0.016 0.625,0.625 0,0 1,-0.059 -0.022,0.625 0.625,0 0,1 -0.056,-0.028 0.625,0.625 0,0 1,-0.053 -0.033,0.625 0.625,0 0,1 -0.049,-0.038 0.625,0.625 0,0 1,-0.045 -0.043,0.625 0.625,0 0,1 -0.041,-0.047 0.625,0.625 0,0 1,-0.036 -0.051,0.625 0.625,0 0,1 -0.031,-0.054 0.625,0.625 0,0 1,-0.025 -0.057,0.625 0.625,0 0,1 -0.019,-0.06 0.625,0.625 0,0 1,-0.013 -0.061,0.625 0.625,0 0,1 -0.007,-0.062 0.625,0.625 0,0 1,-0.001 -0.063,0.625 0.625,0 0,1 0.005,-0.063l0.277,-1.998 -1.418,0.007a0.625,0.625 0,0 1,-0.043 -0.001,0.625 0.625,0 0,1 -0.062,-0.006 0.625,0.625 0,0 1,-0.062 -0.012,0.625 0.625,0 0,1 -0.06,-0.019 0.625,0.625 0,0 1,-0.058 -0.024,0.625 0.625,0 0,1 -0.055,-0.03 0.625,0.625 0,0 1,-0.052 -0.036,0.625 0.625,0 0,1 -0.048,-0.04 0.625,0.625 0,0 1,-0.043 -0.045,0.625 0.625,0 0,1 -0.039,-0.049 0.625,0.625 0,0 1,-0.034 -0.053,0.625 0.625,0 0,1 -0.028,-0.056 0.625,0.625 0,0 1,-0.023 -0.058,0.625 0.625,0 0,1 -0.017,-0.06 0.625,0.625 0,0 1,-0.011 -0.062,0.625 0.625,0 0,1 -0.004,-0.063 0.625,0.625 0,0 1,0.002 -0.063,0.625 0.625,0 0,1 0.008,-0.062 0.625,0.625 0,0 1,0.014 -0.06,0.625 0.625,0 0,1 0.02,-0.059 0.625,0.625 0,0 1,0.026 -0.057,0.625 0.625,0 0,1 0.031,-0.054 0.625,0.625 0,0 1,0.037 -0.051,0.625 0.625,0 0,1 0.042,-0.046 0.625,0.625 0,0 1,0.046 -0.043,0.625 0.625,0 0,1 0.05,-0.037 0.625,0.625 0,0 1,0.054 -0.032,0.625 0.625,0 0,1 0.057,-0.027 0.625,0.625 0,0 1,0.059 -0.021,0.625 0.625,0 0,1 0.06,-0.015 0.625,0.625 0,0 1,0.062 -0.009,0.625 0.625,0 0,1 0.063,-0.002l1.598,-0.008 0.331,-2.388 -1.52,0.008a0.625,0.625 0,0 1,-0.042 -0.001,0.625 0.625,0 0,1 -0.062,-0.006 0.625,0.625 0,0 1,-0.062 -0.012,0.625 0.625,0 0,1 -0.06,-0.019 0.625,0.625 0,0 1,-0.058 -0.024,0.625 0.625,0 0,1 -0.055,-0.03 0.625,0.625 0,0 1,-0.052 -0.035,0.625 0.625,0 0,1 -0.048,-0.041 0.625,0.625 0,0 1,-0.043 -0.044,0.625 0.625,0 0,1 -0.039,-0.049 0.625,0.625 0,0 1,-0.034 -0.052,0.625 0.625,0 0,1 -0.028,-0.056 0.625,0.625 0,0 1,-0.023 -0.058,0.625 0.625,0 0,1 -0.017,-0.06 0.625,0.625 0,0 1,-0.01 -0.062,0.625 0.625,0 0,1 -0.005,-0.062 0.625,0.625 0,0 1,0.002 -0.063,0.625 0.625,0 0,1 0.008,-0.062 0.625,0.625 0,0 1,0.014 -0.061,0.625 0.625,0 0,1 0.021,-0.059 0.625,0.625 0,0 1,0.026 -0.057,0.625 0.625,0 0,1 0.031,-0.054 0.625,0.625 0,0 1,0.037 -0.05,0.625 0.625,0 0,1 0.041,-0.047 0.625,0.625 0,0 1,0.046 -0.042,0.625 0.625,0 0,1 0.05,-0.038 0.625,0.625 0,0 1,0.054 -0.032,0.625 0.625,0 0,1 0.057,-0.027 0.625,0.625 0,0 1,0.059 -0.021,0.625 0.625,0 0,1 0.06,-0.015 0.625,0.625 0,0 1,0.062 -0.009,0.625 0.625,0 0,1 0.063,-0.002l1.7,-0.009 0.295,-2.13a0.625,0.625 0,0 1,0.007 -0.043,0.625 0.625,0 0,1 0.015,-0.06 0.625,0.625 0,0 1,0.021 -0.059,0.625 0.625,0 0,1 0.027,-0.056 0.625,0.625 0,0 1,0.032 -0.054,0.625 0.625,0 0,1 0.038,-0.05 0.625,0.625 0,0 1,0.042 -0.046,0.625 0.625,0 0,1 0.047,-0.041 0.625,0.625 0,0 1,0.05 -0.037,0.625 0.625,0 0,1 0.054,-0.031 0.625,0.625 0,0 1,0.057 -0.026,0.625 0.625,0 0,1 0.06,-0.02 0.625,0.625 0,0 1,0.06 -0.014,0.625 0.625,0 0,1 0.062,-0.008 0.625,0.625 0,0 1,0.063 -0.002zM13.603,10.957 L10.823,10.972 10.492,13.36 13.271,13.345 13.603,10.958z" /> </vector> diff --git a/app/src/main/res/drawable/ic_status_channel_offline.xml b/app/src/main/res/drawable/ic_status_channel_offline.xml index d24bc35b3..139b24530 100644 --- a/app/src/main/res/drawable/ic_status_channel_offline.xml +++ b/app/src/main/res/drawable/ic_status_channel_offline.xml @@ -23,8 +23,8 @@ android:width="24dp" android:height="24dp" android:viewportHeight="24.0" - android:viewportWidth="24.000002"> - <path - android:fillColor="#FF000000" - android:pathData="m10.66,7.04a0.625,0.625 0,0 0,-0.634 0.548l-0.295,2.13 -1.7,0.009a0.625,0.625 0,1 0,0.006 1.25l1.52,-0.008 -0.331,2.388 -1.598,0.008a0.625,0.625 0,1 0,0.006 1.25l1.418,-0.007 -0.277,1.998a0.625,0.625 0,1 0,1.238 0.172l0.302,-2.176 2.78,-0.015 -0.28,2.019a0.625,0.625 0,1 0,1.238 0.172l0.305,-2.197 1.892,-0.01a0.625,0.625 0,1 0,-0.007 -1.25l-1.712,0.009 0.331,-2.388 1.789,-0.009a0.625,0.625 0,1 0,-0.006 -1.25l-1.609,0.008 0.268,-1.932a0.625,0.625 0,0 0,-0.604 -0.719,0.625 0.625,0 0,0 -0.635,0.548l-0.292,2.109 -2.78,0.015 0.271,-1.953a0.625,0.625 0,0 0,-0.604 -0.719zM13.6,10.948 L13.269,13.336 10.489,13.35 10.82,10.963 13.6,10.948zM12,1.998c-5.514,0 -10,4.486 -10,10s4.486,10 10,10 10,-4.486 10,-10 -4.486,-10 -10,-10zM12,3.498c4.703,0 8.5,3.796 8.5,8.5s-3.797,8.5 -8.5,8.5 -8.5,-3.797 -8.5,-8.5 3.797,-8.5 8.5,-8.5z"/> + android:viewportWidth="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="m10.66,7.04a0.625,0.625 0,0 0,-0.634 0.548l-0.295,2.13 -1.7,0.009a0.625,0.625 0,1 0,0.006 1.25l1.52,-0.008 -0.331,2.388 -1.598,0.008a0.625,0.625 0,1 0,0.006 1.25l1.418,-0.007 -0.277,1.998a0.625,0.625 0,1 0,1.238 0.172l0.302,-2.176 2.78,-0.015 -0.28,2.019a0.625,0.625 0,1 0,1.238 0.172l0.305,-2.197 1.892,-0.01a0.625,0.625 0,1 0,-0.007 -1.25l-1.712,0.009 0.331,-2.388 1.789,-0.009a0.625,0.625 0,1 0,-0.006 -1.25l-1.609,0.008 0.268,-1.932a0.625,0.625 0,0 0,-0.604 -0.719,0.625 0.625,0 0,0 -0.635,0.548l-0.292,2.109 -2.78,0.015 0.271,-1.953a0.625,0.625 0,0 0,-0.604 -0.719zM13.6,10.948 L13.269,13.336 10.489,13.35 10.82,10.963 13.6,10.948zM12,1.998c-5.514,0 -10,4.486 -10,10s4.486,10 10,10 10,-4.486 10,-10 -4.486,-10 -10,-10zM12,3.498c4.703,0 8.5,3.796 8.5,8.5s-3.797,8.5 -8.5,8.5 -8.5,-3.797 -8.5,-8.5 3.797,-8.5 8.5,-8.5z" /> </vector> diff --git a/app/src/main/res/drawable/ic_status_offline.xml b/app/src/main/res/drawable/ic_status_offline.xml index 09c8869d1..3b528c780 100644 --- a/app/src/main/res/drawable/ic_status_offline.xml +++ b/app/src/main/res/drawable/ic_status_offline.xml @@ -24,7 +24,7 @@ android:height="24dp" android:viewportHeight="24.0" android:viewportWidth="24.000002"> - <path - android:fillColor="#FF000000" - android:pathData="m12,2c-5.514,0 -10,4.486 -10,10 0,5.514 4.486,10 10,10s10,-4.486 10,-10 -4.486,-10 -10,-10zM12,3.5c4.703,0 8.5,3.796 8.5,8.5 -0,4.703 -3.797,8.5 -8.5,8.5s-8.5,-3.797 -8.5,-8.5 3.797,-8.5 8.5,-8.5z"/> + <path + android:fillColor="#FF000000" + android:pathData="m12,2c-5.514,0 -10,4.486 -10,10 0,5.514 4.486,10 10,10s10,-4.486 10,-10 -4.486,-10 -10,-10zM12,3.5c4.703,0 8.5,3.796 8.5,8.5 -0,4.703 -3.797,8.5 -8.5,8.5s-8.5,-3.797 -8.5,-8.5 3.797,-8.5 8.5,-8.5z" /> </vector> diff --git a/app/src/main/res/layout-sw600dp-land/activity_setup.xml b/app/src/main/res/layout-sw600dp-land/activity_setup.xml deleted file mode 100644 index 646a6c6af..000000000 --- a/app/src/main/res/layout-sw600dp-land/activity_setup.xml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<merge - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <android.support.v4.view.ViewPager - android:id="@+id/view_pager" - android:layout_width="match_parent" - android:layout_height="match_parent"/> - - <android.support.design.widget.FloatingActionButton - android:id="@+id/btn" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginBottom="16dp" - android:layout_marginEnd="80dp" - android:layout_marginRight="80dp" - android:tint="@color/colorFillDark" - app:backgroundTint="#8A000000" - app:elevation="0dip" - app:fabSize="normal" - app:pressedTranslationZ="0dip" - app:srcCompat="@drawable/ic_arrow_right"/> - -</merge> diff --git a/app/src/main/res/layout-sw600dp-land/slide.xml b/app/src/main/res/layout-sw600dp-land/slide.xml deleted file mode 100644 index 7cb27ef90..000000000 --- a/app/src/main/res/layout-sw600dp-land/slide.xml +++ /dev/null @@ -1,82 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingLeft="64dp" - android:paddingRight="64dp"> - - <TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_above="@+id/view" - android:layout_toLeftOf="@+id/scrollView2" - android:layout_toStartOf="@+id/scrollView2" - android:gravity="end" - android:paddingEnd="64dp" - android:paddingRight="64dp" - android:text="@string/slideAccountCoreTitle" - android:textColor="@android:color/white" - android:textSize="28sp" - android:textStyle="bold"/> - - <android.support.v4.widget.Space - android:id="@+id/view" - android:layout_width="match_parent" - android:layout_height="32dp" - android:layout_centerVertical="true" - android:layout_toLeftOf="@+id/scrollView2" - android:layout_toStartOf="@+id/scrollView2"/> - - <TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_below="@+id/view" - android:layout_toLeftOf="@+id/scrollView2" - android:layout_toStartOf="@+id/scrollView2" - android:gravity="end" - android:paddingEnd="64dp" - android:paddingRight="64dp" - android:text="@string/slideAccountCoreDescription" - android:textColor="@android:color/white" - android:textSize="16sp"/> - - <ScrollView - android:id="@+id/scrollView2" - android:layout_width="400dp" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:layout_alignParentEnd="true" - android:layout_alignParentRight="true"> - - <android.support.v7.widget.CardView - android:id="@+id/content_host" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/md_light_cards" - android:minHeight="400dp"/> - - </ScrollView> - -</RelativeLayout> diff --git a/app/src/main/res/layout-sw600dp/activity_setup.xml b/app/src/main/res/layout-sw600dp/activity_setup.xml deleted file mode 100644 index cccdf4bfe..000000000 --- a/app/src/main/res/layout-sw600dp/activity_setup.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<merge - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <android.support.v4.view.ViewPager - android:id="@+id/view_pager" - android:layout_width="match_parent" - android:layout_height="match_parent"/> - - <FrameLayout - android:layout_width="400dp" - android:layout_height="wrap_content" - android:layout_gravity="bottom|center"> - - <android.support.design.widget.FloatingActionButton - android:id="@+id/btn" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginBottom="16dp" - android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" - android:tint="@color/colorFillDark" - app:backgroundTint="#8A000000" - app:elevation="0dip" - app:fabSize="normal" - app:pressedTranslationZ="0dip" - app:srcCompat="@drawable/ic_arrow_right"/> - - </FrameLayout> - -</merge> diff --git a/app/src/main/res/layout-sw600dp/slide.xml b/app/src/main/res/layout-sw600dp/slide.xml deleted file mode 100644 index 4a83a278c..000000000 --- a/app/src/main/res/layout-sw600dp/slide.xml +++ /dev/null @@ -1,74 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - - -<ScrollView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="bottom"> - - <LinearLayout - android:layout_width="400dp" - android:layout_height="wrap_content" - android:layout_gravity="center_horizontal" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="64dp" - android:orientation="vertical" - android:padding="32dp"> - - <TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="32dp" - android:text="@string/slideAccountCoreTitle" - android:textColor="@android:color/white" - android:textSize="28sp" - android:textStyle="bold"/> - - <TextView - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/slideAccountCoreDescription" - android:textColor="@android:color/white" - android:textSize="16sp"/> - - </LinearLayout> - - <android.support.v7.widget.CardView - android:id="@+id/content_host" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/md_light_cards" - android:minHeight="400dp"/> - - </LinearLayout> - -</ScrollView> diff --git a/app/src/main/res/layout/activity_alias_edit.xml b/app/src/main/res/layout/activity_alias_edit.xml deleted file mode 100644 index dc6fa4aae..000000000 --- a/app/src/main/res/layout/activity_alias_edit.xml +++ /dev/null @@ -1,87 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight" - android:paddingTop="16dp"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelAliasName"/> - - </android.support.design.widget.TextInputLayout> - - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/expansion" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelAliasExpansion"/> - - </android.support.design.widget.TextInputLayout> - - </LinearLayout> - - </ScrollView> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_channel_detail.xml b/app/src/main/res/layout/activity_channel_detail.xml deleted file mode 100644 index 9037982d9..000000000 --- a/app/src/main/res/layout/activity_channel_detail.xml +++ /dev/null @@ -1,109 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - style="@style/TextAppearance.AppCompat.Button" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:gravity="fill_vertical" - android:text="@string/titleTopic" - android:textColor="?attr/colorAccent"/> - - <TextView - android:id="@+id/topic" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" - android:textColor="?attr/colorForeground"/> - - <android.support.v7.widget.AppCompatButton - android:id="@+id/edit_topic" - style="@style/Widget.AppCompat.Button.Colored" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:text="@string/actionEditTopic"/> - - <View - android:layout_width="match_parent" - android:layout_height="1dp" - android:layout_marginTop="16dp" - android:background="?attr/colorDivider"/> - - <TextView - style="@style/TextAppearance.AppCompat.Button" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:gravity="fill_vertical" - android:text="@string/titleChannelModes" - android:textColor="?attr/colorAccent"/> - - <LinearLayout - android:id="@+id/modes" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="8dp" - android:paddingLeft="8dp" - android:paddingRight="8dp"/> - - </LinearLayout> - - </ScrollView> - -</LinearLayout> diff --git a/app/src/main/res/layout/activity_chatlist_edit.xml b/app/src/main/res/layout/activity_chatlist_edit.xml deleted file mode 100644 index f58e9ea1e..000000000 --- a/app/src/main/res/layout/activity_chatlist_edit.xml +++ /dev/null @@ -1,164 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight" - android:paddingTop="16dp"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelChatlistName"/> - - </android.support.design.widget.TextInputLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="16dp"> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingBottom="8dp" - android:paddingLeft="3dp" - android:paddingRight="3dp" - android:text="@string/labelChatlistNetwork" - android:textSize="12sp"/> - - <android.support.v7.widget.AppCompatSpinner - android:id="@+id/network" - style="@style/Base.Widget.AppCompat.Spinner.Underlined" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </LinearLayout> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/showChannels" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelChatlistShowChannels"/> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/showQueries" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelChatlistShowQueries"/> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/hideInactiveChats" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelChatlistHideInactiveChats"/> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/hideInactiveNetworks" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelChatlistHideInactiveNetworks"/> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/addAutomatically" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelChatlistAddNewChatsAutomatically"/> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/sortAlphabetically" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelChatlistSortAlphabetically"/> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="16dp"> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingBottom="8dp" - android:paddingLeft="3dp" - android:paddingRight="3dp" - android:text="@string/labelChatlistMinimumActivity" - android:textSize="12sp"/> - - <android.support.v7.widget.AppCompatSpinner - android:id="@+id/minimumActivity" - style="@style/Base.Widget.AppCompat.Spinner.Underlined" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </LinearLayout> - - </LinearLayout> - - </ScrollView> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_chatlist_list.xml b/app/src/main/res/layout/activity_chatlist_list.xml deleted file mode 100644 index 312273e20..000000000 --- a/app/src/main/res/layout/activity_chatlist_list.xml +++ /dev/null @@ -1,66 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.v7.widget.RecyclerView - android:id="@+id/list" - android:layout_width="match_parent" - android:layout_height="match_parent" - /> - - <android.support.design.widget.FloatingActionButton - android:id="@+id/add" - android:layout_width="56dp" - android:layout_height="56dp" - android:layout_gravity="end|bottom" - android:layout_marginBottom="16dp" - android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" - android:tint="@color/colorFillDark" - app:srcCompat="@drawable/ic_add"/> - </FrameLayout> -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_identity_edit.xml b/app/src/main/res/layout/activity_identity_edit.xml deleted file mode 100644 index ecd3265e1..000000000 --- a/app/src/main/res/layout/activity_identity_edit.xml +++ /dev/null @@ -1,208 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight" - android:paddingTop="16dp"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/identityName" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIdentityName"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/realName" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIdentityRealName"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/ident" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIdentityIdent"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.v7.widget.ButtonBarLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.v7.widget.AppCompatButton - android:id="@+id/nicks" - style="@style/Widget.AppCompat.Button.Colored" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:text="@string/actionEditNicks"/> - - </android.support.v7.widget.ButtonBarLayout> - - <TextView - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelIdentityMessages" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/kickReason" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIdentityKickReason"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/partReason" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIdentityPartReason"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/quitReason" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIdentityQuitReason"/> - - </android.support.design.widget.TextInputLayout> - - <TextView - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelIdentityAway" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/awayReason" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIdentityAwayReason"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.v7.widget.SwitchCompat - android:id="@+id/useAwayOnDetach" - style="?attr/switchPreferenceStyle" - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelIdentityDetachAway" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - <LinearLayout - android:id="@+id/groupAwayOnDetach" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/awayOnDetachReason" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIdentityDetachAwayReason"/> - - </android.support.design.widget.TextInputLayout> - - </LinearLayout> - - </LinearLayout> - - </ScrollView> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ignorerule_edit.xml b/app/src/main/res/layout/activity_ignorerule_edit.xml deleted file mode 100644 index 2e3394f94..000000000 --- a/app/src/main/res/layout/activity_ignorerule_edit.xml +++ /dev/null @@ -1,170 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight" - android:paddingTop="16dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="16dp"> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingBottom="8dp" - android:paddingLeft="3dp" - android:paddingRight="3dp" - android:text="@string/labelIgnoreRuleStrictness" - android:textSize="12sp"/> - - <android.support.v7.widget.AppCompatSpinner - android:id="@+id/strictness" - style="@style/Base.Widget.AppCompat.Spinner.Underlined" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="16dp"> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:paddingBottom="8dp" - android:paddingLeft="3dp" - android:paddingRight="3dp" - android:text="@string/labelIgnoreRuleType" - android:textSize="12sp"/> - - <android.support.v7.widget.AppCompatSpinner - android:id="@+id/type" - style="@style/Base.Widget.AppCompat.Spinner.Underlined" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </LinearLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/ignoreRule" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelIgnoreRule"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/isRegEx" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelIgnoreRuleIsRegEx"/> - - <TextView - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelIgnoreRuleScope" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="16dp"> - - <android.support.v7.widget.AppCompatSpinner - android:id="@+id/scopeType" - style="@style/Base.Widget.AppCompat.Spinner.Underlined" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </LinearLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/scope" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> - - </android.support.design.widget.TextInputLayout> - - </LinearLayout> - - </ScrollView> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 423eaa690..b8e62b48d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,125 +1,103 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> -<android.support.v4.widget.DrawerLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/drawer_layout" + <LinearLayout android:layout_width="match_parent" - android:layout_height="match_parent" - android:fitsSystemWindows="true" - tools:context=".ui.chat.MainActivity"> + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingLeft="16dp" + android:paddingRight="16dp"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> + <android.support.design.widget.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> - <include layout="@layout/widget_actionbar"/> - - <FrameLayout - android:id="@+id/content_host" - android:layout_width="match_parent" - android:layout_height="match_parent"/> + <android.support.design.widget.TextInputEditText + android:id="@+id/host" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="Host" + android:singleLine="true" + android:maxLines="1" /> + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <android.support.design.widget.TextInputEditText + android:id="@+id/port" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="Port" + android:inputType="number" + android:text="4242" + android:singleLine="true" + android:maxLines="1" /> + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <android.support.design.widget.TextInputEditText + android:id="@+id/user" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="Username" + android:singleLine="true" + android:maxLines="1" /> + </android.support.design.widget.TextInputLayout> + + <android.support.design.widget.TextInputLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> + + <android.support.design.widget.TextInputEditText + android:id="@+id/pass" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:hint="Password" + android:inputType="textPassword" + android:singleLine="true" + android:maxLines="1" /> + </android.support.design.widget.TextInputLayout> - </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content"> - <android.support.design.widget.NavigationView + <Button + android:id="@+id/connect" android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="end" - android:fitsSystemWindows="true"> - - <android.support.v7.widget.RecyclerView - android:id="@+id/nickList" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:clipToPadding="false" - android:maxWidth="320dp"/> + android:layout_height="wrap_content" + android:minWidth="88dp" + android:text="Connect" + android:theme="@style/RaisedThemedButton" /> - </android.support.design.widget.NavigationView> - - <android.support.design.widget.NavigationView + <Button + android:id="@+id/disconnect" android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="start" - android:fitsSystemWindows="true"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:maxWidth="320dp" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> + android:layout_height="wrap_content" + android:minWidth="88dp" + android:text="Disconnect" + android:theme="@style/RaisedButton" /> - <View - android:id="@+id/statusBarBackground" - android:layout_width="match_parent" - android:layout_height="0dip"/> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.v7.widget.Toolbar - android:id="@+id/chatListToolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:background="?attr/colorPrimary" - android:theme="?attr/actionBarTheme" - app:popupTheme="@style/AppTheme.PopupOverlay"> - - <android.support.v7.widget.AppCompatSpinner - android:id="@+id/chatListSpinner" - android:layout_width="fill_parent" - android:layout_height="match_parent" - android:theme="?attr/actionBarTheme" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </android.support.v7.widget.Toolbar> - - <ViewStub - android:id="@+id/cab_stub" - android:layout_width="match_parent" - android:layout_height="?actionBarSize"/> - - </FrameLayout> - - </android.support.design.widget.AppBarLayout> - - <android.support.v7.widget.RecyclerView - android:id="@+id/chatList" - android:layout_width="match_parent" - android:layout_height="match_parent"/> - - </LinearLayout> - - </android.support.design.widget.NavigationView> + <Button + android:id="@+id/clear" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="88dp" + android:text="Clear" + android:theme="@style/RaisedButton" /> + </LinearLayout> -</android.support.v4.widget.DrawerLayout> + <TextView + android:id="@+id/errorList" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textIsSelectable="true"/> + </LinearLayout> +</ScrollView> diff --git a/app/src/main/res/layout/activity_network_edit.xml b/app/src/main/res/layout/activity_network_edit.xml deleted file mode 100644 index 85827f380..000000000 --- a/app/src/main/res/layout/activity_network_edit.xml +++ /dev/null @@ -1,312 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight" - android:paddingTop="16dp"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/networkName" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkName"/> - - </android.support.design.widget.TextInputLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="16dp"> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - android:paddingLeft="3dp" - android:paddingRight="3dp" - android:text="@string/labelNetworkIdentity" - android:textSize="12sp"/> - - <android.support.v7.widget.AppCompatSpinner - android:id="@+id/identity" - style="@style/Base.Widget.AppCompat.Spinner.Underlined" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </LinearLayout> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/rejoinChannels" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelNetworkRejoinChannels"/> - - <android.support.v7.widget.ButtonBarLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.v7.widget.AppCompatButton - android:id="@+id/servers" - style="@style/Widget.AppCompat.Button.Colored" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:text="@string/actionEditServers"/> - - </android.support.v7.widget.ButtonBarLayout> - - <android.support.v7.widget.SwitchCompat - android:id="@+id/useCustomCodecs" - style="?attr/switchPreferenceStyle" - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelNetworkCustomCodecs" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - - <LinearLayout - android:id="@+id/groupCustomCodecs" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/codecForServer" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkCodecForServer"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/codecForEncoding" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkCodecForEncoding"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/codecForDecoding" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkCodecForDecoding"/> - - </android.support.design.widget.TextInputLayout> - - </LinearLayout> - - <android.support.v7.widget.SwitchCompat - android:id="@+id/useAutoIdentify" - style="?attr/switchPreferenceStyle" - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelNetworkAutoIdentify" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - - <LinearLayout - android:id="@+id/groupAutoIdentify" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/autoIdentifyService" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkAutoIdentifyService"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/autoIdentifyPassword" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkAutoIdentifyPassword"/> - - </android.support.design.widget.TextInputLayout> - - </LinearLayout> - - <android.support.v7.widget.SwitchCompat - android:id="@+id/useSasl" - style="?attr/switchPreferenceStyle" - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelNetworkSasl" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - <LinearLayout - android:id="@+id/groupSasl" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/saslAccount" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkSaslAccount"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/saslPassword" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkSaslPassword"/> - - </android.support.design.widget.TextInputLayout> - </LinearLayout> - - <android.support.v7.widget.SwitchCompat - android:id="@+id/useAutoReconnect" - style="?attr/switchPreferenceStyle" - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelNetworkAutoReconnect" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - <LinearLayout - android:id="@+id/groupAutoReconnect" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/autoReconnectInterval" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkAutoReconnectInterval" - android:inputType="number"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/unlimitedAutoReconnectRetries" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelNetworkAutoReconnectRetriesUnlimited"/> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/autoReconnectRetries" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkAutoReconnectRetries" - android:inputType="number"/> - - </android.support.design.widget.TextInputLayout> - - </LinearLayout> - - </LinearLayout> - - </ScrollView> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_network_list.xml b/app/src/main/res/layout/activity_network_list.xml deleted file mode 100644 index d49357519..000000000 --- a/app/src/main/res/layout/activity_network_list.xml +++ /dev/null @@ -1,65 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.v7.widget.RecyclerView - android:id="@+id/list" - android:layout_width="match_parent" - android:layout_height="match_parent"/> - - <android.support.design.widget.FloatingActionButton - android:id="@+id/add" - android:layout_width="56dp" - android:layout_height="56dp" - android:layout_gravity="end|bottom" - android:layout_marginBottom="16dp" - android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" - android:tint="@color/colorFillDark" - app:srcCompat="@drawable/ic_add"/> - </FrameLayout> -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_networkserver_edit.xml b/app/src/main/res/layout/activity_networkserver_edit.xml deleted file mode 100644 index 562ccaca0..000000000 --- a/app/src/main/res/layout/activity_networkserver_edit.xml +++ /dev/null @@ -1,202 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - android:id="@+id/appBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - app:contentInsetStartWithNavigation="0dp"/> - - </android.support.design.widget.AppBarLayout> - - <ScrollView - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight" - android:paddingTop="16dp"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/host" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkServerHost"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/port" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkServerPort" - android:inputType="number" - android:maxLength="5"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.v7.widget.AppCompatCheckBox - android:id="@+id/useSSL" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/labelNetworkServerUseSSL"/> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/password" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkServerPassword"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.v7.widget.SwitchCompat - android:id="@+id/useProxy" - style="?attr/switchPreferenceStyle" - android:layout_width="match_parent" - android:layout_height="48dp" - android:gravity="center_vertical" - android:text="@string/labelNetworkServerProxy" - android:textColor="?attr/colorAccent" - android:textSize="14sp"/> - - - <LinearLayout - android:id="@+id/groupProxy" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/proxyHost" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkServerProxyHost"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/proxyPort" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkServerProxyPort" - android:inputType="number" - android:maxLength="5"/> - - </android.support.design.widget.TextInputLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="16dp"> - - <TextView - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - android:paddingLeft="3dp" - android:paddingRight="3dp" - android:text="@string/labelNetworkServerProxyType" - android:textSize="12sp"/> - - <android.support.v7.widget.AppCompatSpinner - android:id="@+id/proxyType" - style="@style/Base.Widget.AppCompat.Spinner.Underlined" - android:layout_width="match_parent" - android:layout_height="48dp" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </LinearLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/proxyUser" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkServerProxyUser"/> - - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/proxyPassword" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelNetworkServerProxyPassword"/> - - </android.support.design.widget.TextInputLayout> - - </LinearLayout> - - </LinearLayout> - - </ScrollView> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml deleted file mode 100644 index e40c9bbf8..000000000 --- a/app/src/main/res/layout/activity_settings.xml +++ /dev/null @@ -1,48 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical"> - - <android.support.design.widget.AppBarLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:background="?attr/colorPrimary" - app:contentInsetStartWithNavigation="0dp" - app:popupTheme="@style/AppTheme.PopupOverlay"/> - - </android.support.design.widget.AppBarLayout> - - <FrameLayout - android:id="@+id/content_host" - android:layout_width="match_parent" - android:layout_height="match_parent"/> -</LinearLayout> diff --git a/app/src/main/res/layout/activity_setup.xml b/app/src/main/res/layout/activity_setup.xml deleted file mode 100644 index af00b2617..000000000 --- a/app/src/main/res/layout/activity_setup.xml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<merge - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <android.support.v4.view.ViewPager - android:id="@+id/view_pager" - android:layout_width="match_parent" - android:layout_height="match_parent"/> - - <android.support.design.widget.FloatingActionButton - android:id="@+id/btn" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginBottom="16dp" - android:layout_marginEnd="16dp" - android:layout_marginRight="16dp" - android:tint="@color/colorFillDark" - app:backgroundTint="#8A808080" - app:elevation="0dip" - app:fabSize="normal" - app:pressedTranslationZ="0dip" - app:srcCompat="@drawable/ic_arrow_right"/> - -</merge> diff --git a/app/src/main/res/layout/dialog_coreinfo.xml b/app/src/main/res/layout/dialog_coreinfo.xml deleted file mode 100644 index e4dcc51e2..000000000 --- a/app/src/main/res/layout/dialog_coreinfo.xml +++ /dev/null @@ -1,240 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingBottom="16dp" - android:paddingTop="16dp"> - - <android.support.v7.widget.CardView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="4dp" - app:cardBackgroundColor="?colorBackgroundCard" - app:cardUseCompatPadding="true" - app:contentPaddingBottom="16dp" - app:contentPaddingLeft="16dp" - app:contentPaddingRight="16dp" - app:contentPaddingTop="16dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/labelCoreAddress" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" - android:textColor="?colorForeground"/> - - <TextView - android:id="@+id/address" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" - android:textColor="?colorForeground" - tools:text="example.com:4242"/> - - </LinearLayout> - - </android.support.v7.widget.CardView> - - <android.support.v7.widget.CardView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="4dp" - app:cardBackgroundColor="?colorBackgroundCard" - app:cardUseCompatPadding="true" - app:contentPaddingBottom="16dp" - app:contentPaddingLeft="16dp" - app:contentPaddingRight="16dp" - app:contentPaddingTop="16dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/labelCoreCertificate" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" - android:textColor="?colorForeground"/> - - <TextView - android:id="@+id/verified" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" - android:textColor="?colorForeground" - tools:text="The connection is verified by Let's Encrypt"/> - - <TextView - android:id="@+id/fingerprint" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Small" - android:textColor="?colorForegroundSecondary" - tools:text="25:EF:C0:88:42:96:6C:66:2C:72:01:0E:2B:61:84:B2:D8:9A:AB:4D"/> - - </LinearLayout> - - </android.support.v7.widget.CardView> - - <android.support.v7.widget.CardView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="4dp" - app:cardBackgroundColor="?colorBackgroundCard" - app:cardUseCompatPadding="true" - app:contentPaddingBottom="16dp" - app:contentPaddingLeft="16dp" - app:contentPaddingRight="16dp" - app:contentPaddingTop="16dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/labelCoreVersion" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" - android:textColor="?colorForeground"/> - - <TextView - android:id="@+id/coreVersion" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" - android:textColor="?colorForeground" - tools:text="v0.13-pre (0.12.0+245 git-d6129e6)"/> - - <TextView - android:id="@+id/coreBuildDate" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Small" - android:textColor="?colorForegroundSecondary" - tools:text="Wed Sep 7 20:52:53 2016"/> - - </LinearLayout> - - </android.support.v7.widget.CardView> - - <android.support.v7.widget.CardView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="4dp" - app:cardBackgroundColor="?colorBackgroundCard" - app:cardUseCompatPadding="true" - app:contentPaddingBottom="16dp" - app:contentPaddingLeft="16dp" - app:contentPaddingRight="16dp" - app:contentPaddingTop="16dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/labelCoreUptime" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" - android:textColor="?colorForeground"/> - - <TextView - android:id="@+id/uptime" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" - android:textColor="?colorForeground" - tools:text="The core has been last restarted on 07.09.2016 19:23:31"/> - - </LinearLayout> - - </android.support.v7.widget.CardView> - - <android.support.v7.widget.CardView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="4dp" - app:cardBackgroundColor="?colorBackgroundCard" - app:cardUseCompatPadding="true" - app:contentPaddingBottom="16dp" - app:contentPaddingLeft="16dp" - app:contentPaddingRight="16dp" - app:contentPaddingTop="16dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/labelCoreConnectedClients" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" - android:textColor="?colorForeground"/> - - <TextView - android:id="@+id/connected" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" - android:textColor="?colorForeground" - tools:text="At the moment, 2 clients are connected under your account."/> - - </LinearLayout> - - </android.support.v7.widget.CardView> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_login.xml b/app/src/main/res/layout/dialog_login.xml deleted file mode 100644 index accd9e9f1..000000000 --- a/app/src/main/res/layout/dialog_login.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:paddingBottom="@dimen/activity_vertical_margin" - android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" - android:paddingTop="@dimen/activity_vertical_margin"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.v7.widget.AppCompatEditText - android:id="@+id/username" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelLoginUsername" - android:inputType="text"/> - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.v7.widget.AppCompatEditText - android:id="@+id/password" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelLoginPassword" - android:inputType="textPassword"/> - </android.support.design.widget.TextInputLayout> -</LinearLayout> diff --git a/app/src/main/res/layout/fragment_chat.xml b/app/src/main/res/layout/fragment_chat.xml deleted file mode 100644 index 40edd43e3..000000000 --- a/app/src/main/res/layout/fragment_chat.xml +++ /dev/null @@ -1,66 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<com.sothree.slidinguppanel.SlidingUpPanelLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/sliding_layout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="bottom" - android:orientation="vertical" - app:umanoPanelHeight="?attr/actionBarSize" - app:umanoScrollableView="@+id/chatline_scroller" - app:umanoShadowHeight="4dp" - tools:showIn="@layout/activity_main"> - - <FrameLayout - android:layout_width="match_parent" - android:layout_height="match_parent"> - - <android.support.v7.widget.RecyclerView - android:id="@+id/messages" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:clickable="true"/> - - <android.support.design.widget.FloatingActionButton - android:id="@+id/scroll_down" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end|bottom" - android:layout_marginBottom="12dp" - android:layout_marginEnd="12dp" - android:layout_marginRight="12dp" - android:tint="@color/colorFillDark" - app:backgroundTint="#8A808080" - app:elevation="0dip" - app:fabSize="mini" - app:pressedTranslationZ="0dip" - app:srcCompat="@drawable/ic_scroll_down"/> - - </FrameLayout> - - <include layout="@layout/widget_slider"/> - -</com.sothree.slidinguppanel.SlidingUpPanelLayout> diff --git a/app/src/main/res/layout/fragment_loading.xml b/app/src/main/res/layout/fragment_loading.xml deleted file mode 100644 index 2b0c883c4..000000000 --- a/app/src/main/res/layout/fragment_loading.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="240dp" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|center_horizontal" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="horizontal"> - - <TextView - android:id="@+id/label" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1" - android:text="@string/statusConnecting" - android:textAppearance="@style/TextAppearance.AppCompat.Caption"/> - - <TextView - android:id="@+id/count" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="@style/TextAppearance.AppCompat.Caption"/> - </LinearLayout> - - <ProgressBar - android:id="@+id/progressBar" - style="@style/Widget.AppCompat.ProgressBar.Horizontal" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:indeterminate="true"/> -</LinearLayout> diff --git a/app/src/main/res/layout/seek_bar_preference.xml b/app/src/main/res/layout/seek_bar_preference.xml deleted file mode 100644 index 0be9ccbb4..000000000 --- a/app/src/main/res/layout/seek_bar_preference.xml +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:id="@android:id/widget_frame" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:padding="4dp"> - - <android.support.v7.widget.AppCompatSeekBar - android:id="@+id/seekBarPrefSeekBar" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentEnd="true" - android:layout_alignParentRight="true" - android:layout_centerVertical="true" - android:layout_margin="4dp" - android:layout_toEndOf="@+id/seekBarPrefValue" - android:layout_toRightOf="@+id/seekBarPrefValue"/> - - <TextView - android:id="@+id/seekBarPrefValue" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignParentLeft="true" - android:layout_alignParentStart="true" - android:layout_centerVertical="true" - android:layout_margin="4dp" - android:gravity="end" - tools:text="16"/> - -</RelativeLayout> diff --git a/app/src/main/res/layout/slide.xml b/app/src/main/res/layout/slide.xml deleted file mode 100644 index 3c4792fe1..000000000 --- a/app/src/main/res/layout/slide.xml +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<ScrollView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/md_light_cards"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?attr/colorPrimary" - android:orientation="vertical" - android:padding="32dp"> - - <TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginBottom="32dp" - android:text="@string/slideAccountCoreTitle" - android:textColor="@android:color/white" - android:textSize="28sp" - android:textStyle="bold"/> - - <TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/slideAccountCoreDescription" - android:textColor="@android:color/white" - android:textSize="16sp"/> - - </LinearLayout> - - <FrameLayout - android:id="@+id/content_host" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> - - </LinearLayout> - -</ScrollView> diff --git a/app/src/main/res/layout/slide_account_core.xml b/app/src/main/res/layout/slide_account_core.xml deleted file mode 100644 index ad1e12330..000000000 --- a/app/src/main/res/layout/slide_account_core.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:padding="32dp"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelCoreHostname"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/host" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:inputType="textUri"/> - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelCorePort"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/port" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:inputType="number" - android:text="@string/defaultPort"/> - </android.support.design.widget.TextInputLayout> - -</LinearLayout> diff --git a/app/src/main/res/layout/slide_account_name.xml b/app/src/main/res/layout/slide_account_name.xml deleted file mode 100644 index d1b9105df..000000000 --- a/app/src/main/res/layout/slide_account_name.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:padding="32dp"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelAccountName"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/name" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> - </android.support.design.widget.TextInputLayout> - -</LinearLayout> diff --git a/app/src/main/res/layout/slide_account_user.xml b/app/src/main/res/layout/slide_account_user.xml deleted file mode 100644 index 4ccebf313..000000000 --- a/app/src/main/res/layout/slide_account_user.xml +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - android:padding="32dp"> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelAccountUsername"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/user" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:inputType="textVisiblePassword"/> - </android.support.design.widget.TextInputLayout> - - <android.support.design.widget.TextInputLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:hint="@string/labelAccountPassword"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/pass" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:inputType="textPassword"/> - </android.support.design.widget.TextInputLayout> - -</LinearLayout> diff --git a/app/src/main/res/layout/slide_core_setup_backend.xml b/app/src/main/res/layout/slide_core_setup_backend.xml deleted file mode 100644 index c74f19d5f..000000000 --- a/app/src/main/res/layout/slide_core_setup_backend.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<ScrollView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="400dp" - android:padding="32dp"> - - <LinearLayout - android:id="@+id/container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"/> -</ScrollView> \ No newline at end of file diff --git a/app/src/main/res/layout/slide_select.xml b/app/src/main/res/layout/slide_select.xml deleted file mode 100644 index baecf3099..000000000 --- a/app/src/main/res/layout/slide_select.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<android.support.v7.widget.RecyclerView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="400dp"/> diff --git a/app/src/main/res/layout/widget_actionbar.xml b/app/src/main/res/layout/widget_actionbar.xml deleted file mode 100644 index 70e48d851..000000000 --- a/app/src/main/res/layout/widget_actionbar.xml +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<android.support.design.widget.AppBarLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:theme="?attr/actionBarTheme"> - - <android.support.v7.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:background="?attr/colorPrimary" - app:contentInsetStartWithNavigation="0dp" - app:popupTheme="@style/AppTheme.PopupOverlay"> - - <LinearLayout - android:id="@+id/toolbar_action_area" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:background="?attr/selectableItemBackgroundBorderless" - android:clickable="true" - android:gravity="center_vertical|start" - android:minHeight="?attr/actionBarSize" - android:orientation="vertical" - android:paddingLeft="@dimen/action_bar_default_padding_start_material" - android:paddingStart="@dimen/action_bar_default_padding_start_material"> - - <LinearLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginTop="-2dp" - android:baselineAligned="false" - android:gravity="center_vertical"> - - <TextView - android:id="@+id/key" - style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" - android:layout_width="16dp" - android:layout_height="16dp" - android:layout_marginEnd="2dp" - android:layout_marginRight="2dp" - android:layout_marginTop="2dp" - android:gravity="center" - android:textSize="16sp" - android:visibility="gone"/> - - <TextView - android:id="@+id/toolbar_title" - style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:ellipsize="end" - android:gravity="center_vertical" - android:singleLine="true" - android:text="@string/appName"/> - - </LinearLayout> - - <TextView - android:id="@+id/toolbar_subtitle" - style="@style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="-3dp" - android:ellipsize="end" - android:singleLine="true" - android:visibility="gone"/> - </LinearLayout> - - </android.support.v7.widget.Toolbar> - -</android.support.design.widget.AppBarLayout> diff --git a/app/src/main/res/layout/widget_buffer.xml b/app/src/main/res/layout/widget_buffer.xml deleted file mode 100644 index c0725f0c4..000000000 --- a/app/src/main/res/layout/widget_buffer.xml +++ /dev/null @@ -1,113 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<FrameLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?selectableItemBackground" - android:clickable="true"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="@dimen/material_drawer_item_secondary" - android:orientation="horizontal" - android:paddingEnd="@dimen/material_drawer_vertical_padding" - android:paddingLeft="@dimen/material_drawer_vertical_padding" - android:paddingRight="@dimen/material_drawer_vertical_padding" - android:paddingStart="@dimen/material_drawer_vertical_padding"> - - <FrameLayout - android:layout_width="56dp" - android:layout_height="match_parent"> - - <ImageView - android:id="@+id/material_drawer_icon" - android:layout_width="20dp" - android:layout_height="20dp" - android:layout_gravity="center_vertical|start" - android:layout_marginBottom="@dimen/material_drawer_item_secondary_icon_padding" - android:layout_marginTop="@dimen/material_drawer_item_secondary_icon_padding"/> - - </FrameLayout> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:orientation="vertical"> - - <TextView - android:id="@+id/material_drawer_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_secondary_text" - tools:text="Some secondary text"/> - - <TextView - android:id="@+id/material_drawer_description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_secondary_description" - tools:text="Some drawer text"/> - - </LinearLayout> - - <LinearLayout - android:id="@+id/material_drawer_badge_container" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:background="@drawable/badge" - android:gravity="center" - android:padding="6dp"> - - <TextView - android:id="@+id/material_drawer_badge" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:fontFamily="sans-serif" - android:gravity="center" - android:lines="1" - android:minWidth="20dp" - android:paddingLeft="1dp" - android:paddingRight="1dp" - android:singleLine="true" - android:textColor="@color/md_white_1000" - android:textSize="@dimen/material_drawer_item_secondary_text" - tools:text="99+"/> - - </LinearLayout> - - </LinearLayout> - -</FrameLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_channel_mode.xml b/app/src/main/res/layout/widget_channel_mode.xml deleted file mode 100644 index 405cd25ef..000000000 --- a/app/src/main/res/layout/widget_channel_mode.xml +++ /dev/null @@ -1,65 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<android.support.v7.widget.CardView - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_margin="4dp" - app:cardBackgroundColor="?attr/colorBackgroundCard" - app:cardUseCompatPadding="true" - app:contentPaddingBottom="16dp" - app:contentPaddingLeft="16dp" - app:contentPaddingRight="16dp" - app:contentPaddingTop="16dp"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:orientation="vertical"> - - <TextView - android:id="@+id/name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" - android:textColor="?attr/colorForeground"/> - - <TextView - android:id="@+id/description" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" - android:textColor="?attr/colorForeground"/> - - <TextView - android:id="@+id/value" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" - android:textColor="?attr/colorForeground" - android:visibility="gone"/> - - </LinearLayout> - -</android.support.v7.widget.CardView> diff --git a/app/src/main/res/layout/widget_chatlist.xml b/app/src/main/res/layout/widget_chatlist.xml deleted file mode 100644 index 0141e5179..000000000 --- a/app/src/main/res/layout/widget_chatlist.xml +++ /dev/null @@ -1,39 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?attr/selectableItemBackground" - android:clickable="true" - android:paddingLeft="16dp" - android:paddingRight="16dp"> - - <TextView - android:id="@+id/chatlist_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:lines="1" - android:singleLine="true" - android:textSize="16sp"/> -</FrameLayout> diff --git a/app/src/main/res/layout/widget_chatmessage_action.xml b/app/src/main/res/layout/widget_chatmessage_action.xml deleted file mode 100644 index b98b974ff..000000000 --- a/app/src/main/res/layout/widget_chatmessage_action.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:clickable="true" - android:gravity="top" - android:orientation="horizontal" - android:paddingBottom="@dimen/message_vertical" - android:paddingEnd="@dimen/message_horizontal" - android:paddingLeft="@dimen/message_horizontal" - android:paddingRight="@dimen/message_horizontal" - android:paddingStart="@dimen/message_horizontal" - android:paddingTop="@dimen/message_vertical" - android:textAppearance="?android:attr/textAppearanceListItemSmall"> - - <TextView - android:id="@+id/time" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/message_horizontal" - android:layout_marginRight="@dimen/message_horizontal" - android:textColor="?attr/colorForegroundSecondary" - android:typeface="monospace"/> - - <TextView - android:id="@+id/content" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1" - android:clickable="true" - android:textColor="?attr/colorForegroundAction" - android:textIsSelectable="true" - android:textStyle="italic"/> -</LinearLayout> diff --git a/app/src/main/res/layout/widget_chatmessage_error.xml b/app/src/main/res/layout/widget_chatmessage_error.xml deleted file mode 100644 index 33be8ade0..000000000 --- a/app/src/main/res/layout/widget_chatmessage_error.xml +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?attr/colorBackgroundSecondary" - android:clickable="true" - android:gravity="top" - android:orientation="horizontal" - android:paddingBottom="@dimen/message_vertical" - android:paddingEnd="@dimen/message_horizontal" - android:paddingLeft="@dimen/message_horizontal" - android:paddingRight="@dimen/message_horizontal" - android:paddingStart="@dimen/message_horizontal" - android:paddingTop="@dimen/message_vertical" - android:textAppearance="?android:attr/textAppearanceListItemSmall"> - - <TextView - android:id="@+id/time" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/message_horizontal" - android:layout_marginRight="@dimen/message_horizontal" - android:textColor="?attr/colorForegroundSecondary" - android:typeface="monospace"/> - - <TextView - android:id="@+id/content" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1" - android:clickable="true" - android:textColor="?attr/colorForegroundError" - android:textIsSelectable="true" - android:textStyle="italic"/> -</LinearLayout> diff --git a/app/src/main/res/layout/widget_chatmessage_markerline.xml b/app/src/main/res/layout/widget_chatmessage_markerline.xml deleted file mode 100644 index bfbbd490f..000000000 --- a/app/src/main/res/layout/widget_chatmessage_markerline.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<View - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="8dp" - android:background="@color/md_red_500"/> diff --git a/app/src/main/res/layout/widget_chatmessage_plain.xml b/app/src/main/res/layout/widget_chatmessage_plain.xml deleted file mode 100644 index a96ef1347..000000000 --- a/app/src/main/res/layout/widget_chatmessage_plain.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:clickable="true" - android:gravity="top" - android:orientation="horizontal" - android:paddingBottom="@dimen/message_vertical" - android:paddingEnd="@dimen/message_horizontal" - android:paddingLeft="@dimen/message_horizontal" - android:paddingRight="@dimen/message_horizontal" - android:paddingStart="@dimen/message_horizontal" - android:paddingTop="@dimen/message_vertical" - android:textAppearance="?android:attr/textAppearanceListItemSmall"> - - <TextView - android:id="@+id/time" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/message_horizontal" - android:layout_marginRight="@dimen/message_horizontal" - android:textColor="?attr/colorForegroundSecondary" - android:typeface="monospace"/> - - <TextView - android:id="@+id/content" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1" - android:clickable="true" - android:textColor="?attr/colorForeground" - android:textIsSelectable="true"/> -</LinearLayout> diff --git a/app/src/main/res/layout/widget_chatmessage_server.xml b/app/src/main/res/layout/widget_chatmessage_server.xml deleted file mode 100644 index 3d0424d49..000000000 --- a/app/src/main/res/layout/widget_chatmessage_server.xml +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?attr/colorBackgroundSecondary" - android:clickable="true" - android:gravity="top" - android:orientation="horizontal" - android:paddingBottom="@dimen/message_vertical" - android:paddingEnd="@dimen/message_horizontal" - android:paddingLeft="@dimen/message_horizontal" - android:paddingRight="@dimen/message_horizontal" - android:paddingStart="@dimen/message_horizontal" - android:paddingTop="@dimen/message_vertical" - android:textAppearance="?android:attr/textAppearanceListItemSmall"> - - <TextView - android:id="@+id/time" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/message_horizontal" - android:layout_marginRight="@dimen/message_horizontal" - android:textColor="?attr/colorForegroundSecondary" - android:typeface="monospace"/> - - <TextView - android:id="@+id/content" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_weight="1" - android:clickable="true" - android:textColor="?attr/colorForegroundSecondary" - android:textIsSelectable="true" - android:textStyle="italic"/> -</LinearLayout> diff --git a/app/src/main/res/layout/widget_core_account.xml b/app/src/main/res/layout/widget_core_account.xml deleted file mode 100644 index eed51d830..000000000 --- a/app/src/main/res/layout/widget_core_account.xml +++ /dev/null @@ -1,77 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="@dimen/material_drawer_item_profile" - android:background="?attr/selectableItemBackground" - android:clickable="true" - android:orientation="horizontal"> - - <android.support.v7.widget.AppCompatRadioButton - android:id="@+id/account_select" - android:layout_width="@dimen/material_drawer_item_profile_icon_width" - android:layout_height="@dimen/material_drawer_item_profile_icon_width" - android:layout_gravity="center_vertical" - android:background="@android:color/transparent"/> - - <LinearLayout - android:layout_width="0dip" - android:layout_height="match_parent" - android:layout_margin="@dimen/material_drawer_item_profile_icon_padding_right" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:orientation="vertical"> - - <TextView - android:id="@+id/account_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_profile_text"/> - - <TextView - android:id="@+id/account_description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_profile_description"/> - </LinearLayout> - - <android.support.v7.widget.AppCompatImageButton - android:id="@+id/account_delete" - style="?attr/buttonStyleSmall" - android:layout_width="@dimen/material_drawer_item_profile_icon_width" - android:layout_height="@dimen/material_drawer_item_profile_icon_width" - android:layout_gravity="center_vertical" - android:background="?attr/selectableItemBackgroundBorderless" - android:tint="?attr/colorFill" - app:srcCompat="@drawable/ic_delete"/> -</LinearLayout> diff --git a/app/src/main/res/layout/widget_core_account_add.xml b/app/src/main/res/layout/widget_core_account_add.xml deleted file mode 100644 index bef572b71..000000000 --- a/app/src/main/res/layout/widget_core_account_add.xml +++ /dev/null @@ -1,77 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="@dimen/material_drawer_item_profile" - android:background="?attr/selectableItemBackground" - android:orientation="horizontal" - android:paddingEnd="@dimen/material_drawer_vertical_padding" - android:paddingLeft="@dimen/material_drawer_vertical_padding" - android:paddingRight="@dimen/material_drawer_vertical_padding" - android:paddingStart="@dimen/material_drawer_vertical_padding"> - - <LinearLayout - android:layout_width="@dimen/material_drawer_item_profile_icon_width" - android:layout_height="@dimen/material_drawer_item_profile" - android:paddingBottom="@dimen/material_drawer_item_profile_icon_padding" - android:paddingEnd="@dimen/material_drawer_item_profile_icon_padding_right" - android:paddingLeft="0dp" - android:paddingRight="@dimen/material_drawer_item_profile_icon_padding_right" - android:paddingStart="0dp" - android:paddingTop="@dimen/material_drawer_item_profile_icon_padding"> - - <ImageView - android:layout_width="32dp" - android:layout_height="32dp" - android:layout_gravity="center_vertical" - android:tint="?attr/colorFill" - app:srcCompat="@drawable/ic_add"/> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center_vertical|start" - android:orientation="vertical" - android:paddingEnd="0dp" - android:paddingLeft="@dimen/material_drawer_padding" - android:paddingRight="0dp" - android:paddingStart="@dimen/material_drawer_padding"> - - <TextView - android:id="@+id/account_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" - android:gravity="center_vertical|start" - android:lines="1" - android:paddingEnd="@dimen/material_drawer_item_primary_icon_padding_right" - android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right" - android:singleLine="true" - android:text="@string/actionAddAccount" - android:textSize="@dimen/material_drawer_item_profile_text"/> - </LinearLayout> -</LinearLayout> diff --git a/app/src/main/res/layout/widget_core_backend.xml b/app/src/main/res/layout/widget_core_backend.xml deleted file mode 100644 index 050825bfe..000000000 --- a/app/src/main/res/layout/widget_core_backend.xml +++ /dev/null @@ -1,66 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="?attr/selectableItemBackground" - android:clickable="true" - android:orientation="horizontal"> - - <android.support.v7.widget.AppCompatRadioButton - android:id="@+id/backend_select" - android:layout_width="@dimen/material_drawer_item_profile_icon_width" - android:layout_height="@dimen/material_drawer_item_profile_icon_width" - android:layout_gravity="top" - android:layout_marginBottom="12dp" - android:layout_marginTop="12dp" - android:background="@android:color/transparent"/> - - <LinearLayout - android:layout_width="0dip" - android:layout_height="wrap_content" - android:layout_margin="@dimen/material_drawer_item_profile_icon_padding_right" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:minHeight="56dp" - android:orientation="vertical"> - - <TextView - android:id="@+id/backend_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_profile_text"/> - - <TextView - android:id="@+id/backend_description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif" - android:gravity="center_vertical|start" - android:textSize="@dimen/material_drawer_item_profile_description"/> - </LinearLayout> -</LinearLayout> diff --git a/app/src/main/res/layout/widget_drawer_network.xml b/app/src/main/res/layout/widget_drawer_network.xml deleted file mode 100644 index 99ccea32a..000000000 --- a/app/src/main/res/layout/widget_drawer_network.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="@dimen/material_drawer_item_primary" - android:background="?attr/selectableItemBackground" - android:clickable="true" - android:gravity="center_vertical|start" - android:orientation="vertical" - android:paddingEnd="@dimen/material_drawer_vertical_padding" - android:paddingLeft="@dimen/material_drawer_vertical_padding" - android:paddingRight="@dimen/material_drawer_vertical_padding" - android:paddingStart="@dimen/material_drawer_vertical_padding"> - - <TextView - android:id="@+id/material_drawer_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_primary_text" - tools:text="Some drawer text"/> - -</LinearLayout> diff --git a/app/src/main/res/layout/widget_editor.xml b/app/src/main/res/layout/widget_editor.xml deleted file mode 100644 index 53b6ec420..000000000 --- a/app/src/main/res/layout/widget_editor.xml +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<RelativeLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:showIn="@layout/widget_slider"> - - <ScrollView - android:id="@+id/chatline_scroller" - android:layout_width="0dip" - android:layout_height="match_parent" - android:layout_above="@+id/formatting_toolbar_container" - android:layout_alignParentLeft="true" - android:layout_alignParentStart="true" - android:layout_alignParentTop="true" - android:layout_toLeftOf="@+id/send" - android:layout_toStartOf="@+id/send"> - - <android.support.v7.widget.AppCompatEditText - android:id="@+id/chatline" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:background="@android:color/transparent" - android:gravity="top" - android:hint="@string/labelPlaceholder" - android:inputType="textCapSentences|textShortMessage|textAutoCorrect" - android:paddingBottom="@dimen/chatlinePaddingVertical" - android:paddingLeft="20dp" - android:paddingRight="20dp" - android:paddingTop="@dimen/chatlinePaddingVertical" - android:textColor="?attr/colorForeground" - android:textSize="16sp"/> - - </ScrollView> - - <android.support.v7.widget.AppCompatImageButton - android:id="@+id/send" - style="?attr/buttonStyleSmall" - android:layout_width="?attr/actionBarSize" - android:layout_height="?attr/actionBarSize" - android:layout_alignParentEnd="true" - android:layout_alignParentRight="true" - android:layout_alignParentTop="true" - android:layout_gravity="top" - android:background="?attr/selectableItemBackgroundBorderless" - android:padding="12dp" - android:scaleType="fitXY" - android:tint="?attr/colorAccent" - app:srcCompat="@drawable/ic_send" - app:theme="@style/RippleOverlay"/> - - <android.support.design.widget.AppBarLayout - android:id="@+id/formatting_toolbar_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_alignParentBottom="true" - android:layout_alignParentLeft="true" - android:layout_alignParentStart="true" - android:background="?attr/colorBackgroundCard"> - - <android.support.v7.widget.Toolbar - android:id="@+id/formatting_toolbar" - android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize"> - - <android.support.v7.widget.ActionMenuView - android:id="@+id/formatting_menu" - android:layout_width="wrap_content" - android:layout_height="?attr/actionBarSize"/> - - </android.support.v7.widget.Toolbar> - - </android.support.design.widget.AppBarLayout> - -</RelativeLayout> diff --git a/app/src/main/res/layout/widget_identitynick.xml b/app/src/main/res/layout/widget_identitynick.xml deleted file mode 100644 index a11d229a1..000000000 --- a/app/src/main/res/layout/widget_identitynick.xml +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?selectableItemBackground" - android:clickable="true" - android:orientation="horizontal" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight"> - - <ImageView - android:id="@+id/drag_handle" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:tint="?attr/colorFill" - app:srcCompat="@drawable/ic_reorder"/> - - <TextView - android:id="@+id/text" - android:layout_width="0dip" - android:layout_height="match_parent" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="16sp"/> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_input_boolean.xml b/app/src/main/res/layout/widget_input_boolean.xml deleted file mode 100644 index 61734a309..000000000 --- a/app/src/main/res/layout/widget_input_boolean.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<android.support.v7.widget.AppCompatCheckBox - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/checkBox" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_input_string.xml b/app/src/main/res/layout/widget_input_string.xml deleted file mode 100644 index f641966db..000000000 --- a/app/src/main/res/layout/widget_input_string.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<android.support.design.widget.TextInputLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/inputLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <android.support.design.widget.TextInputEditText - android:id="@+id/editText" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> -</android.support.design.widget.TextInputLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_networkserver.xml b/app/src/main/res/layout/widget_networkserver.xml deleted file mode 100644 index 1102869b2..000000000 --- a/app/src/main/res/layout/widget_networkserver.xml +++ /dev/null @@ -1,62 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?selectableItemBackground" - android:clickable="true" - android:orientation="horizontal" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight"> - - <ImageView - android:id="@+id/lock" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:tint="?colorFill" - app:srcCompat="@drawable/ic_lock"/> - - <TextView - android:id="@+id/text" - android:layout_width="0dip" - android:layout_height="match_parent" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="16sp"/> - - <ImageView - android:id="@+id/drag_handle" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_gravity="center_vertical" - android:src="@drawable/ic_reorder" - android:tint="?attr/colorFill"/> - -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_nick.xml b/app/src/main/res/layout/widget_nick.xml deleted file mode 100644 index 9e9ee3ff8..000000000 --- a/app/src/main/res/layout/widget_nick.xml +++ /dev/null @@ -1,81 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?selectableItemBackground" - android:clickable="true" - android:orientation="horizontal" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight"> - - <TextView - android:id="@+id/mode" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - android:layout_marginTop="8dp" - android:background="@drawable/badge" - android:fontFamily="monospace" - android:gravity="center" - android:minWidth="40dp" - android:textColor="?colorBackground" - android:textStyle="bold" - tools:text="\@" - /> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_marginLeft="16dp" - android:layout_marginStart="16dp" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:orientation="vertical"> - - <TextView - android:id="@+id/nick" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_primary_text" - tools:text="justJanne"/> - - <TextView - android:id="@+id/realname" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_primary_description" - tools:text="Janne Koschinski: https://kuschku.de/"/> - </LinearLayout> -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_nick_away.xml b/app/src/main/res/layout/widget_nick_away.xml deleted file mode 100644 index 5b0fb2f3f..000000000 --- a/app/src/main/res/layout/widget_nick_away.xml +++ /dev/null @@ -1,85 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?selectableItemBackground" - android:clickable="true" - android:orientation="horizontal" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight"> - - <TextView - android:id="@+id/mode" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginBottom="8dp" - android:layout_marginTop="8dp" - android:background="@drawable/badge" - android:fontFamily="monospace" - android:gravity="center" - android:minWidth="40dp" - android:textColor="?colorBackground" - android:textStyle="bold" - tools:text="\@" - /> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_marginLeft="16dp" - android:layout_marginStart="16dp" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:orientation="vertical"> - - <TextView - android:id="@+id/nick" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textColor="?colorForegroundSecondary" - android:textSize="@dimen/material_drawer_item_primary_text" - android:textStyle="italic" - tools:text="justJanne"/> - - <TextView - android:id="@+id/realname" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textColor="?colorForegroundSecondary" - android:textSize="@dimen/material_drawer_item_primary_description" - android:textStyle="italic" - tools:text="Janne Koschinski: https://kuschku.de/"/> - </LinearLayout> -</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/widget_settings_alias.xml b/app/src/main/res/layout/widget_settings_alias.xml deleted file mode 100644 index 61adbd59b..000000000 --- a/app/src/main/res/layout/widget_settings_alias.xml +++ /dev/null @@ -1,58 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?selectableItemBackground" - android:clickable="true" - android:orientation="horizontal" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:orientation="vertical"> - - <TextView - android:id="@+id/alias_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif-medium" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_profile_text"/> - - <TextView - android:id="@+id/alias_description" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:fontFamily="sans-serif" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="@dimen/material_drawer_item_profile_description"/> - </LinearLayout> -</LinearLayout> diff --git a/app/src/main/res/layout/widget_settings_ignorerule.xml b/app/src/main/res/layout/widget_settings_ignorerule.xml deleted file mode 100644 index 649420af2..000000000 --- a/app/src/main/res/layout/widget_settings_ignorerule.xml +++ /dev/null @@ -1,51 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?selectableItemBackground" - android:clickable="true" - android:orientation="horizontal" - android:paddingLeft="?listPreferredItemPaddingLeft" - android:paddingRight="?listPreferredItemPaddingRight"> - - <TextView - android:id="@+id/text" - android:layout_width="0dip" - android:layout_height="match_parent" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:lines="1" - android:singleLine="true" - android:textSize="16sp"/> - - <android.support.v7.widget.SwitchCompat - android:id="@+id/active" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical"/> - -</LinearLayout> - diff --git a/app/src/main/res/layout/widget_settings_network.xml b/app/src/main/res/layout/widget_settings_network.xml deleted file mode 100644 index 66cc8d23f..000000000 --- a/app/src/main/res/layout/widget_settings_network.xml +++ /dev/null @@ -1,40 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="56dp" - android:background="?attr/selectableItemBackground" - android:clickable="true" - android:paddingLeft="16dp" - android:paddingRight="16dp"> - - <TextView - android:id="@+id/network_name" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:lines="1" - android:singleLine="true" - android:textSize="16sp"/> -</FrameLayout> - diff --git a/app/src/main/res/layout/widget_slider.xml b/app/src/main/res/layout/widget_slider.xml deleted file mode 100644 index 3320c668d..000000000 --- a/app/src/main/res/layout/widget_slider.xml +++ /dev/null @@ -1,85 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<com.sothree.slidinguppanel.SlidingUpPanelLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:id="@+id/sliding_layout_history" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:background="?attr/colorBackgroundCard" - android:clickable="false" - android:focusable="true" - android:gravity="bottom" - app:umanoFadeColor="?attr/colorBackground" - app:umanoOverlay="true" - app:umanoPanelHeight="0dip" - app:umanoScrollableView="@+id/msg_history" - app:umanoShadowHeight="0.0dip" - tools:showIn="@layout/activity_main"> - - - <include layout="@layout/widget_editor"/> - - <FrameLayout - android:id="@+id/card_panel" - android:layout_width="fill_parent" - android:layout_height="fill_parent"> - - <android.support.v7.widget.CardView - style="?attr/cardStyle" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:layout_marginBottom="16.0dip" - android:layout_marginLeft="16.0dip" - android:layout_marginRight="16.0dip" - android:layout_marginTop="16.0dip" - app:cardBackgroundColor="?attr/colorBackgroundCard"> - - <LinearLayout - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:orientation="vertical"> - - <TextView - android:layout_width="fill_parent" - android:layout_height="48.0dip" - android:gravity="center_vertical" - android:paddingLeft="16.0dip" - android:paddingRight="16.0dip" - android:text="@string/titleHistory" - android:textAppearance="@style/TextAppearance.AppCompat.Body2" - android:textColor="?attr/colorForegroundSecondary"/> - - <android.support.v7.widget.RecyclerView - android:id="@+id/msg_history" - android:layout_width="fill_parent" - android:layout_height="fill_parent"/> - - </LinearLayout> - - </android.support.v7.widget.CardView> - - </FrameLayout> - -</com.sothree.slidinguppanel.SlidingUpPanelLayout> diff --git a/app/src/main/res/layout/widget_spinner_item_inline.xml b/app/src/main/res/layout/widget_spinner_item_inline.xml deleted file mode 100644 index 53e21e0ce..000000000 --- a/app/src/main/res/layout/widget_spinner_item_inline.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@android:id/text1" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_vertical" - android:minHeight="48dp" - android:textAppearance="?android:attr/textAppearanceListItemSmall"/> diff --git a/app/src/main/res/layout/widget_spinner_item_toolbar.xml b/app/src/main/res/layout/widget_spinner_item_toolbar.xml deleted file mode 100644 index f7b95bc32..000000000 --- a/app/src/main/res/layout/widget_spinner_item_toolbar.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<TextView xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@android:id/text1" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_vertical" - android:minHeight="?attr/actionBarSize" - android:paddingLeft="16dp" - android:paddingRight="16dp" - android:textAppearance="?android:attr/textAppearanceListItemSmall"/> diff --git a/app/src/main/res/menu/chat.xml b/app/src/main/res/menu/chat.xml deleted file mode 100644 index 85f7aca9c..000000000 --- a/app/src/main/res/menu/chat.xml +++ /dev/null @@ -1,62 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/action_search" - android:title="@string/actionSearch" - app:actionViewClass="android.support.v7.widget.SearchView" - app:showAsAction="never|collapseActionView"/> - <item - android:id="@+id/action_hide_events" - android:title="@string/actionHideEvents" - app:showAsAction="never"/> - <item - android:id="@+id/action_settings" - android:title="@string/actionSettings" - app:showAsAction="never"/> - <item - android:id="@+id/action_networks" - android:title="@string/actionNetworks" - app:showAsAction="never"/> - <item - android:id="@+id/action_identities" - android:title="@string/actionIdentities" - app:showAsAction="never"/> - <item - android:id="@+id/action_ignorelist" - android:title="@string/actionIgnore" - app:showAsAction="never"/> - <item - android:id="@+id/action_aliaslist" - android:title="@string/actionAlias" - app:showAsAction="never"/> - <item - android:id="@+id/action_coreinfo" - android:title="@string/actionCore" - app:showAsAction="never"/> - <item - android:id="@+id/action_reauth" - android:title="@string/actionDisconnect" - app:showAsAction="never"/> -</menu> diff --git a/app/src/main/res/menu/chatlist.xml b/app/src/main/res/menu/chatlist.xml deleted file mode 100644 index 15df77cfa..000000000 --- a/app/src/main/res/menu/chatlist.xml +++ /dev/null @@ -1,38 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/action_join_channel" - android:icon="@drawable/ic_add" - android:title="@string/actionJoinChannel" - app:showAsAction="ifRoom"/> - <item - android:id="@+id/action_show_all" - android:checkable="true" - android:title="@string/actionShowHidden" - app:showAsAction="never"/> - <item - android:id="@+id/action_manage_chat_lists" - android:title="@string/actionManageChatLists" - app:showAsAction="never"/> -</menu> diff --git a/app/src/main/res/menu/confirm.xml b/app/src/main/res/menu/confirm.xml deleted file mode 100644 index 59afd08b1..000000000 --- a/app/src/main/res/menu/confirm.xml +++ /dev/null @@ -1,30 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/action_confirm" - android:icon="@drawable/ic_check" - android:title="@string/actionSave" - app:showAsAction="always"/> -</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/confirm_delete.xml b/app/src/main/res/menu/confirm_delete.xml deleted file mode 100644 index 5735b5b21..000000000 --- a/app/src/main/res/menu/confirm_delete.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/action_delete" - android:icon="@drawable/ic_delete" - android:title="@string/actionDelete" - app:showAsAction="always"/> - <item - android:id="@+id/action_confirm" - android:icon="@drawable/ic_check" - android:title="@string/actionSave" - app:showAsAction="always"/> -</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/context_buffer_network.xml b/app/src/main/res/menu/context_buffer_network.xml deleted file mode 100644 index f3b4c4845..000000000 --- a/app/src/main/res/menu/context_buffer_network.xml +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<menu xmlns:android="http://schemas.android.com/apk/res/android"> - <group - android:id="@+id/context_group_network"> - <item - android:id="@+id/context_menu_connect" - android:title="@string/actionConnect"/> - <item - android:id="@+id/context_menu_disconnect" - android:title="@string/actionDisconnect"/> - </group> - <group - android:id="@+id/context_group_buffer"> - <item - android:id="@+id/context_menu_join" - android:title="@string/actionJoin"/> - <item - android:id="@+id/context_menu_part" - android:title="@string/actionPart"/> - <item - android:id="@+id/context_menu_delete" - android:title="@string/actionDelete"/> - <item - android:id="@+id/context_menu_unhide" - android:title="@string/actionUnhide"/> - <item - android:id="@+id/context_menu_hide_temp" - android:title="@string/actionHideTemp"/> - <item - android:id="@+id/context_menu_hide_perm" - android:title="@string/actionHidePerm"/> - </group> -</menu> \ No newline at end of file diff --git a/app/src/main/res/menu/formatting.xml b/app/src/main/res/menu/formatting.xml deleted file mode 100644 index 7fe406abb..000000000 --- a/app/src/main/res/menu/formatting.xml +++ /dev/null @@ -1,195 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<menu xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <item - android:id="@+id/format_bold" - android:icon="@drawable/ic_format_bold" - android:title="@string/formatBold" - app:showAsAction="always"/> - <item - android:id="@+id/format_italic" - android:icon="@drawable/ic_format_italic" - android:title="@string/formatItalic" - app:showAsAction="always"/> - <item - android:id="@+id/format_underline" - android:icon="@drawable/ic_format_underline" - android:title="@string/formatUnderline" - app:showAsAction="always"/> - <item - android:id="@+id/format_paint" - android:icon="@drawable/ic_format_paint" - android:title="@string/formatColor" - app:showAsAction="always"> - <menu> - <item - android:id="@+id/paint_clear" - android:title="@string/colornameClear"/> - <item - android:id="@+id/paint_mircColor0" - android:icon="?attr/mircColor0" - android:title="@string/colornameMircColor0"/> - <item - android:id="@+id/paint_mircColor1" - android:icon="?attr/mircColor1" - android:title="@string/colornameMircColor1"/> - <item - android:id="@+id/paint_mircColor2" - android:icon="?attr/mircColor2" - android:title="@string/colornameMircColor2"/> - <item - android:id="@+id/paint_mircColor3" - android:icon="?attr/mircColor3" - android:title="@string/colornameMircColor3"/> - <item - android:id="@+id/paint_mircColor4" - android:icon="?attr/mircColor4" - android:title="@string/colornameMircColor4"/> - <item - android:id="@+id/paint_mircColor5" - android:icon="?attr/mircColor5" - android:title="@string/colornameMircColor5"/> - <item - android:id="@+id/paint_mircColor6" - android:icon="?attr/mircColor6" - android:title="@string/colornameMircColor6"/> - <item - android:id="@+id/paint_mircColor7" - android:icon="?attr/mircColor7" - android:title="@string/colornameMircColor7"/> - <item - android:id="@+id/paint_mircColor8" - android:icon="?attr/mircColor8" - android:title="@string/colornameMircColor8"/> - <item - android:id="@+id/paint_mircColor9" - android:icon="?attr/mircColor9" - android:title="@string/colornameMircColor9"/> - <item - android:id="@+id/paint_mircColorA" - android:icon="?attr/mircColorA" - android:title="@string/colornameMircColorA"/> - <item - android:id="@+id/paint_mircColorB" - android:icon="?attr/mircColorB" - android:title="@string/colornameMircColorB"/> - <item - android:id="@+id/paint_mircColorC" - android:icon="?attr/mircColorC" - android:title="@string/colornameMircColorC"/> - <item - android:id="@+id/paint_mircColorD" - android:icon="?attr/mircColorD" - android:title="@string/colornameMircColorD"/> - <item - android:id="@+id/paint_mircColorE" - android:icon="?attr/mircColorE" - android:title="@string/colornameMircColorE"/> - <item - android:id="@+id/paint_mircColorF" - android:icon="?attr/mircColorF" - android:title="@string/colornameMircColorF"/> - </menu> - </item> - <item - android:id="@+id/format_fill" - android:icon="@drawable/ic_format_fill" - android:title="@string/formatFill" - app:showAsAction="always"> - <menu> - <item - android:id="@+id/fill_clear" - android:title="@string/colornameClear"/> - <item - android:id="@+id/fill_mircColor0" - android:icon="?attr/mircColor0" - android:title="@string/colornameMircColor0"/> - <item - android:id="@+id/fill_mircColor1" - android:icon="?attr/mircColor1" - android:title="@string/colornameMircColor1"/> - <item - android:id="@+id/fill_mircColor2" - android:icon="?attr/mircColor2" - android:title="@string/colornameMircColor2"/> - <item - android:id="@+id/fill_mircColor3" - android:icon="?attr/mircColor3" - android:title="@string/colornameMircColor3"/> - <item - android:id="@+id/fill_mircColor4" - android:icon="?attr/mircColor4" - android:title="@string/colornameMircColor4"/> - <item - android:id="@+id/fill_mircColor5" - android:icon="?attr/mircColor5" - android:title="@string/colornameMircColor5"/> - <item - android:id="@+id/fill_mircColor6" - android:icon="?attr/mircColor6" - android:title="@string/colornameMircColor6"/> - <item - android:id="@+id/fill_mircColor7" - android:icon="?attr/mircColor7" - android:title="@string/colornameMircColor7"/> - <item - android:id="@+id/fill_mircColor8" - android:icon="?attr/mircColor8" - android:title="@string/colornameMircColor8"/> - <item - android:id="@+id/fill_mircColor9" - android:icon="?attr/mircColor9" - android:title="@string/colornameMircColor9"/> - <item - android:id="@+id/fill_mircColorA" - android:icon="?attr/mircColorA" - android:title="@string/colornameMircColorA"/> - <item - android:id="@+id/fill_mircColorB" - android:icon="?attr/mircColorB" - android:title="@string/colornameMircColorB"/> - <item - android:id="@+id/fill_mircColorC" - android:icon="?attr/mircColorC" - android:title="@string/colornameMircColorC"/> - <item - android:id="@+id/fill_mircColorD" - android:icon="?attr/mircColorD" - android:title="@string/colornameMircColorD"/> - <item - android:id="@+id/fill_mircColorE" - android:icon="?attr/mircColorE" - android:title="@string/colornameMircColorE"/> - <item - android:id="@+id/fill_mircColorF" - android:icon="?attr/mircColorF" - android:title="@string/colornameMircColorF"/> - </menu> - </item> - <item - android:id="@+id/action_history" - android:icon="@drawable/ic_history" - android:title="@string/actionHistory" - app:showAsAction="always"/> -</menu> diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml new file mode 100644 index 000000000..270a5385a --- /dev/null +++ b/app/src/main/res/menu/main.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item + android:id="@+id/settings" + android:title="Settings" /> +</menu> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..a5974a6db --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@color/colorPrimary" /> + <foreground android:drawable="@mipmap/ic_launcher_foreground" /> +</adaptive-icon> diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index a297d8b138c2dc4d71cd3885fb7a8e9e4df0433e..5d19d01e2a9565ff855235a4634b8bd24daaa613 100644 GIT binary patch delta 3214 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 A-2eap delta 3180 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 S7t|O40000<MNUMnLSTaaUn%?m diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..02c26625f31611975c75051ed370e17db10281b5 GIT binary patch literal 2884 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index 5926e041f285c84ffa1a4fcd5d6a68bbbf84cf2b..b6e188b22c7b077643f98ca38a6238ca278cbedd 100644 GIT binary patch delta 2513 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 bJP7h%soWqFZ?}lG00000NkvXXu0mjf#AUS^ delta 1950 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..0933974a71527c55ea40911ed82f942a2c1df2b2 GIT binary patch literal 2229 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 D4c9$5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index dc1cf779530adc6888c78d204adad727c879a900..aa674575a93548c660a13cb24434bf66e37f6384 100644 GIT binary patch delta 4581 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 P00000NkvXXu0mjf$7upp delta 4541 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 be=+!fuHSnxCkknN00000NkvXXu0mjfx+J=T diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..bffce7425871827e97999f996d14f14b855826fd GIT binary patch literal 4112 zcma)9hdUdL^A9O88(x%Bt5sBuqNJ)eB}QzjW?M1dw?d3svD(@+uTeWjwRWu<L9M1@ zrGii;R%-86d*tVRzW>1Qp6BkK`#jIxb9c|(^W4Rnz;s!ec$okI04r2a+w4+1{l^US zm-2Up|AR|)#YYor!Ei|^2IrVdo6$?p#s>gkf&IrcVg3oXF2U=*I!}DfJzaeLpLxRp z{{H^b?udVUUOe-HOM7~|W^X>?1pvT_P;Cv1fSiq-U|+7$*6#Lpl_f$>N(uxjB6Ee6 zm>T^Wysgh}_1Vq7p2<JfZmm_yzVc@6=IGxtqd`(uL(-*OI?PW@OiioXBx0m>p0a7H ztF!Rv3DG30YdS2+Ze@m0A1DcnXbH{F=UgEkqUS4GT?ft<_b@ZLt%vJM>Y9wVQ%(L~ zLdTwS3(zb?tDd2XF|pQ7dCCNg0MMxG>obAE6UWDI`~z@GWDW1WHCS2F$fph{si=@t z6BBb~iV?-yRTfBVU^5ss>2K-N0<wL^<$j3TkD(>9tbR@|&$NXQ$MRILUe6X}p>oy8 zLe`FVTcv-bOviWTlxihss@6^rp}9;^nlowqWf|17;ZIuhu&j9+0r>Jcw>`?zek!1* zqAcEnoJQnE1>2-aS&xl;ZAKmU^)utqhqO*Rszit4<mA6hEk{p1$X6dTqjYace)`>$ z)YV8GTi4{|j@NV6da}R2e~Se-K{lTy8(5`oIXKk2^yw5nKHd(2Xr$GLZS`4tW{Hm7 zPwcNHXce%5BQ@>P;Fa#Y5Tm^uqkB?!>-@;?f<aerq`Z5e2u1oij(r|SKy0t5FTYgA z-5dNhU!@#W@yfp|i6gkL&p35sGWcWdnUjzCk0B0xqIvg6^bPxr;FbJ}0^sf!-GwE% zBPMILAK5a65y<mFq_59Vf3Y@B9oUWf&nVoys`3eYeULT`=}LCXauF0)+Z`>=3)veW z8K_Rt{wU<R!WVT_Zc4H9x6sewu`wJKYlO&CM^i7-kYfpgCxXX;+(v%_9$|RDHhy%z z7;z_E>%zUo^5nZu_?mKBQ&_Cq;5H>C6%v8S@rfnJ;NUF;bMk<s3(YkUK#m8*QWt3~ zQioCu#EP69Mg$jM#RQ(#Q?t{vLp}*TIPFksY($U`)cglB_xcJj%D|WcMvTLC6=5S% zRMXU^pSFn7XnC0n>S(BltC4y}G~S$a6^Me;&q*`iqsdW5-HcD^tX}BH`5B~n1W+f! z_~wbdu=Z~Y-c1vNDKX+QGF#Cf3?^z@R-ahr7vYy<ef-S~S!Z+N6KafON(M_+*%(f^ zRa=5CUKod*v>}Qjd9eIZe2YU|M-;FWIVqyiDy&{vM#k^-Q~IJ|lJ*ek;#WeC%Jb#f zyJ}O_fg6;I@gF56G0<z@|7?0r9C*gKrJCCdvHejy`?VXLUU{^d7qyTQ+e!cAkfH?= zK0A&Gyz4J{yw;r8A2+<r`G&Z}x0|k}`cSOuA={T+Q-Yj&+5+v+hJ%qdf3s*-<r;II z{r*w8=lay&84mAxmWHChOrD2b>7X^{U332g9>v+>*El0#dHEN<9`>ZA`qB5@yu7>> z%Vx_Z8SrrNIIvm&yp1h#pyp!kbCryJ+YU4CkGKkQL3b7iNa_{LI9#n%3GU0C|2pSf zYQXl${|9zoz?L_F{dtF&DE-m-g(Uu$WO4H?U38f8Qbf8{`LbXP-PyJn-m}@Sv+v{t z?*Wr#6}0ljEf3+kxwwpsHm5W5>}6#;=5~IF-1I#4?ys$I&2?;@tS0eh!fk3^g8_s0 zzwZ28+A|`pdwt>J*(0=`z7sr_@-xxs{BsqlYkujw@Ie{V2j;Jwz8Gj}(SK<_{DRd{ z3@@13UQ|~jTRnZJLAFrWFzu_Pf>6mh=xWYL!5F91K9;7yL>wI>?O$elet}2(V$Uf> zVh!84_p~!u<kA|f=2P*fs{&y<$V#`B*N(>h^hFQf**2F8K-7~zLcMs9r@(>~18Y=W z|KqZsqwI*fSs?G?Bz0I(#}cjd7A9YO?#z;MA1%cvDQ`}=BN5lesDc2n+izHeVrzra z;mw-&MzNhBfKlTHzNo{cm<I$FxNj#UN~=i2#LLUJZx|CvgUjhN01GH}^nUt_@sYze zZeOCT+&FZB^F@2YA5B`0p&(FoiKCkE-K<Qu_-wBvb4qS9P}hSD|Cdrb$C#%#8{Lmi zSMJKlNzUodpe#-z+%@S20{<<`CWLnQ)~ty?l(<I!QJHJ=;=n|T^vLBa1=z9Z5nP`0 zoO7zuxwGM|7cIjLlYF+h9NW~?(bPzBXHCg0p*-{B0$}&Kb}@0O8>k9+Np2%<ao&1C z=%<5eS8#=rPd*koiN>|0UsfAV@)87SCviL#{ti~vTPpZB2%l+u^LKa<@7eZ+9H7J6 zc1()n`7`yN(y!aUQG!^VohUG1?A*(u%se3te&?Q4<->2_bR;6Fs#3TR{$3}Yiy3&M zI8=r&(EXj%+qb!|iA_e6pBX>!y<T=nXsIW;s@l#1J5pokyfM#5d{s)ArOiE5rdPIY z`>}b+cS*w$H5j$GuS}wgwT7-OeZA3fd!xVmEMMHwDchdDF(!tr{%5xRZ~&*){Bl0u zrdQQd7I0q?l8!ieK33*Pbf|`nPRTJkH-w@kwl&@`MLp;eV3Dv?jMn%bfW6}#j%E{* zA9!Z!U7O0zat%Ur`=n`iWrw9&vV5cz^?h3dCoDeQ!>L_2yLEnY3=*~9d&5mK3wc2o z5qKpcuvSj~F?D^h*EqCxvnjC6LMoBm40uZcs)vUDgu`TWE2^q$v7fXQHU?%Jr^J+$ z<Uild9Gs)iC|Y^2pqyV#<%#HIZd4z7O{D~*4et<$&8LPn3A{=#@!#kUr$jz7IEYi^ zs<`zG_KaRlTy%8Cg-oV${);ElQ!UJSwe^_>#@`A+@@r~#d^QKUc5eszEDp566Ld7# z2iX((HWvzIj=RQxXUe&M^Kf`_$L=qlB)ns2;PjJp197)@j0gGbGg$Rx!b0JF&*+4~ z>W#MHASx8fZbt0-FKTslb>F>&D$FY4xYrL7s0X9)z8G5G2zWHy^Q9{#De2*NR??jN z3ctPIsJJePH#^Iq5!JMjf&c!qJ9&v#%?|&-$@K5C3~xn_=ev*8NePggJ`igUzgoz| zcXsKj;o<Ac4%T~yFWxmUd2+OYWE{@2h40*fnqwMHUA8V*^%+8kS(I;RS<eC~?#%IK z=A$s9m{^+n`ff*g7A=G$OnbeP+O~%<HIv60a5R&NV0x`!;x&V*-jg@<c4dzfW>9<e zXg1Sm&|X$$c|7&tB#7)43BVIUp+{i>;h3}{F<{D#;2c@m{F0IqD^eX7%<o*LkGKBi zPzXt<V7$Ajvsu1pqNdz8(jzZW3GG2XTHlijvu3s4YcMj{+CF~7foZs_V$y~nEn?o6 zx!6oa%)A;*&z+uk(<E5wT%nCnQ-ad~?9||A6-{5l9!5ZEVtwAwEJ40u6z6u(;8aU# z1*0!GSwqryYqEd4!j^x$YQTP^8q1w#5h{D}6AL5r+(630`(}yz@}f3Vk;b2aTJdsn zw5oM{!Ci##uV26364tSqwGd+<git3l!;VHVV~HFhmJj)*oA0;Y3mwi8Q#|{pdp&DT z?A4Vw8n<~^By`c18^@<Dd4$t(Deyqp8M=ML|9szC$~8f0z!@>qbXpJo8HzN4^u$~{ z>uJjw<B*F_o^a7L<X-X~n5vcB($m-Xw&O2ed%VYNU`@S<jr8>V9VNoiw6T{-rU8g6 zBB4$KJU0OMpQ9FPqaROu;f}2Bq=j)SM}B^O3u7~iYn8)V7y3of1h;RXtih2WfrP>W z$txXkE5q71<<3H>EcRn>VEZ4IVJ(Ma^0}dV?*rR?4fM-A?n;05Tk?rEF6)S$Y;fX< zde$-GN1kYN?@i$I%-KH3oGs51RXblFrYfU8mNx5BbW;`XGlsM6LA1Pmd=3>L5TcwB z2|1o8bPu`v{qEBG#7QIEXUVWhf4fIOnu)~@(fjiY4g|QF=z}1Uhy?zpHpds)Iy%5y zr_07X;f;FMPNkd_r&T>|pJJe^6NnT%M*RhdYefcY6gC{pw_d;Q9)H6szA?@R!C(Hc z27X>_I};Glx%=5J&6$;63|DL05?!pI3~)+GT`aOrJKKz_v1U0ZhF)J$6a66X;8x_m zOT0L)(vf#nIkUc9asqW%+ot_+wVg83#W7}``qVH0zu=AWORD}*Qg1n0Z;Kus*_0S} zG(9nLU#Rh)o-(nu_*X1}Px%*wvRXrz?vM=mc&~j1OCbFDM+8bxCi`Dj;Q0%?(v;aA z<QDtaaMlY}LAP0Cm{xUJ+3Ep-K!6LNi@V33HCXDUE!3|;B(biW=H+lH&IAxjXy7`V zDHIAtA{?e|-AhZm686_UdK)}Oe*Sz<J?`QHON9h(ywbAbG@CGPps5K5S0A~mYb(E6 z_i}~rQ$4J#@Q?CjN^x=rn{hr@ZLI2APupyLh#}~6IJF?^>9Cf|BMPup1URv}5r$F< z2rxY;1TslCk1iSPviZqqlN*Hl<AP?Lj+@i1Dg%+DE!q8l@(VatUKs`{V>&=V1vG&0 z*DKR4#pt^iUHodfiuw7}A1f>FxG4k#vm(`fP%FvYT)BtG7Y(0-`qcvW6Ayo)w$b*w z3ih&vO08ah&+NScGqe^nuI7IzH4BP4@yUMcIIW<xgy$1AB=o}gvUAfO4zBIbH&0cv zXfRY|${Cp}NR{^rGUPHGz2VX=dl&ZQVD1Os49XK{I^|4nk;u`s?q*n_!=XB8D=+ln zGH8+H;;%`kSw#&x?7ZmBHwIGubU1Yj?X-7p-yc}uHE3GOjcZ{cf^5u3>YfmQn?l50 z_SvT`9Hs-+ZmV{A6g)VzYL(8fvee9_2*StE5Zkzg1O47EIy){Un59N!jrAu3VBAco zj;_-f8uedqJD-{*lbL&bg*!kehV<GNE_eFe5>Zi*9L5kn)xjkeKzK-+FnUxwFPAfS ze!XQoBCc)ZO1<T;EB<CFjUKv{Rh^&{XL{{AqTD>E{h!;xG_VkM)$q0~8un3}sC81; z{CzOn$2NMwWzywbVBl}%{9<EsNuC6C&uFk68$Cch@$;Hevq+Olajxn?=+W}2k%?`j z5t~jgM_?H9^3-+&vncRpS&g3x`CpObZ;-`lRzYs7%RFDK1?37urFTZ^=mz;HKyJJL zVPT{>c3Z<`%%$In^>=^X(Dr#Trk!afL2eh05i72SA}&4wv_wNl!{p`p!2R-nSmM1_ z2m40~&o}wEk(A46<Z39pDxZ=p2^rLDrBfZ`7JxpsmUg~&TX=U*9vKBjQCR>0noOPI z(9YZMws+3mU&A<}hn>EqZ#)hm!<^PBz!@S-jNawKheLN>gTtw6g>6<JL_o`hm)|=8 Mssq!m)O33Ne;~j5wg3PC literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 4ce14aeefb7fdfc8b0d9bb7f2f8951fd29382300..492b24a03b9f5bd11be31f080f212c3f0e8fb4a0 100644 GIT binary patch delta 7482 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 delta 7491 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 D*;u}B diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..67052223db8d8952a1f38e7747b3385285432f3d GIT binary patch literal 6812 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 9396ff5f6100a60cfc8739e9cf80e99a11349790..80078179202d507739ea648e0f43cd20e377eba1 100644 GIT binary patch literal 10878 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�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 ZHX3zUI8O=XGgcHuML|OzB5N7`e*j8mPjLVM literal 10855 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 HGVK2VN*#5$ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..66d0e209c647623c51d1d091376d511db70232f0 GIT binary patch literal 9911 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml deleted file mode 100644 index a68666e15..000000000 --- a/app/src/main/res/values-land/dimens.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <dimen name="chatlinePaddingVertical">13dp</dimen> -</resources> \ No newline at end of file diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml deleted file mode 100644 index 3b53a5e62..000000000 --- a/app/src/main/res/values-sw600dp/dimens.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <dimen name="action_bar_default_padding_start_material">8dp</dimen> - <dimen name="chatlinePaddingVertical">17dp</dimen> -</resources> diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml deleted file mode 100644 index 64c4e0800..000000000 --- a/app/src/main/res/values-w820dp/dimens.xml +++ /dev/null @@ -1,24 +0,0 @@ -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <dimen name="activity_horizontal_margin">64dp</dimen> -</resources> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml deleted file mode 100644 index 05ae0682b..000000000 --- a/app/src/main/res/values/attrs.xml +++ /dev/null @@ -1,95 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <!-- sender colors --> - - <attr name="senderColor0" format="color"/> - <attr name="senderColor1" format="color"/> - <attr name="senderColor2" format="color"/> - <attr name="senderColor3" format="color"/> - <attr name="senderColor4" format="color"/> - <attr name="senderColor5" format="color"/> - <attr name="senderColor6" format="color"/> - <attr name="senderColor7" format="color"/> - <attr name="senderColor8" format="color"/> - <attr name="senderColor9" format="color"/> - <attr name="senderColorA" format="color"/> - <attr name="senderColorB" format="color"/> - <attr name="senderColorC" format="color"/> - <attr name="senderColorD" format="color"/> - <attr name="senderColorE" format="color"/> - <attr name="senderColorF" format="color"/> - - <!-- mirc colors --> - - <attr name="mircColor0" format="color"/> - <attr name="mircColor1" format="color"/> - <attr name="mircColor2" format="color"/> - <attr name="mircColor3" format="color"/> - <attr name="mircColor4" format="color"/> - <attr name="mircColor5" format="color"/> - <attr name="mircColor6" format="color"/> - <attr name="mircColor7" format="color"/> - <attr name="mircColor8" format="color"/> - <attr name="mircColor9" format="color"/> - <attr name="mircColorA" format="color"/> - <attr name="mircColorB" format="color"/> - <attr name="mircColorC" format="color"/> - <attr name="mircColorD" format="color"/> - <attr name="mircColorE" format="color"/> - <attr name="mircColorF" format="color"/> - - <!-- Background and foreground colors for UI --> - - <attr name="colorForeground" format="color"/> - <attr name="colorForegroundHighlight" format="color"/> - <attr name="colorForegroundSecondary" format="color"/> - <attr name="colorForegroundAction" format="color"/> - <attr name="colorForegroundError" format="color"/> - - <attr name="colorForegroundMirc" format="integer"/> - - <attr name="colorAccentFocus" format="color"/> - <attr name="colorDivider" format="color"/> - - <attr name="colorBackground" format="color"/> - <attr name="colorBackgroundHighlight" format="color"/> - <attr name="colorBackgroundSecondary" format="color"/> - <attr name="colorBackgroundCard" format="color"/> - <attr name="colorBackgroundDialog" format="color"/> - - <!-- Tint colors for drawer --> - - <attr name="colorTintActivity" format="color"/> - <attr name="colorTintMessage" format="color"/> - <attr name="colorTintHighlight" format="color"/> - <attr name="chatlineExpandedSize"/> - - <!-- Icons --> - <attr name="colorOffline" format="color"/> - <attr name="colorAway" format="color"/> - <attr name="colorFill" format="color"/> - - <attr name="formatBarTheme" format="reference"/> - <attr name="cardStyle" format="reference"/> -</resources> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d877d19e9..9e55d323e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,37 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - <resources> - <color name="colorPrimary">#0271B3</color> - <color name="colorPrimaryDark">#02588c</color> - <color name="colorAccent">#afb42b</color> - <color name="colorAccentFocus">#40afb42b</color> - - <color name="colorFillLight">#757575</color> - <color name="colorFillDark">#ffffff</color> - - <color name="colorOfflineLight">#757575</color> - <color name="colorOfflineDark">#B3B3B3</color> - - <color name="colorAwayLight">#959595</color> - <color name="colorAwayDark">#939393</color> + <color name="colorPrimary">#0a70c0</color> + <color name="colorPrimaryDark">#105a94</color> + <color name="colorAccent">#afb42b</color> </resources> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml deleted file mode 100644 index 0199718e1..000000000 --- a/app/src/main/res/values/dimens.xml +++ /dev/null @@ -1,32 +0,0 @@ -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <!-- Default screen margins, per the Android Design guidelines. --> - <dimen name="activity_horizontal_margin">16dp</dimen> - <dimen name="activity_vertical_margin">16dp</dimen> - - <dimen name="message_horizontal">8dp</dimen> - <dimen name="message_vertical">2dp</dimen> - - <dimen name="action_bar_default_padding_start_material">0dp</dimen> - <dimen name="chatlinePaddingVertical">17dp</dimen> -</resources> diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml deleted file mode 100644 index 046d53ec0..000000000 --- a/app/src/main/res/values/ids.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <item name="custom_url_span" type="id"/> - <item name="custom_channel_span" type="id"/> - <item name="item_create_account" type="id"/> - <item name="item_account" type="id"/> - <item name="item_backend" type="id"/> -</resources> diff --git a/app/src/main/res/values/preferences.xml b/app/src/main/res/values/preferences.xml deleted file mode 100644 index bc7c18200..000000000 --- a/app/src/main/res/values/preferences.xml +++ /dev/null @@ -1,63 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <string name="preference_last_account" translatable="false">preference_last_account</string> - - <string name="preference_font_size" translatable="false">preference_font_size</string> - - <string name="preference_theme" translatable="false">preference_theme</string> - <string name="preference_theme_title">Theme</string> - - <string name="preference_colors" translatable="false">preference_colors</string> - <string name="preference_colors_title">Use mIRC Colors</string> - <string name="preference_colors_summary_on">Strip mIRC colors from messages</string> - <string name="preference_colors_summary_off">Show mIRC colors in messages</string> - - <string name="preference_hostmask" translatable="false">preference_hostname</string> - <string name="preference_hostmask_title">Show Hostmask in Messages</string> - <string name="preference_hostmask_summary_on">Show the full hostmask in server actions (Join, Part, Quit, etc)</string> - <string name="preference_hostmask_summary_off">Show only the username in server actions (Join, Part, Quit, etc)</string> - - <string name="preference_lag" translatable="false">preference_lag</string> - <string name="preference_lag_title">Show Connection Lag</string> - <string name="preference_lag_summary_on">Show the latency between core and client in the action bar</string> - <string name="preference_lag_summary_off">Don’t show the latency between core and client</string> - - <string name="preference_brackets" translatable="false">preference_brackets</string> - <string name="preference_brackets_title">Classical Nick Style</string> - <string name="preference_brackets_summary_on">Show nicks between brackes in chat</string> - <string name="preference_brackets_summary_off">Show plain nicks in chat</string> - - <string-array name="preference_theme_entries"> - <item>@string/themeQuasselLightName</item> - <item>@string/themeQuasselDarkName</item> - <item>@string/themeSolarizedLightName</item> - <item>@string/themeSolarizedDarkName</item> - </string-array> - <string-array name="preference_theme_values"> - <item>@string/themeQuasselLightId</item> - <item>@string/themeQuasselDarkId</item> - <item>@string/themeSolarizedLightId</item> - <item>@string/themeSolarizedDarkId</item> - </string-array> -</resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6b5d0c2a6..771ed5d69 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,66 +1,6 @@ -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - <resources> - <string name="appName">QuasselDroid</string> - <string name="appDescription">An Android-based client for the decentralized Quassel IRC client.</string> - <string name="appDescriptionLong">Quassel is a distributed, decentralized IRC client, written using C++ and Qt. QuasselDroid is a pure-java client for the Quassel core, allowing you to connect to your Quassel core using your Android™ phone.</string> - <string name="appLinkCommunityTitle">Google+</string> - <string name="appLinkCommunityUrl" translatable="false">https://plus.google.com/communities/104094956084217666662</string> - <string name="appLinkGithubTitle">GitHub</string> - <string name="appLinkGithubUrl" translatable="false">https://github.com/sandsmark/QuasselDroid</string> - - <string name="notificationReportCrash">Reporting Crashes</string> - - <string name="defaultPort" translatable="false">4242</string> - <string name="labelAllNetworks">All Networks</string> - <string name="labelNoTopic">No Topic Set</string> - <string name="labelPlaceholder">Write a message…</string> - <string name="labelUserOnHost">%1$s on %2$s</string> - - <string name="confirmationCertficate">Do you trust this certificate?</string> - <string name="confirmationDelete">Are you sure you want to delete "%1$s"?</string> - <string name="confirmationUnsavedChanges">There are unsaved changes on the current configuration page. Would you like to apply your changes now?</string> - - <string name="formatBold">Bold</string> - <string name="formatColor">Text Color</string> - <string name="formatFill">Background Color</string> - <string name="formatItalic">Italic</string> - <string name="formatUnderline">Underline</string> - - <string name="labelAccountName">Account Name</string> - <string name="labelAccountPassword">Password</string> - <string name="labelAccountUsername">Username</string> - - <string name="labelCoreHostname">Hostname</string> - <string name="labelCorePort">Port</string> - - <string name="labelLoginPassword">Password</string> - <string name="labelLoginUsername">Username</string> - - <string name="statusBacklog">Loading Chat History</string> - <string name="statusConnected">Connected</string> - <string name="statusConnecting">Connecting</string> - <string name="statusDisconnected">Connection lost</string> - <string name="statusHandshake">Logging in</string> - <string name="statusInitData">Loading Networks and Channels</string> - <string name="statusWelcome">Welcome!</string> + <string name="app_name">QuasselDroidNG Test</string> + <string name="connection_service">Connection Service</string> + <string name="connection_service_description">Keeps a connection to your core to allow for notifications, and to transmit messages.</string> + <string name="crash_text">\"QD-NG has crashed\"</string> </resources> diff --git a/app/src/main/res/values/strings_actions.xml b/app/src/main/res/values/strings_actions.xml deleted file mode 100644 index ab5ab0d3b..000000000 --- a/app/src/main/res/values/strings_actions.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - - <string name="actionAddAccount">Add Account</string> - <string name="actionAlias">Aliases</string> - <string name="actionCancel">Cancel</string> - <string name="actionClose">Close</string> - <string name="actionCore">About Core…</string> - <string name="actionConnect">Connect</string> - <string name="actionDelete">Delete</string> - <string name="actionDisconnect">Disconnect</string> - <string name="actionEditNicks">Edit Nicks</string> - <string name="actionEditServers">Edit Servers</string> - <string name="actionEditTopic">Edit Topic</string> - <string name="actionHideEvents">Hide Events</string> - <string name="actionHidePerm">Hide Permanently</string> - <string name="actionHideTemp">Hide Temporarily</string> - <string name="actionHistory">Input History</string> - <string name="actionIdentities">Identities</string> - <string name="actionIgnore">Ignore List</string> - <string name="actionJoin">Join</string> - <string name="actionJoinChannel">Join Channel</string> - <string name="actionLogin">Login</string> - <string name="actionManageChatLists">Manage Chat Lists</string> - <string name="actionNetworks">Networks</string> - <string name="actionNo">No</string> - <string name="actionPart">Part</string> - <string name="actionSave">Save</string> - <string name="actionSearch">Find in Buffer</string> - <string name="actionSettings">Settings</string> - <string name="actionShowHidden">Show Hidden</string> - <string name="actionUnhide">Make Visible</string> - <string name="actionYes">Yes</string> -</resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings_chanmodes.xml b/app/src/main/res/values/strings_chanmodes.xml deleted file mode 100644 index 26986d799..000000000 --- a/app/src/main/res/values/strings_chanmodes.xml +++ /dev/null @@ -1,140 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - - <string name="chanMode_RESTRICT_TOPIC_NAME">Restrict Topic</string> - <string name="chanMode_RESTRICT_TOPIC_DESCRIPTION">Only channel ops can edit the topic.</string> - - <string name="chanMode_BLOCK_COLORS_NAME">Block Colors</string> - <string name="chanMode_BLOCK_COLORS_DESCRIPTION">Messages containing color codes are blocked, as if the user was muted.</string> - - <string name="chanMode_STRIP_COLORS_NAME">Strip Colors</string> - <string name="chanMode_STRIP_COLORS_DESCRIPTION">All messages are stripped from color and control codes.</string> - - <string name="chanMode_ONLY_INVITE_NAME">Invite Only</string> - <string name="chanMode_ONLY_INVITE_DESCRIPTION">Only invited users can join the channel.</string> - - <string name="chanMode_ONLY_SSL_NAME">SSL only</string> - <string name="chanMode_ONLY_SSL_DESCRIPTION">Only users connected via SSL can join the channel.</string> - - <string name="chanMode_UNLISTED_NAME">Unlisted</string> - <string name="chanMode_UNLISTED_DESCRIPTION">The channel will not be listed anywhere.</string> - - <string name="chanMode_BLOCK_UNIDENTIFIED_NAME">Block Unidentified</string> - <string name="chanMode_BLOCK_UNIDENTIFIED_DESCRIPTION">Blocks unidentified users from joining the channel.</string> - - <string name="chanMode_PARANOID_NAME">Paranoid</string> - <string name="chanMode_PARANOID_DESCRIPTION">Disables the KNOCK command and the channel will not be shown in whois replies. Additionally, the channel won’t show up in listings.</string> - - <string name="chanMode_REGISTERED_NAME">Registered</string> - <string name="chanMode_REGISTERED_DESCRIPTION">The channel is registered with channel services.</string> - - <string name="chanMode_MODERATED_NAME">Moderated</string> - <string name="chanMode_MODERATED_DESCRIPTION">Blocks users without voice from talking.</string> - - <string name="chanMode_BLOCK_EXTERNAL_NAME">Block External</string> - <string name="chanMode_BLOCK_EXTERNAL_DESCRIPTION">Blocks users not in the channel from sending messages to it.</string> - - <string name="chanMode_ANTIFLOOD_NAME">Flood Protection</string> - <string name="chanMode_ANTIFLOOD_DESCRIPTION">Prevents users from flooding the channel with messages.</string> - - <string name="chanMode_PASSWORD_NAME">Password Protection</string> - <string name="chanMode_PASSWORD_DESCRIPTION">Users will have to enter a password to join the channel.</string> - - <string name="chanMode_LIMIT_NAME">Channel Limit</string> - <string name="chanMode_LIMIT_DESCRIPTION">Sets a maximum limit for users in the channel.</string> - - <string name="chanMode_REDUCED_MODERATION_NAME">Reduced Moderation</string> - <string name="chanMode_REDUCED_MODERATION_DESCRIPTION">Messages normally muted are still visible to ops.</string> - - <string name="chanMode_BLOCK_NOTICE_NAME">Block Notices</string> - <string name="chanMode_BLOCK_NOTICE_DESCRIPTION">Prevent notices from being sent to the channel.</string> - - <string name="chanMode_DISABLE_INVITE_NAME">Disable Invites</string> - <string name="chanMode_DISABLE_INVITE_DESCRIPTION">Prevents users from inviting others into the channel.</string> - - <string name="chanMode_AUDITORIUM_NAME">Auditorium Mode</string> - <string name="chanMode_AUDITORIUM_DESCRIPTION">Users can only see ops and themselves.</string> - - <string name="chanMode_QUIET_UNIDENTIFIED_NAME">Quit Unidentified</string> - <string name="chanMode_QUIET_UNIDENTIFIED_DESCRIPTION">Prevent unidentified users from sending messages.</string> - - <string name="chanMode_BLOCK_KICK_NAME">Block Kicks</string> - <string name="chanMode_BLOCK_KICK_DESCRIPTION">Prevents users from being kicked from the channel.</string> - - <string name="chanMode_PERMANENT_NAME">Permanent Channel</string> - <string name="chanMode_PERMANENT_DESCRIPTION">The channel is not deleted, even when all users leave.</string> - - <string name="chanMode_ONLY_OPER_NAME">IRC Operators Only</string> - <string name="chanMode_ONLY_OPER_DESCRIPTION">Allows only IRC Operators to join the channel.</string> - - <string name="chanMode_ONLY_HELPOPER_NAME">IRC Help Staff Only</string> - <string name="chanMode_ONLY_HELPOPER_DESCRIPTION">Allows only IRC Help Staff to join the channel.</string> - - <string name="chanMode_BLOCK_NICKCHANGE_NAME">Block Nick Changes</string> - <string name="chanMode_BLOCK_NICKCHANGE_DESCRIPTION">Prevents users from changing their nick while being in the channel.</string> - - <string name="chanMode_JOIN_THROTTLE_NAME">Limit Joins</string> - <string name="chanMode_JOIN_THROTTLE_DESCRIPTION">Sets a limit for how many users may join the channel per specified timespan.</string> - - <string name="chanMode_ALLOW_INVITE_NAME">Allow Invite</string> - <string name="chanMode_ALLOW_INVITE_DESCRIPTION">Anyone can invite users to this channel.</string> - - <string name="chanMode_BLOCK_FORWARDING_NAME">Block Forwarding</string> - <string name="chanMode_BLOCK_FORWARDING_DESCRIPTION">Prevent other channels from forwarding to this channel.</string> - - <string name="chanMode_ALLOW_FORWARD_NAME">Allow Forward</string> - <string name="chanMode_ALLOW_FORWARD_DESCRIPTION">Anyone can forward to this channel.</string> - - <string name="chanMode_BLOCK_ACTION_NAME">Block Action</string> - <string name="chanMode_BLOCK_ACTION_DESCRIPTION">Prevents users from using /me in the channel.</string> - - <string name="chanMode_BLOCK_CAPS_NAME">Block Caps</string> - <string name="chanMode_BLOCK_CAPS_DESCRIPTION">Prevents users from sending all-caps messages.</string> - - <string name="chanMode_BLOCK_KNOCK_NAME">Block Knock</string> - <string name="chanMode_BLOCK_KNOCK_DESCRIPTION">Prevents users from using /KNOCK to request an invite.</string> - - <string name="chanMode_CENSOR_NAME">Enable Badwords Filter</string> - <string name="chanMode_CENSOR_DESCRIPTION">Uses the network censor to block messages containing blocked words.</string> - - <string name="chanMode_HIDE_JOINS_NAME">Hide Joins</string> - <string name="chanMode_HIDE_JOINS_DESCRIPTION">Users are hidden until they speak.</string> - - <string name="chanMode_BLOCK_REPEAT_NAME">Block Repeat Messages</string> - <string name="chanMode_BLOCK_REPEAT_DESCRIPTION">Prevents users from sending the same message repeatedly.</string> - - <string name="chanMode_BLOCK_AUTOREJOIN_NAME">Block Autorejoin</string> - <string name="chanMode_BLOCK_AUTOREJOIN_DESCRIPTION">Prevents users from automatically joining after they have been kicked.</string> - - <string name="chanMode_IS_SECURE_NAME">Secure Channel</string> - <string name="chanMode_IS_SECURE_DESCRIPTION">All users in the channel are joined via SSL.</string> - - <string name="chanMode_BLOCK_CTCP_NAME">Block CTCP</string> - <string name="chanMode_BLOCK_CTCP_DESCRIPTION">Block CTCP messages from the channel.</string> - - <string name="chanMode_ONLY_ADMIN_NAME">Admin Only</string> - <string name="chanMode_ONLY_ADMIN_DESCRIPTION">Allow only IRC admins to join the channel.</string> - - <string name="chanMode_FORWARD_NAME">Forward</string> - <string name="chanMode_FORWARD_DESCRIPTION">Forward users who can’t join the channel to another channel.</string> -</resources> diff --git a/app/src/main/res/values/strings_coresettings.xml b/app/src/main/res/values/strings_coresettings.xml deleted file mode 100644 index 6797493ad..000000000 --- a/app/src/main/res/values/strings_coresettings.xml +++ /dev/null @@ -1,114 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - - <string name="labelAliasExpansion">Expansion</string> - <string name="labelAliasName">Alias</string> - - <string name="labelChatlistAddNewChatsAutomatically">Add new chats automatically</string> - <string name="labelChatlistHideInactiveChats">Hide inactive chats</string> - <string name="labelChatlistHideInactiveNetworks">Hide inactive networks</string> - <string name="labelChatlistMinimumActivity">Minimum Activity</string> - <string name="labelChatlistName">Name</string> - <string name="labelChatlistNetwork">Network</string> - <string name="labelChatlistShowChannels">Show channels</string> - <string name="labelChatlistShowQueries">Show queries</string> - <string name="labelChatlistSortAlphabetically">Sort alphabetically</string> - - <string name="labelChatlistMinimumActivityNone">labelChatlistMinimumActivityNone</string> - <string name="labelChatlistMinimumActivityOther">labelChatlistMinimumActivityOther</string> - <string name="labelChatlistMinimumActivityMessage">labelChatlistMinimumActivityMessage</string> - <string name="labelChatlistMinimumActivityHighlight">labelChatlistMinimumActivityHighlight</string> - - <string name="labelIdentityAway">Away</string> - <string name="labelIdentityAwayReason">Reason</string> - <string name="labelIdentityDetachAway">Away on Detach</string> - <string name="labelIdentityDetachAwayReason">Reason</string> - <string name="labelIdentityIdent">Ident</string> - <string name="labelIdentityKickReason">Kick Reason</string> - <string name="labelIdentityMessages">Messages</string> - <string name="labelIdentityName">Identity Name</string> - <string name="labelIdentityPartReason">Part Reason</string> - <string name="labelIdentityQuitReason">Quit Reason</string> - <string name="labelIdentityRealName">Real Name</string> - - <string name="labelIgnoreRule">Ignore Rule</string> - <string name="labelIgnoreRuleIsRegEx">Regular Expression</string> - <string name="labelIgnoreRuleScope">Scope</string> - <string name="labelIgnoreRuleStrictness">Strictness</string> - <string name="labelIgnoreRuleType">Rule Type</string> - - <string name="labelIgnoreStrictnessUnmatched">Unmatched</string> - <string name="labelIgnoreStrictnessSoft">Dynamic</string> - <string name="labelIgnoreStrictnessHard">Permanent</string> - - <string name="labelIgnoreRuleSender">Sender</string> - <string name="labelIgnoreRuleMessage">Message</string> - <string name="labelIgnoreRuleCtcp">CTCP</string> - - <string name="labelIgnoreScopeGlobal">Global</string> - <string name="labelIgnoreScopeNetwork">Network</string> - <string name="labelIgnoreScopeChannel">Channel</string> - - <string name="labelNetworkAutoIdentify">Auto Identify</string> - <string name="labelNetworkAutoIdentifyPassword">Password</string> - <string name="labelNetworkAutoIdentifyService">Service</string> - <string name="labelNetworkAutoReconnect">Auto Reconnect</string> - <string name="labelNetworkAutoReconnectInterval">Interval</string> - <string name="labelNetworkAutoReconnectRetries">Retries</string> - <string name="labelNetworkAutoReconnectRetriesUnlimited">Unlimited Retries</string> - <string name="labelNetworkCodecForDecoding">Decoding</string> - <string name="labelNetworkCodecForEncoding">Encoding</string> - <string name="labelNetworkCodecForServer">Server</string> - <string name="labelNetworkCustomCodecs">Custom Codecs</string> - <string name="labelNetworkIdentity">Identity</string> - <string name="labelNetworkName">Network Name</string> - <string name="labelNetworkRejoinChannels">Rejoin Channels</string> - <string name="labelNetworkSasl">SASL</string> - <string name="labelNetworkSaslAccount">Account</string> - <string name="labelNetworkSaslPassword">Password</string> - - <string name="labelNetworkServerHost">Host</string> - <string name="labelNetworkServerPassword">Password</string> - <string name="labelNetworkServerPort">Port</string> - <string name="labelNetworkServerProxy">Proxy</string> - <string name="labelNetworkServerProxyHost">Host</string> - <string name="labelNetworkServerProxyPassword">Password</string> - <string name="labelNetworkServerProxyPort">Port</string> - <string name="labelNetworkServerProxyType">Type</string> - <string name="labelNetworkServerProxyUser">User</string> - <string name="labelNetworkServerUseSSL">SSL</string> - - <string name="labelNetworkServerProxyDefault">Default Proxy</string> - <string name="labelNetworkServerProxySocks5">Socks5</string> - <string name="labelNetworkServerProxyHttp">Http</string> - - <string name="labelCoreUptimeValue">This core has been online since %1$s</string> - <string name="labelCoreUptime">Uptime</string> - <string name="labelCoreConnectedClients">Connected Clients</string> - <string name="labelCoreConnectedCientsValue">At the moment, %1d clients are logged in as you.</string> - <string name="labelCoreVersion">Core Version</string> - <string name="labelCoreCertificate">Certificate</string> - <string name="labelCoreAddress">Address</string> - <string name="labelCoreVerifier">The connection is verified by %1$s</string> -</resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings_format.xml b/app/src/main/res/values/strings_format.xml deleted file mode 100644 index e8a914ce5..000000000 --- a/app/src/main/res/values/strings_format.xml +++ /dev/null @@ -1,71 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <!-- Message format strings --> - <string name="usernameHostmask">%1$s (%2$s)</string> - - <string name="messagePlain">%1$s: %2$s</string> - - <string name="messageJoin">%1$s has joined %2$s</string> - - <string name="messagePart">%1$s has left %2$s</string> - <string name="messagePartExtra">"%1$s has left %2$s (%3$s)</string> - - <string name="messageQuit">%1$s has quit</string> - <string name="messageQuitExtra">%1$s has quit (%2$s)</string> - - <string name="messageKill">%1$s has killed %2$s</string> - <string name="messageKillExtra">%1$s has killed %2$s: %3$s</string> - - <string name="messageKick">%1$s has kicked %2$s from %3$s</string> - <string name="messageKickExtra">%1$s has kicked %2$s from %3$s: %4$s</string> - - <string name="messageMode">Mode %1$s by %2$s</string> - - <string name="messageNickSelf">You are now known as %1$s</string> - <string name="messageNickOther">%1$s is now known as %2$s</string> - - <string name="messageDayChange">{ Day changed to %1$s }</string> - - <string name="messageAction">* %1$s %2$s</string> - - <string name="messageTopic">%1$s has changed topic for %2$s to: "%3$s"</string> - - <string name="colornameClear">Remove Styling</string> - <string name="colornameMircColor0">White</string> - <string name="colornameMircColor1">Black</string> - <string name="colornameMircColor2">Blue</string> - <string name="colornameMircColor3">Green</string> - <string name="colornameMircColor4">Light Red</string> - <string name="colornameMircColor5">Brown</string> - <string name="colornameMircColor6">Purple</string> - <string name="colornameMircColor7">Orange</string> - <string name="colornameMircColor8">Yellow</string> - <string name="colornameMircColor9">Light Green</string> - <string name="colornameMircColorA">Cyan</string> - <string name="colornameMircColorB">Light Cyan</string> - <string name="colornameMircColorC">Light Blue</string> - <string name="colornameMircColorD">Pink</string> - <string name="colornameMircColorE">Grey</string> - <string name="colornameMircColorF">Light Grey</string> -</resources> diff --git a/app/src/main/res/values/strings_setup.xml b/app/src/main/res/values/strings_setup.xml deleted file mode 100644 index 7012cca26..000000000 --- a/app/src/main/res/values/strings_setup.xml +++ /dev/null @@ -1,41 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <string name="slideAccountSelectTitle">Select Account</string> - <string name="slideAccountSelectDescription">Please select an account from the list or add one</string> - - <string name="slideAccountCoreTitle">The Core</string> - <string name="slideAccountCoreDescription">First, please choose which server your core is hosted on.</string> - - <string name="slideAccountUserTitle">Your Account</string> - <string name="slideAccountUserDescription">Now, please enter the username and password for your account on the core. If you just created that core, we’ll set up this account for you</string> - - <string name="slideAccountNameTitle">Customize Account</string> - <string name="slideAccountNameDescription">Give this account a name and icon</string> - - <string name="slideCoreBackendSelectTitle">Select Storage Backend</string> - <string name="slideCoreBackendSelectDescription">Please select a database backend for the Quassel Core storage to store the backlog and other data in.</string> - - <string name="slideCoreBackendSetupTitle">Configure Storage Backend</string> - <string name="slideCoreBackendSetupDescription">Please configure the selected database backend.</string> -</resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings_titles.xml b/app/src/main/res/values/strings_titles.xml deleted file mode 100644 index a6d2f907b..000000000 --- a/app/src/main/res/values/strings_titles.xml +++ /dev/null @@ -1,49 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <string name="titleAccountSelection">Account Selection</string> - <string name="titleAccountSetup">Account Setup</string> - <string name="titleEditAlias">Edit Alias</string> - <string name="titleEditAliases">Edit Aliases</string> - <string name="titleChannelDetails">Channel Details</string> - <string name="titleChannelModes">Channel Modes</string> - <string name="titleCoreSetup">Core Setup</string> - <string name="titleCreateChatList">Create Chat List</string> - <string name="titleCreateIdentity">Create Identity</string> - <string name="titleCreateNetwork">Create Network</string> - <string name="titleEditChatList">Edit Chat List</string> - <string name="titleEditChatLists">Edit Chat Lists</string> - <string name="titleEditIdentities">Edit Identities</string> - <string name="titleEditIdentity">Edit Identity</string> - <string name="titleEditIgnoreRule">Edit Ignore Rule</string> - <string name="titleEditIgnoreList">Edit Ignore List</string> - <string name="titleEditNetwork">Edit Network</string> - <string name="titleEditNetworkServer">Edit NetworkServer</string> - <string name="titleEditNetworkServers">Edit NetworkServers</string> - <string name="titleEditNetworks">Edit Networks</string> - <string name="titleEditNicks">Edit Nicks</string> - <string name="titleHistory">Input History</string> - <string name="titleLogin">Login</string> - <string name="titleSettings">Settings</string> - <string name="titleTopic">Topic</string> -</resources> \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f645b9635..3c8869669 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,171 +1,24 @@ -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - <resources> - <!-- Base application theme. --> - <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> - <!-- Customize your theme here. --> - <item name="colorPrimary">@color/colorPrimary</item> - <item name="colorPrimaryDark">@color/colorPrimaryDark</item> - <item name="colorAccent">@color/colorAccent</item> - <item name="colorAccentFocus">@color/colorAccentFocus</item> - <item name="actionBarTheme">@style/AppTheme.AppBarOverlay</item> - <item name="formatBarTheme">@style/AppTheme.AppBarOverlay</item> - - <item name="windowActionModeOverlay">true</item> - <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> - - <item name="colorDivider">#1FFFFFFF</item> - - <item name="colorFill">@color/colorFillDark</item> - <item name="colorOffline">@color/colorOfflineDark</item> - <item name="colorAway">@color/colorAwayDark</item> - - <item name="cardStyle">@style/CardView.Dark</item> - - <item name="mircColor0">#ffffff</item> - <item name="mircColor1">#000000</item> - <item name="mircColor2">#000080</item> - <item name="mircColor3">#008000</item> - <item name="mircColor4">#ff0000</item> - <item name="mircColor5">#800000</item> - <item name="mircColor6">#800080</item> - <item name="mircColor7">#ffa500</item> - <item name="mircColor8">#ffff00</item> - <item name="mircColor9">#00ff00</item> - <item name="mircColorA">#008080</item> - <item name="mircColorB">#00ffff</item> - <item name="mircColorC">#4169e1</item> - <item name="mircColorD">#ff00ff</item> - <item name="mircColorE">#808080</item> - <item name="mircColorF">#c0c0c0</item> - </style> - - <style name="AppTheme.Light" parent="Theme.AppCompat.Light.NoActionBar"> - <!-- Customize your theme here. --> - <item name="colorPrimary">@color/colorPrimary</item> - <item name="colorPrimaryDark">@color/colorPrimaryDark</item> - <item name="colorAccent">@color/colorAccent</item> - <item name="colorAccentFocus">@color/colorAccentFocus</item> - <item name="actionBarTheme">@style/AppTheme.AppBarOverlay</item> - <item name="formatBarTheme">@style/AppTheme.AppBarOverlay.Light</item> - - <item name="windowActionModeOverlay">true</item> - <item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item> - - <item name="colorDivider">#1F000000</item>> - - <item name="colorFill">@color/colorFillLight</item> - <item name="colorOffline">@color/colorOfflineLight</item> - <item name="colorAway">@color/colorAwayLight</item> - - <item name="cardStyle">@style/CardView.Light</item> - - <item name="mircColor0">#ffffff</item> - <item name="mircColor1">#000000</item> - <item name="mircColor2">#000080</item> - <item name="mircColor3">#008000</item> - <item name="mircColor4">#ff0000</item> - <item name="mircColor5">#800000</item> - <item name="mircColor6">#800080</item> - <item name="mircColor7">#ffa500</item> - <item name="mircColor8">#ffff00</item> - <item name="mircColor9">#00ff00</item> - <item name="mircColorA">#008080</item> - <item name="mircColorB">#00ffff</item> - <item name="mircColorC">#4169e1</item> - <item name="mircColorD">#ff00ff</item> - <item name="mircColorE">#808080</item> - <item name="mircColorF">#c0c0c0</item> - </style> - - <style name="SetupTheme" parent="Theme.AppCompat.Light.NoActionBar"> - <!-- Customize your theme here. --> - <item name="colorPrimary">@color/colorPrimary</item> - <item name="colorPrimaryDark">@color/colorPrimaryDark</item> - <item name="colorAccent">@color/colorAccent</item> - <item name="colorAccentFocus">@color/colorAccentFocus</item> - <item name="actionBarTheme">@style/AppTheme.AppBarOverlay</item> - - <item name="windowActionModeOverlay">true</item> - - <item name="colorFill">@color/colorFillLight</item> - <item name="colorOffline">@color/colorOfflineLight</item> - <item name="colorAway">@color/colorAwayLight</item> - - <item name="android:windowBackground">@color/colorPrimary</item> - </style> - - <style name="RippleOverlay" parent="ThemeOverlay.AppCompat"> - <item name="colorControlHighlight">?attr/colorAccentFocus</item> - </style> - - <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> - <item name="colorControlNormal">@color/colorFillDark</item> - <item name="android:textColorPrimary">@color/colorFillDark</item> - <item name="drawerArrowStyle">@style/DrawerArrowToggle</item> - - <item name="colorFill">@color/colorFillDark</item> - <item name="colorOffline">@color/colorOfflineDark</item> - <item name="colorAway">@color/colorAwayDark</item> - </style> - - <style name="AppTheme.Light.Dialog" parent="MaterialBaseTheme.Light.AlertDialog"> - <item name="colorForeground">#DE000000</item> - <item name="colorForegroundHighlight">#DE000000</item> - <item name="colorForegroundSecondary">#8A000000</item> - <item name="colorForegroundAction">#1a237e</item> - <item name="colorForegroundError">#800000</item> - - <item name="colorForegroundMirc">0x1</item> - - <item name="colorBackground">#FAFAFA</item> - <item name="android:windowBackground">@color/quasselLight_background</item> - <item name="colorBackgroundHighlight">#ff8811</item> - <item name="colorBackgroundSecondary">@null</item> - <item name="colorBackgroundCard">#FFFFFF</item> - <item name="colorBackgroundDialog">#FAFAFA</item> - - <item name="colorTintActivity">#88cc33</item> - <item name="colorTintMessage">#2277dd</item> - <item name="colorTintHighlight">#ff8811</item> - </style> - <style name="AppTheme.AppBarOverlay.Light" parent="ThemeOverlay.AppCompat.ActionBar"> - <item name="colorControlNormal">@color/colorFillLight</item> - <item name="android:textColorPrimary">@color/colorFillLight</item> - <item name="drawerArrowStyle">@style/DrawerArrowToggle.Light</item> + <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <item name="colorPrimary">@color/colorPrimary</item> + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> + <item name="colorAccent">@color/colorAccent</item> + </style> - <item name="colorFill">@color/colorFillLight</item> - <item name="colorOffline">@color/colorOfflineLight</item> - <item name="colorAway">@color/colorAwayLight</item> - </style> + <style name="RaisedButton" parent="AppTheme"> + <item name="colorButtonNormal">?attr/background</item> + </style> - <style name="DrawerArrowToggle" parent="Widget.AppCompat.DrawerArrowToggle"> - <item name="color">?attr/colorControlNormal</item> - </style> + <style name="RaisedThemedButton" parent="RaisedButton"> + <item name="colorButtonNormal">@color/colorAccent</item> + </style> - <style name="DrawerArrowToggle.Light" parent="Widget.AppCompat.DrawerArrowToggle"> - <item name="color">?attr/colorControlNormal</item> - </style> + <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar"> + <item name="colorPrimary">@color/colorPrimaryDark</item> + <item name="colorPrimaryDark">@color/colorPrimaryDark</item> + <item name="colorAccent">@color/colorAccent</item> - <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light"/> + <item name="android:windowBackground">@drawable/bg_splash</item> + </style> </resources> diff --git a/app/src/main/res/values/themes_quassel.xml b/app/src/main/res/values/themes_quassel.xml deleted file mode 100644 index 36b18e745..000000000 --- a/app/src/main/res/values/themes_quassel.xml +++ /dev/null @@ -1,109 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <string name="themeQuasselLightName">Quassel™ (Light)</string> - <string name="themeQuasselLightId">QUASSEL_LIGHT</string> - - <style name="Quassel_Light" parent="AppTheme.Light"> - <item name="senderColor0">#e90d7f</item> - <item name="senderColor1">#8e55e9</item> - <item name="senderColor2">#b30e0e</item> - <item name="senderColor3">#17b339</item> - <item name="senderColor4">#58afb3</item> - <item name="senderColor5">#9d54b3</item> - <item name="senderColor6">#b39775</item> - <item name="senderColor7">#3176b3</item> - <item name="senderColor8">#e90d7f</item> - <item name="senderColor9">#8e55e9</item> - <item name="senderColorA">#b30e0e</item> - <item name="senderColorB">#17b339</item> - <item name="senderColorC">#58afb3</item> - <item name="senderColorD">#9d54b3</item> - <item name="senderColorE">#b39775</item> - <item name="senderColorF">#3176b3</item> - - <item name="colorForeground">#DE000000</item> - <item name="colorForegroundHighlight">#DE000000</item> - <item name="colorForegroundSecondary">#8A000000</item> - <item name="colorForegroundAction">#1a237e</item> - <item name="colorForegroundError">#800000</item> - - <item name="colorForegroundMirc">0x1</item> - - <item name="colorBackground">#FAFAFA</item> - <item name="android:windowBackground">@color/quasselLight_background</item> - <item name="colorBackgroundHighlight">#ff8811</item> - <item name="colorBackgroundSecondary">@null</item> - <item name="colorBackgroundCard">#FFFFFF</item> - <item name="colorBackgroundDialog">#FAFAFA</item> - - <item name="colorTintActivity">#88cc33</item> - <item name="colorTintMessage">#2277dd</item> - <item name="colorTintHighlight">#ff8811</item> - </style> - - <color name="quasselLight_background">#FAFAFA</color> - - <string name="themeQuasselDarkName">Quassel™ (Dark)</string> - <string name="themeQuasselDarkId">QUASSEL_DARK</string> - - <style name="Quassel_Dark" parent="AppTheme"> - <item name="senderColor0">#e90d7f</item> - <item name="senderColor1">#8e55e9</item> - <item name="senderColor2">#b30e0e</item> - <item name="senderColor3">#17b339</item> - <item name="senderColor4">#58afb3</item> - <item name="senderColor5">#9d54b3</item> - <item name="senderColor6">#b39775</item> - <item name="senderColor7">#3176b3</item> - <item name="senderColor8">#e90d7f</item> - <item name="senderColor9">#8e55e9</item> - <item name="senderColorA">#b30e0e</item> - <item name="senderColorB">#17b339</item> - <item name="senderColorC">#58afb3</item> - <item name="senderColorD">#9d54b3</item> - <item name="senderColorE">#b39775</item> - <item name="senderColorF">#3176b3</item> - - <item name="colorForeground">#FFFFFF</item> - <item name="colorForegroundHighlight">#FFFFFF</item> - <item name="colorForegroundSecondary">#B3FFFFFF</item> - <item name="colorForegroundAction">#7986cb</item> - <item name="colorForegroundError">#800000</item> - - <item name="colorForegroundMirc">0x0</item> - - <item name="colorBackground">#303030</item> - <item name="android:windowBackground">@color/quasselDark_background</item> - <item name="colorBackgroundHighlight">#ff8811</item> - <item name="colorBackgroundSecondary">@null</item> - <item name="colorBackgroundCard">#424242</item> - <item name="colorBackgroundDialog">#303030</item> - - <item name="colorTintActivity">#88cc33</item> - <item name="colorTintMessage">#2277dd</item> - <item name="colorTintHighlight">#ff8811</item> - </style> - - <color name="quasselDark_background">#303030</color> -</resources> \ No newline at end of file diff --git a/app/src/main/res/values/themes_solarized.xml b/app/src/main/res/values/themes_solarized.xml deleted file mode 100644 index f7948875d..000000000 --- a/app/src/main/res/values/themes_solarized.xml +++ /dev/null @@ -1,120 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <string name="themeSolarizedLightName">Solarized (Light)</string> - <string name="themeSolarizedLightId">SOLARIZED_LIGHT</string> - - <style name="Solarized_Light" parent="AppTheme.Light"> - <item name="colorPrimary">?attr/colorBackgroundCard</item> - <item name="colorPrimaryDark">#b0ac9e</item> - <item name="colorAccent">#B58900</item> - <item name="colorAccentFocus">#40B58900</item> - <item name="actionBarTheme">@style/AppTheme.AppBarOverlay.Light</item> - - <item name="senderColor0">#B58900</item> - <item name="senderColor1">#CB4B16</item> - <item name="senderColor2">#DC322f</item> - <item name="senderColor3">#D33682</item> - <item name="senderColor4">#6C71C4</item> - <item name="senderColor5">#268BD2</item> - <item name="senderColor6">#2AA198</item> - <item name="senderColor7">#859900</item> - <item name="senderColor8">#D5A920</item> - <item name="senderColor9">#EB6B36</item> - <item name="senderColorA">#FC524f</item> - <item name="senderColorB">#F356A2</item> - <item name="senderColorC">#8C91E4</item> - <item name="senderColorD">#46ABF2</item> - <item name="senderColorE">#4AC1B8</item> - <item name="senderColorF">#657900</item> - - <item name="colorForeground">#839495</item> - <item name="colorForegroundHighlight">#839495</item> - <item name="colorForegroundSecondary">#576A66</item> - <item name="colorForegroundAction">#268BD2</item> - <item name="colorForegroundError">#B00000</item> - - <item name="colorForegroundMirc">0xF</item> - - <item name="colorBackground">#FDF6E3</item> - <item name="android:windowBackground">@color/solarizedLight_background</item> - <item name="colorBackgroundHighlight">#268bd2</item> - <item name="colorBackgroundSecondary">@null</item> - <item name="colorBackgroundCard">#EEE8D5</item> - <item name="colorBackgroundDialog">#FDF6E3</item> - - <item name="colorTintActivity">#88cc33</item> - <item name="colorTintMessage">#2277dd</item> - <item name="colorTintHighlight">#ff8811</item> - </style> - - <color name="solarizedLight_background">#FDF6E3</color> - - <string name="themeSolarizedDarkName">Solarized (Dark)</string> - <string name="themeSolarizedDarkId">SOLARIZED_DARK</string> - - <style name="Solarized_Dark" parent="AppTheme"> - <item name="colorPrimary">?attr/colorBackgroundCard</item> - <item name="colorPrimaryDark">?attr/colorBackground</item> - <item name="colorAccent">#B58900</item> - <item name="colorAccentFocus">#40B58900</item> - - <item name="senderColor0">#B58900</item> - <item name="senderColor1">#CB4B16</item> - <item name="senderColor2">#DC322f</item> - <item name="senderColor3">#D33682</item> - <item name="senderColor4">#6C71C4</item> - <item name="senderColor5">#268BD2</item> - <item name="senderColor6">#2AA198</item> - <item name="senderColor7">#859900</item> - <item name="senderColor8">#D5A920</item> - <item name="senderColor9">#EB6B36</item> - <item name="senderColorA">#FC524f</item> - <item name="senderColorB">#F356A2</item> - <item name="senderColorC">#8C91E4</item> - <item name="senderColorD">#46ABF2</item> - <item name="senderColorE">#4AC1B8</item> - <item name="senderColorF">#657900</item> - - <item name="colorForeground">#839495</item> - <item name="colorForegroundHighlight">#839495</item> - <item name="colorForegroundSecondary">#576A66</item> - <item name="colorForegroundAction">#268BD2</item> - <item name="colorForegroundError">#B00000</item> - - <item name="colorForegroundMirc">0xF</item> - - <item name="colorBackground">#002B36</item> - <item name="android:windowBackground">@color/solarizedDark_background</item> - <item name="colorBackgroundHighlight">#268bd2</item> - <item name="colorBackgroundSecondary">@null</item> - <item name="colorBackgroundCard">#073642</item> - <item name="colorBackgroundDialog">#002B36</item> - - <item name="colorTintActivity">#88cc33</item> - <item name="colorTintMessage">#2277dd</item> - <item name="colorTintHighlight">#ff8811</item> - </style> - - <color name="solarizedDark_background">#002B36</color> -</resources> diff --git a/app/src/main/res/xml/pref_appearance.xml b/app/src/main/res/xml/pref_appearance.xml deleted file mode 100644 index 0462541af..000000000 --- a/app/src/main/res/xml/pref_appearance.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - - <de.kuschku.util.ui.preferences.MaterialListSummaryPreference - android:defaultValue="QUASSEL_LIGHT" - android:entries="@array/preference_theme_entries" - android:entryValues="@array/preference_theme_values" - android:key="@string/preference_theme" - android:title="@string/preference_theme_title"/> - - <com.jenzz.materialpreference.CheckBoxPreference - android:key="@string/preference_colors" - android:summaryOff="@string/preference_colors_summary_off" - android:summaryOn="@string/preference_colors_summary_on" - android:title="@string/preference_colors_title"/> - - <com.jenzz.materialpreference.CheckBoxPreference - android:key="@string/preference_hostmask" - android:summaryOff="@string/preference_hostmask_summary_off" - android:summaryOn="@string/preference_hostmask_summary_on" - android:title="@string/preference_hostmask_title"/> - - <com.jenzz.materialpreference.CheckBoxPreference - android:key="@string/preference_lag" - android:summaryOff="@string/preference_lag_summary_off" - android:summaryOn="@string/preference_lag_summary_on" - android:title="@string/preference_lag_title"/> - - <com.jenzz.materialpreference.CheckBoxPreference - android:key="@string/preference_brackets" - android:summaryOff="@string/preference_brackets_summary_off" - android:summaryOn="@string/preference_brackets_summary_on" - android:title="@string/preference_brackets_title"/> - -</PreferenceScreen> diff --git a/app/src/main/res/xml/pref_overview.xml b/app/src/main/res/xml/pref_overview.xml deleted file mode 100644 index 66e9b983d..000000000 --- a/app/src/main/res/xml/pref_overview.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?><!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> - - <PreferenceScreen android:title="About"> - - <Preference - android:summary="@string/appDescriptionLong" - android:title="@string/app_name"/> - - </PreferenceScreen> - -</PreferenceScreen> diff --git a/app/src/test/java/de/kuschku/quasseldroid_ng/SerializerUnitTest.kt b/app/src/test/java/de/kuschku/quasseldroid_ng/SerializerUnitTest.kt new file mode 100644 index 000000000..d43ca3edb --- /dev/null +++ b/app/src/test/java/de/kuschku/quasseldroid_ng/SerializerUnitTest.kt @@ -0,0 +1,103 @@ +package de.kuschku.quasseldroid_ng + +import de.kuschku.quasseldroid_ng.protocol.Quassel_Feature +import de.kuschku.quasseldroid_ng.protocol.Quassel_Features +import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.* +import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Test +import org.threeten.bp.Instant +import org.threeten.bp.LocalDateTime +import org.threeten.bp.ZoneOffset +import java.nio.ByteBuffer +import kotlin.experimental.inv + +class SerializerUnitTest { + @Test + fun boolSerializer() { + assertEquals(true, roundTrip(BoolSerializer, true)) + assertEquals(false, roundTrip(BoolSerializer, false)) + } + + @Test + fun byteArraySerializer() { + val value1 = byteArrayOf() + assertArrayEquals(value1, roundTrip(ByteArraySerializer, ByteBuffer.wrap(value1))?.array()) + + val value2 = byteArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9) + assertArrayEquals(value2, roundTrip(ByteArraySerializer, ByteBuffer.wrap(value2))?.array()) + } + + @Test + fun charSerializer() { + assertEquals(' ', roundTrip(CharSerializer, ' ')) + assertEquals('a', roundTrip(CharSerializer, 'a')) + assertEquals('ä', roundTrip(CharSerializer, 'ä')) + assertEquals('\u0000', roundTrip(CharSerializer, '\u0000')) + assertEquals('\uFFFF', roundTrip(CharSerializer, '\uFFFF')) + assertEquals(' ', roundTrip(CharSerializer, ' ')) + assertEquals('a', roundTrip(CharSerializer, 'a')) + assertEquals('ä', roundTrip(CharSerializer, 'ä')) + } + + @Test + fun dateTimeSerializer() { + assertEquals(Instant.EPOCH, roundTrip(DateTimeSerializer, Instant.EPOCH)) + assertEquals(Instant.now(), roundTrip(DateTimeSerializer, Instant.now())) + + val value1 = Instant.EPOCH.atOffset(ZoneOffset.ofTotalSeconds(1234)) + assertEquals(value1, roundTrip(DateTimeSerializer, value1)) + val value2 = Instant.now().atOffset(ZoneOffset.ofTotalSeconds(1234)) + assertEquals(value2, roundTrip(DateTimeSerializer, value2)) + + val value3 = LocalDateTime.of(1970, 1, 1, 0, 0) + .atZone(ZoneOffset.systemDefault()).toInstant() + assertEquals(value3, roundTrip(DateTimeSerializer, value3)) + val value4 = LocalDateTime.now().atZone(ZoneOffset.systemDefault()).toInstant() + assertEquals(value4, roundTrip(DateTimeSerializer, value4)) + } + + @Test + fun byteSerializer() { + assertEquals(0.toByte(), roundTrip(ByteSerializer, 0.toByte())) + assertEquals(Byte.MAX_VALUE, roundTrip(ByteSerializer, Byte.MAX_VALUE)) + assertEquals(Byte.MIN_VALUE, roundTrip(ByteSerializer, Byte.MIN_VALUE)) + assertEquals((0.toByte().inv()), roundTrip(ByteSerializer, (0.toByte().inv()))) + } + + @Test + fun shortSerializer() { + assertEquals(0.toShort(), roundTrip(ShortSerializer, 0.toShort())) + assertEquals(Short.MAX_VALUE, roundTrip(ShortSerializer, Short.MAX_VALUE)) + assertEquals(Short.MIN_VALUE, roundTrip(ShortSerializer, Short.MIN_VALUE)) + assertEquals((0.toShort().inv()), roundTrip(ShortSerializer, (0.toShort().inv()))) + } + + @Test + fun intSerializer() { + assertEquals(0, roundTrip(IntSerializer, 0)) + assertEquals(Integer.MAX_VALUE, roundTrip(IntSerializer, Integer.MAX_VALUE)) + assertEquals(Integer.MIN_VALUE, roundTrip(IntSerializer, Integer.MIN_VALUE)) + assertEquals(0.inv(), roundTrip(IntSerializer, 0.inv())) + } + + @Test + fun longSerializer() { + assertEquals(0, roundTrip(LongSerializer, 0)) + assertEquals(Long.MAX_VALUE, roundTrip(LongSerializer, Long.MAX_VALUE)) + assertEquals(Long.MIN_VALUE, roundTrip(LongSerializer, Long.MIN_VALUE)) + assertEquals(0L.inv(), roundTrip(LongSerializer, 0L.inv())) + } + + companion object { + fun <T> roundTrip(serializer: Serializer<T>, value: T, + features: Quassel_Features = Quassel_Feature.NONE): T { + val chainedBuffer = ChainedByteBuffer( + direct = false) + serializer.serialize(chainedBuffer, value, features) + val buffer = chainedBuffer.toBuffer() + return serializer.deserialize(buffer, features) + } + } +} diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 34c2e8ed8..000000000 --- a/build.gradle +++ /dev/null @@ -1,43 +0,0 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -buildscript { - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' - classpath 'me.tatarka:gradle-retrolambda:3.2.4' - classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' - } -} - -allprojects { - repositories { - jcenter() - maven { url "https://jitpack.io" } - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..ac8a8cc8d --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,17 @@ +buildscript { + repositories { + google() + jcenter() + } + dependencies { + classpath("com.android.tools.build:gradle:3.0.0-beta6") + classpath(kotlin("gradle-plugin")) + } +} + +allprojects { + repositories { + google() + jcenter() + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..c749668c0 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,17 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +org.gradle.parallel=false diff --git a/gradle/project-schema.json b/gradle/project-schema.json new file mode 100644 index 000000000..4ed87d03d --- /dev/null +++ b/gradle/project-schema.json @@ -0,0 +1,73 @@ +{ + ":": { + "conventions": { + "base": "org.gradle.api.plugins.BasePluginConvention", + "java": "org.gradle.api.plugins.JavaPluginConvention" + }, + "configurations": [ + "androidJacocoAgent", + "androidJacocoAnt", + "androidTestAnnotationProcessor", + "androidTestApk", + "androidTestCompile", + "androidTestJackPlugin", + "androidTestProvided", + "androidTestWearApp", + "annotationProcessor", + "apk", + "archives", + "compile", + "debugAnnotationProcessor", + "debugApk", + "debugCompile", + "debugJackPlugin", + "debugProvided", + "debugWearApp", + "default", + "default-mapping", + "default-metadata", + "jackPlugin", + "kapt", + "kaptAndroidTest", + "kaptDebug", + "kaptRelease", + "kaptTest", + "kaptTestDebug", + "kaptTestRelease", + "provided", + "releaseAnnotationProcessor", + "releaseApk", + "releaseCompile", + "releaseJackPlugin", + "releaseProvided", + "releaseWearApp", + "testAnnotationProcessor", + "testApk", + "testCompile", + "testDebugAnnotationProcessor", + "testDebugApk", + "testDebugCompile", + "testDebugJackPlugin", + "testDebugProvided", + "testDebugWearApp", + "testJackPlugin", + "testProvided", + "testReleaseAnnotationProcessor", + "testReleaseApk", + "testReleaseCompile", + "testReleaseJackPlugin", + "testReleaseProvided", + "testReleaseWearApp", + "testWearApp", + "wearApp" + ], + "extensions": { + "ext": "org.gradle.api.plugins.ExtraPropertiesExtension", + "defaultArtifacts": "org.gradle.api.internal.plugins.DefaultArtifactPublicationSet", + "reporting": "org.gradle.api.reporting.ReportingExtension", + "android": "com.android.build.gradle.AppExtension", + "kotlin": "org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension", + "kapt": "org.jetbrains.kotlin.gradle.plugin.KaptExtension" + } + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 05ef575b0cd0173fc735f2857ce4bd594ce4f6bd..4123b1525278d7b81af85fdd381fb3432273424f 100644 GIT binary patch delta 44841 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 PHqdpN6=tOEY32U`G0ikp delta 45547 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 942995950..e3f1f1c25 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,27 +1,5 @@ -# -# QuasselDroid - Quassel client for Android -# Copyright (C) 2016 Janne Koschinski -# Copyright (C) 2016 Ken Børge Viktil -# Copyright (C) 2016 Magnus Fjell -# Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see <http://www.gnu.org/licenses/>. -# - -#Sat Sep 03 00:05:21 CEST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://repo.gradle.org/gradle/dist-snapshots/gradle-kotlin-dsl-4.1-20170712173431+0000-all.zip diff --git a/gradlew b/gradlew index 9d82f7891..cccdd3d51 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,20 +6,38 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -150,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 8a0b282aa..f9553162f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/install.sh b/install.sh deleted file mode 100755 index 2f12876bc..000000000 --- a/install.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -# Update submodules -git submodule update --init - -# Create directories -mkdir -p app/libs/ - -# Build AndroidSlidingUpPanel -echo sdk.dir=$ANDROID_HOME > AndroidSlidingUpPanel/local.properties -cd AndroidSlidingUpPanel -gradle clean build -cd .. -cp AndroidSlidingUpPanel/library/build/outputs/aar/library-release.aar app/libs/library-release.aar -rm AndroidSlidingUpPanel/local.properties - -# Build QuasselDroidNG -echo sdk.dir=$ANDROID_HOME > local.properties -gradle clean assembleRelease -x lintVitalRelease -rm local.properties \ No newline at end of file diff --git a/invokerannotations/build.gradle.kts b/invokerannotations/build.gradle.kts new file mode 100644 index 000000000..414c80434 --- /dev/null +++ b/invokerannotations/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + java +} diff --git a/invokerannotations/src/main/java/de/kuschku/libquassel/annotations/Slot.java b/invokerannotations/src/main/java/de/kuschku/libquassel/annotations/Slot.java new file mode 100644 index 000000000..93cdaf5d3 --- /dev/null +++ b/invokerannotations/src/main/java/de/kuschku/libquassel/annotations/Slot.java @@ -0,0 +1,12 @@ +package de.kuschku.libquassel.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.SOURCE) +@Target(value = ElementType.METHOD) +public @interface Slot { + String value() default ""; +} diff --git a/invokerannotations/src/main/java/de/kuschku/libquassel/annotations/Syncable.java b/invokerannotations/src/main/java/de/kuschku/libquassel/annotations/Syncable.java new file mode 100644 index 000000000..46a4dd822 --- /dev/null +++ b/invokerannotations/src/main/java/de/kuschku/libquassel/annotations/Syncable.java @@ -0,0 +1,12 @@ +package de.kuschku.libquassel.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(value = ElementType.TYPE) +public @interface Syncable { + String name(); +} diff --git a/invokergenerator/build.gradle.kts b/invokergenerator/build.gradle.kts new file mode 100644 index 000000000..de61f4ff8 --- /dev/null +++ b/invokergenerator/build.gradle.kts @@ -0,0 +1,18 @@ + +import org.gradle.kotlin.dsl.DependencyHandlerScope +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.java +import org.gradle.kotlin.dsl.project + +plugins { + java +} + +dependencies { + implementation(project(":invokerannotations")) + implementation("com.google.auto.service:auto-service:1.0-rc3") + implementation("com.squareup:javapoet:1.9.0") +} + +fun DependencyHandlerScope.implementation(dependencyNotation: Any) + = "implementation"(dependencyNotation) diff --git a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java new file mode 100644 index 000000000..bbde9f7b3 --- /dev/null +++ b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java @@ -0,0 +1,241 @@ +package de.kuschku.libquassel.annotations; + +import com.google.auto.service.AutoService; +import com.squareup.javapoet.ClassName; +import com.squareup.javapoet.FieldSpec; +import com.squareup.javapoet.JavaFile; +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.ParameterSpec; +import com.squareup.javapoet.ParameterizedTypeName; +import com.squareup.javapoet.TypeName; +import com.squareup.javapoet.TypeSpec; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.Filer; +import javax.annotation.processing.Messager; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.Processor; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; +import javax.lang.model.element.Modifier; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.ExecutableType; +import javax.lang.model.type.TypeMirror; + +@AutoService(Processor.class) +@SupportedAnnotationTypes("de.kuschku.libquassel.annotations.Syncable") +@SupportedSourceVersion(SourceVersion.RELEASE_8) +public class InvokerProcessor extends AbstractProcessor { + + private Filer filer; + private Messager messager; + + @Override + public synchronized void init(ProcessingEnvironment processingEnv) { + filer = processingEnv.getFiler(); + messager = processingEnv.getMessager(); + } + + private class SlotElement { + final ExecutableElement element; + final ExecutableType type; + + final String slotName; + + final Slot slot; + + public SlotElement(ExecutableElement element, ExecutableType type, String slotName, Slot slot) { + this.element = element; + this.type = type; + this.slotName = slotName; + this.slot = slot; + } + } + + private class SyncableElement { + PackageElement packageElement; + TypeElement typeElement; + + Syncable annotation; + + List<SlotElement> slots; + + public SyncableElement(PackageElement packageElement, TypeElement typeElement, Syncable annotation, List<SlotElement> slots) { + this.packageElement = packageElement; + this.typeElement = typeElement; + this.annotation = annotation; + this.slots = slots; + } + } + + @Override + public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { + List<SyncableElement> syncableElements = new ArrayList<>(); + for (Element element : roundEnv.getElementsAnnotatedWith(Syncable.class)) { + if (element.getKind() == ElementKind.INTERFACE) { + List<SlotElement> slotElements = new ArrayList<>(); + for (Element element1 : element.getEnclosedElements()) { + if (element1.getKind() == ElementKind.METHOD) { + ExecutableElement it = (ExecutableElement) element1; + ExecutableType methodType = (ExecutableType) it.asType(); + + Slot slotAnnotation = element1.getAnnotation(Slot.class); + if (slotAnnotation != null) { + String slotName = slotAnnotation.value().isEmpty() ? it.getSimpleName().toString() : slotAnnotation.value(); + slotElements.add(new SlotElement(it, methodType, slotName, slotAnnotation)); + } + } + } + + PackageElement packageElement = (PackageElement) element.getEnclosingElement(); + TypeElement typeElement = (TypeElement) element; + Syncable annotation = typeElement.getAnnotation(Syncable.class); + + syncableElements.add(new SyncableElement(packageElement, typeElement, annotation, slotElements)); + } + } + + try { + for (SyncableElement syncableElement : syncableElements) { + generateInvoker(syncableElement); + } + } catch (IOException e) { + e.printStackTrace(); + } + return true; + } + + private void generateInvoker(SyncableElement element) throws IOException { + String packageName = element.packageElement.getQualifiedName().toString() + ".invokers"; + String invokerName = element.annotation.name() + "Invoker"; + + ClassName type = ClassName.get(packageName, invokerName); + ClassName wrongObjectTypeException = ClassName.get("de.kuschku.quasseldroid_ng", "WrongObjectTypeException"); + ClassName unknownMethodException = ClassName.get("de.kuschku.quasseldroid_ng", "UnknownMethodException"); + ClassName nonNullAnnotation = ClassName.get("android.support.annotation", "NonNull"); + + MethodSpec methodSpecConstructor = MethodSpec + .constructorBuilder() + .addModifiers(Modifier.PRIVATE) + .build(); + + FieldSpec fieldSpecInstance = FieldSpec + .builder(type, "INSTANCE", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL) + .initializer("new $T()", type) + .build(); + + MethodSpec methodSpecClassName = MethodSpec + .methodBuilder("getClassName") + .addModifiers(Modifier.PUBLIC) + .addAnnotation(nonNullAnnotation) + .addAnnotation(Override.class) + .returns(String.class) + .addStatement("return $S", element.annotation.name()) + .build(); + + ParameterSpec parameterSpecOn = ParameterSpec + .builder( + Object.class, + "on" + ) + .addAnnotation(nonNullAnnotation) + .build(); + + ParameterSpec parameterSpecMethod = ParameterSpec + .builder( + String.class, + "method" + ) + .addAnnotation(nonNullAnnotation).build(); + + ParameterSpec parameterSpecParams = ParameterSpec + .builder( + ParameterizedTypeName.get( + ClassName.get(List.class), + ParameterizedTypeName.get( + ClassName.get("de.kuschku.quasseldroid_ng.protocol", "QVariant"), + TypeName.get(Object.class) + ) + ), + "params" + ) + .addAnnotation(nonNullAnnotation) + .build(); + + MethodSpec.Builder invokeSpec = MethodSpec + .methodBuilder("invoke") + .addModifiers(Modifier.PUBLIC) + .addAnnotation(Override.class) + .addException(wrongObjectTypeException) + .addException(unknownMethodException) + .addParameter(parameterSpecOn) + .addParameter(parameterSpecMethod) + .addParameter(parameterSpecParams) + .beginControlFlow("if (on instanceof $T)", element.typeElement) + .addStatement("$T it = ($T) $N", element.typeElement, element.typeElement, parameterSpecOn) + .beginControlFlow("switch ($N)", parameterSpecMethod); + + for (SlotElement slot : element.slots) { + invokeSpec = invokeSpec.beginControlFlow("case $S:", slot.slotName); + invokeSpec = invokeSpec.addCode("it.$N(\n$>", slot.element.getSimpleName()); + for (int i = 0; i < slot.type.getParameterTypes().size(); i++) { + TypeMirror parameterType = slot.type.getParameterTypes().get(i); + boolean isLast = i + 1 == slot.type.getParameterTypes().size(); + + invokeSpec = invokeSpec.addCode("($T) $N.get($L).getData()", parameterType, parameterSpecParams, i); + if (!isLast) + invokeSpec = invokeSpec.addCode(","); + invokeSpec = invokeSpec.addCode("\n"); + } + invokeSpec = invokeSpec.addCode("$<);\n"); + invokeSpec = invokeSpec.endControlFlow("return"); + } + + invokeSpec = invokeSpec + .beginControlFlow("default:") + .addStatement("throw new $T($N(), $N)", + unknownMethodException, + methodSpecClassName, + parameterSpecMethod + ) + .endControlFlow() + .endControlFlow() + .addCode("$<} else{\n$>") + .addStatement("throw new $T($N, $N())", + wrongObjectTypeException, + parameterSpecOn, + methodSpecClassName + ) + .endControlFlow(); + + TypeSpec typeSpec = TypeSpec + .classBuilder(type) + .addSuperinterface(ParameterizedTypeName.get( + ClassName.get(packageName, "Invoker"), + TypeName.get(element.typeElement.asType()) + )) + .addModifiers(Modifier.PUBLIC) + .addField(fieldSpecInstance) + .addMethod(methodSpecConstructor) + .addMethod(methodSpecClassName) + .addMethod(invokeSpec.build()) + .build(); + + JavaFile javaFile = JavaFile + .builder(packageName, typeSpec) + .build(); + + javaFile.writeTo(filer); + } +} diff --git a/settings.gradle b/settings.gradle index 2a9cb1a0c..fa3c2ef0f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,22 +1 @@ -/* - * QuasselDroid - Quassel client for Android - * Copyright (C) 2016 Janne Koschinski - * Copyright (C) 2016 Ken Børge Viktil - * Copyright (C) 2016 Magnus Fjell - * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - * - * This program is free software: you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation, either version 3 of the License, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -include ':app' +include ':invokerannotations', ':invokergenerator', ':app' -- GitLab