From a5c96964e85479cc8a0688ed2112c4575b4aa133 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Fri, 20 Nov 2020 11:06:41 -0800 Subject: [PATCH] Android Bugfixxing Part 1 - Icons Now Show - Zoom Slider doesn't Crash (2 causes) - One desktop/android crash caused by Ellipsis Label (now replaced) - One android crash caused by ButtonTextField (fixed) - Removed some emoji handling that was unused. --- ANDROID_DEBUGGING.md | 82 ++++++++++++++++++ Makefile | 15 ++-- .../libs/armeabi-v7a/libQt5AndroidExtras.so | Bin 0 -> 188536 bytes go.sum | 12 +++ go/ui/gcd.go | 6 -- go/ui/settings.go | 6 +- main.go | 2 + qml/main.qml | 4 +- qml/opaque | 2 +- qml/overlays/ListOverlay.qml | 9 +- qml/panes/GroupSettingsPane.qml | 4 +- qml/panes/ProfileAddEditPane.qml | 4 +- qml/panes/ProfileManagerPane.qml | 11 +-- qml/panes/ServerAddEditPane.qml | 46 ++++++---- qml/panes/SettingsPane.qml | 7 +- qml/widgets/ContactList.qml | 2 +- qml/widgets/ContactRow.qml | 4 +- qml/widgets/Message.qml | 14 ++- qml/widgets/MessageEditor.qml | 28 ++---- qml/widgets/MyProfile.qml | 14 +-- qml/widgets/ProfileList.qml | 15 +++- qml/widgets/ProfileRow.qml | 72 ++++++++------- qml/widgets/ServerList.qml | 12 ++- qml/widgets/ServerRow.qml | 54 ++---------- qml/widgets/Statusbar.qml | 16 ++-- 25 files changed, 249 insertions(+), 192 deletions(-) create mode 100644 ANDROID_DEBUGGING.md create mode 100755 android/libs/armeabi-v7a/libQt5AndroidExtras.so diff --git a/ANDROID_DEBUGGING.md b/ANDROID_DEBUGGING.md new file mode 100644 index 00000000..9378bffc --- /dev/null +++ b/ANDROID_DEBUGGING.md @@ -0,0 +1,82 @@ +# Notes on Android Debugging + +If you are reading this you are probably interested in developing Cwtch for Android! Awesome. + +The Cwtch UI app is intended to be a single codebase that runs on multiple platforms. This +complicates the build process in favour of simplifying the code (so goes the theory). + +We make use of https://github.com/therecipe/qt/ for deploying Go/Qt code to Android. Before you venture into the weeds +of this README please take a look at the [Installation](https://github.com/therecipe/qt/wiki/Installation) +and [Setup instructions](https://github.com/therecipe/qt/wiki/Deploying-Linux-to-Android) in therecipe/qt. + +## Building + +Check out and follow the instructions at https://github.com/therecipe/qt/wiki/Deploying-Linux-to-Android as they are sufficient, +below you will find high-level notes regarding the process. + +You need to run `qtsetup --qt_version= full android` for the non-docker setup. You will need to do this +for every major version change of therecipe dependencies. + +You will also need the Android 28 SDK (Pie), the NDK, SDK build tools and platform tools, gradle and **JDK 8** + + JAVA_HOME=/path/to/jre8 + ANDROID_NDK_DIR=/path/to/ndk + +Once all that setup is done you should be able to run: + + qtdeploy build android + +2-4 minutes later an android apk will pop out in `./deploy/android/build-debug.apk`. + +### Build Setup Issues we have seen + +* `Could not determine java version from ` - this is thrown by gradle inside the `androiddeployqt` process when the +Java version is *not* JRE8. Ensure that JAVA_HOME is pointed to the correct java installation. +* ` readelf "is not an ordinary file"` - this isn't actually an error that will stop the build, but sometimes +because of the very long debug log output you will come across it when trying to find the *actual* error (which is +probably a Java version issue). It can be safely ignored. +* `could not find QAndroid...` / `CPP build errors` - you will need to run `qtsetup` full android` for the Qt version +you are using. + * Example: androidextras_android.cpp:9:10: fatal error: 'QAndroidActivityResultReceiver' file not found + +## Testing on a Real Device + +Consult the Android documentation on setting up your device for development. + +You will need an android sdk, setup your device for USB Debugging and then with `adb` you can do: + + adb install -r ./deploy/android/build-debug.apk + + To get the logs you can run + + adb logcat + +Android Studio provides a nice logcat interface for quickly filtering log files that can be very useful when trying to +debug complex behavior, but command line tools like `grep` and the built-in [logcat filtering](https://developer.android.com/studio/command-line/logcat) + should also suffice. + + *Important*: Cwtch UI technically runs *3* different applications: Cwtch Frontend (application client), + Cwtch Backend (application server) and Tor. When filtering logcat you should be aware that some of your messages might + be getting logged by a different process. + + (*Ctrl-F Helper: "Why are log messages missing"*) + +# Bundled Libraries + +There seems to be a bug in Qt (https://bugreports.qt.io/browse/QTBUG-84371) that prevents the use of +`AndroidExtras` in `ANDROID_MODULES_INCLUDE` so we bundle it in `android/libQt5AndroidExtras.so` along with +`libtor` for Tor support. + +## Non-SDK Interfaces + +e.g. java.lang.NoSuchFieldException: No field mPivotX in class Landroid/graphics/drawable/RotateDrawable$RotateState; + +* https://bugreports.qt.io/browse/QTBUG-71590 + +## Plugins + +Theoretically speaking it should be possible to use `ANDROID_EXTRA_PLUGINS` to include support for e.g. +SVG images on Android. However, we have been unable to make it work. If you would like to try, the following +issues might be helpful: + +* https://bugreports.qt.io/browse/QTBUG-60022 \ No newline at end of file diff --git a/Makefile b/Makefile index 6a66eee2..8d1e200b 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,9 @@ .PHONY: all clean linux windows android all: clean linux windows android -default: linux +default: linux + +SHELL := env QT_BUILD_VERSION=$(QT_BUILD_VERSION) $(SHELL) +QT_BUILD_VERSION ?= "5.13.4" clean: rm -r vendor || true @@ -18,7 +21,7 @@ android: linux_build: date - qtdeploy -qt_version "5.13.0" build linux 2>&1 | tee qtdeploy.log | pv + qtdeploy -qt_version $(QT_BUILD_VERSION) build linux 2>&1 | tee qtdeploy.log | pv date cp -R assets deploy/linux/ $(MAKE) linux_clean @@ -28,7 +31,7 @@ linux_clean: windows_build: date - qtdeploy -qt_version "5.13.0" build windows 2>&1 | tee qtdeploy.log | pv + qtdeploy -qt_version $(QT_BUILD_VERSION) build windows 2>&1 | tee qtdeploy.log | pv date cp -R assets deploy/windows/ $(MAKE) linux_clean @@ -37,11 +40,11 @@ windows_clean: #ntd android_build: - mv assets android/ + cp -R assets android/ date - qtdeploy -docker build android 2>&1 | tee qtdeploy.log | pv + ## TODO have this also include AndroidExtras (see ANDROID_DEBUGGING) for full notes. + env ANDROID_MODULES_INCLUDE="Core,Gui,Svg,QuickWidgets,Xml" qtdeploy -debug -qt_version $(QT_BUILD_VERSION) build android 2>&1 | tee qtdeploy.log | pv date - $(MAKE) android_clean android_clean: mv android/assets assets diff --git a/android/libs/armeabi-v7a/libQt5AndroidExtras.so b/android/libs/armeabi-v7a/libQt5AndroidExtras.so new file mode 100755 index 0000000000000000000000000000000000000000..5e5832124173b922ef05d7cade4460e738f9eefa GIT binary patch literal 188536 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 literal 0 HcmV?d00001 diff --git a/go.sum b/go.sum index cc462697..4fb6bf08 100644 --- a/go.sum +++ b/go.sum @@ -49,6 +49,7 @@ github.com/gtank/merlin v0.1.1/go.mod h1:T86dnYJhcGOh5BjZFCJWTDeTK7XW8uE+E21Cy/b github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uMzcc= github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -77,8 +78,19 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/struCoder/pidusage v0.1.3 h1:pZcSa6asBE38TJtW0Nui6GeCjLTpaT/jAnNP7dUTLSQ= github.com/struCoder/pidusage v0.1.3/go.mod h1:pWBlW3YuSwRl6h7R5KbvA4N8oOqe9LjaKW5CwT1SPjI= +github.com/therecipe/env_darwin_amd64_513 v0.0.0-20190626001412-d8e92e8db4d0 h1:Txh3Vvzx49BQg6OwSuYqOGNndpCWPYScIpEgK5BcGpc= +github.com/therecipe/env_darwin_amd64_513 v0.0.0-20190626001412-d8e92e8db4d0/go.mod h1:mdZdqBBs62KM68t1wD7rjG2NumvwuSNLqmMetEAqI14= +github.com/therecipe/env_linux_amd64_513 v0.0.0-20190626000307-e137a3934da6 h1:i0/LROzMqqMuHJ9gPeH2+So1Icle7zSVRqzXR4Z75hw= +github.com/therecipe/env_linux_amd64_513 v0.0.0-20190626000307-e137a3934da6/go.mod h1:Cq/lZrZTuGhRckzJgZFONK4WCE67AssWhHYj82U5FFI= +github.com/therecipe/env_windows_amd64_513 v0.0.0-20190626000028-79ec8bd06fb2 h1:dpqvgFCZRuxwiJhWVwQZSJ8zDaORf+GiUGxxOGzlQtc= +github.com/therecipe/env_windows_amd64_513 v0.0.0-20190626000028-79ec8bd06fb2/go.mod h1:evzb6PHK/MrRdJyhL1kbQXTfbMu4t4JOLl6iz55ywvk= +github.com/therecipe/env_windows_amd64_513/Tools v0.0.0-20190626000028-79ec8bd06fb2 h1:hM5KSUn4YbSvPuXAWJyywohkDocI+hSEsL+Msc9/FDA= +github.com/therecipe/env_windows_amd64_513/Tools v0.0.0-20190626000028-79ec8bd06fb2/go.mod h1:75GdIZ2clS7WUwhRklktkP02ffFz7+tBx8/Ue8eFexU= github.com/therecipe/qt v0.0.0-20200126204426-5074eb6d8c41 h1:yBVcrpbaQYJBdKT2pxTdlL4hBE/eM4UPcyj9YpyvSok= github.com/therecipe/qt v0.0.0-20200126204426-5074eb6d8c41/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us= +github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d h1:T+d8FnaLSvM/1BdlDXhW4d5dr2F07bAbB+LpgzMxx+o= +github.com/therecipe/qt v0.0.0-20200904063919-c0c124a5770d/go.mod h1:SUUR2j3aE1z6/g76SdD6NwACEpvCxb3fvG82eKbD6us= +github.com/therecipe/qt/internal/binding/files/docs v0.0.0-20191019224306-1097424d656c h1:/VhcwU7WuFEVgDHZ9V8PIYAyYqQ6KNxFUjBMOf2aFZM= github.com/therecipe/qt/internal/binding/files/docs/5.12.0 v0.0.0-20200126204426-5074eb6d8c41 h1:My9HYsfDI/fJPZGyilw6066buBiZ7pgKRRgAyvKK5lA= github.com/therecipe/qt/internal/binding/files/docs/5.12.0 v0.0.0-20200126204426-5074eb6d8c41/go.mod h1:7m8PDYDEtEVqfjoUQc2UrFqhG0CDmoVJjRlQxexndFc= github.com/therecipe/qt/internal/binding/files/docs/5.13.0 v0.0.0-20200126204426-5074eb6d8c41 h1:jTzKrQ6EIPvKw1B9/wwoKJLrXF+ManMsXoUzufxAdsg= diff --git a/go/ui/gcd.go b/go/ui/gcd.go index 0e169d9c..c8bb2ccf 100644 --- a/go/ui/gcd.go +++ b/go/ui/gcd.go @@ -690,12 +690,6 @@ func (this *GrandCentralDispatcher) setLocaleHelper(locale string) { } func (this *GrandCentralDispatcher) themeScaleChanged(newThemeScale float32) { - // TODO: solve why themeScale > 2.0 halts app launch - related task - solve all the qml launch warnings around anchors/layouts - if this.Os() != "android" { - if newThemeScale > 1.99 { - this.SetThemeScale(1.99) - } - } this.GlobalSettings.Zoom = newThemeScale WriteGlobalSettings(this.GlobalSettings) } diff --git a/go/ui/settings.go b/go/ui/settings.go index a5d40edf..137c68e4 100644 --- a/go/ui/settings.go +++ b/go/ui/settings.go @@ -25,7 +25,7 @@ type GlobalSettings struct { } var DefaultGlobalSettings = GlobalSettings{ - Zoom: 1.0, + Zoom: 1.9, Locale: "en", Theme: "light", PreviousPid: -1, @@ -68,11 +68,13 @@ func ReadGlobalSettings() *GlobalSettings { return &settings } + err = json.Unmarshal(settingsBytes, &settings) if err != nil { log.Errorf("Could not parse global ui settings: %v\n", err) } - log.Debugf("MAP: %v", settings.Experiments) + + log.Debugf("Settings: %v", settings) return &settings } diff --git a/main.go b/main.go index d1654e9e..6032c1bf 100644 --- a/main.go +++ b/main.go @@ -44,6 +44,7 @@ func init() { } func main() { + if os.Getenv("CWTCH_FOLDER") != "" { the.CwtchDir = os.Getenv("CWTCH_FOLDER") } else if runtime.GOOS == "android" { @@ -259,6 +260,7 @@ func loadACN() { } } + // generate a random socks and control port (not real random...these are port numbers...) mrand.Seed(int64(time.Now().Nanosecond())) port := mrand.Intn(1000) + 9600 diff --git a/qml/main.qml b/qml/main.qml index 8a553b9d..55a3aa20 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -75,8 +75,6 @@ ApplicationWindow { return px * 72 / (Screen.pixelDensity * 25.4) } - - StackView { id: rootStack @@ -115,6 +113,7 @@ ApplicationWindow { } } + // The actual app property Item mainLayout: Rectangle { color: Theme.backgroundMainColor @@ -191,6 +190,7 @@ ApplicationWindow { } } + RowLayout { // Profile Pane (contact list + overlays) Layout.fillHeight: true Layout.fillWidth: true diff --git a/qml/opaque b/qml/opaque index b8d01338..3b9675e2 160000 --- a/qml/opaque +++ b/qml/opaque @@ -1 +1 @@ -Subproject commit b8d01338786625a41ba430ede6430715f5c82b33 +Subproject commit 3b9675e25917f667ba4b1cf1db09d44ed328f010 diff --git a/qml/overlays/ListOverlay.qml b/qml/overlays/ListOverlay.qml index 52b8150a..0fcd1e64 100644 --- a/qml/overlays/ListOverlay.qml +++ b/qml/overlays/ListOverlay.qml @@ -32,7 +32,7 @@ ColumnLayout { //: ex: "... paste an address here to add a contact ..." placeholderText: qsTr("search-list") horizontalAlignment: TextInput.AlignHCenter - icon: gcd.assetPath + "core/search-24px.svg" + icon: gcd.assetPath + "core/search-24px.webp" onTextChanged: { @@ -47,18 +47,19 @@ ColumnLayout { Opaque.Icon { visible:!listpanel.online - source: gcd.assetPath + "core/negative_heart_24px.svg" + source: gcd.assetPath + "core/negative_heart_24px.webp" iconColor: Theme.mainTextColor backgroundColor: Theme.backgroundPaneColor Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter height: 150 width: 150 } - Opaque.EllipsisLabel { + Label { visible:!listpanel.online color: Theme.mainTextColor Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - size: 18 * gcd.themeScale + elide: Text.ElideRight + font.pixelSize: 18 * gcd.themeScale text: qsTr("peer-not-online") } diff --git a/qml/panes/GroupSettingsPane.qml b/qml/panes/GroupSettingsPane.qml index e7d45789..0c52f7e5 100644 --- a/qml/panes/GroupSettingsPane.qml +++ b/qml/panes/GroupSettingsPane.qml @@ -97,7 +97,7 @@ Opaque.SettingsList { // groupSettingsPane width: 18 Layout.alignment: Qt.AlignRight iconColor: gsp.connected ? Theme.statusbarOnlineFontColor : Theme.statusbarDisconnectedTorFontColor - source: gcd.assetPath + (gsp.connected ? "core/signal_cellular_4_bar-24px.svg" : "core/signal_cellular_connected_no_internet_4_bar-24px.svg") + source: gcd.assetPath + (gsp.connected ? "core/signal_cellular_4_bar-24px.webp" : "core/signal_cellular_connected_no_internet_4_bar-24px.webp") } } RowLayout { @@ -115,7 +115,7 @@ Opaque.SettingsList { // groupSettingsPane width: 18 Layout.alignment: Qt.AlignRight iconColor : gsp.synced ? Theme.statusbarOnlineFontColor : Theme.statusbarConnectingFontColor - source: gcd.assetPath + (gsp.synced ? "core/syncing-01.svg" : "core/syncing-03.svg") + source: gcd.assetPath + (gsp.synced ? "core/syncing-01.webp" : "core/syncing-03.webp") } } diff --git a/qml/panes/ProfileAddEditPane.qml b/qml/panes/ProfileAddEditPane.qml index 4c80de0c..dd949e50 100644 --- a/qml/panes/ProfileAddEditPane.qml +++ b/qml/panes/ProfileAddEditPane.qml @@ -43,7 +43,7 @@ Opaque.Flickable { nameLabel.text = "" portrait.performTransform = true - portrait.source = "core/account_circle-24px_negative_space.svg" + portrait.source = "core/account_circle-24px_negative_space.webp" tag = "" confirmDeleteTxt.text = "" radioUsePassword.checked = true @@ -136,7 +136,7 @@ Opaque.Flickable { badgeContent: Image {// Profle Type id: profiletype - source: radioUsePassword.checked ? gcd.assetPath + "/fontawesome/solid/lock.svg" : gcd.assetPath + "/fontawesome/solid/lock-open.svg" + source: radioUsePassword.checked ? gcd.assetPath + "core/lock-24px.webp" : gcd.assetPath + "core/lock-open-24px.webp" height: 40 * gcd.themeScale width: height } diff --git a/qml/panes/ProfileManagerPane.qml b/qml/panes/ProfileManagerPane.qml index 7c039151..a073f15d 100644 --- a/qml/panes/ProfileManagerPane.qml +++ b/qml/panes/ProfileManagerPane.qml @@ -25,7 +25,7 @@ ColumnLayout { spacing: 20 * gcd.themeScale Opaque.ScalingLabel { - anchors.horizontalCenter: parent.horizontalCenter + Layout.alignment: Qt.AlignHCenter wrapMode: TextEdit.Wrap size: Theme.primaryTextSize @@ -56,16 +56,13 @@ ColumnLayout { Opaque.Button { id: "button" - //anchors.horizontalCenter: parent.horizontalCenter - width: 100 * gcd.themeScale + height: Theme.primaryTextSize * gcd.themeScale + icon: "lock_open-24px" //: Unlock text: qsTr("unlock") - height: Theme.primaryTextSize * gcd.themeScale - - onClicked: { gcd.unlockProfiles(txtPassword.text) txtPassword.text = "" @@ -76,7 +73,7 @@ ColumnLayout { Opaque.ScalingLabel { id: error - anchors.horizontalCenter: parent.horizontalCenter + Layout.alignment: Qt.AlignHCenter color: Theme.textfieldErrorColor //: 0 profiles loaded with that password text: qsTr("error-0-profiles-loaded-for-password") diff --git a/qml/panes/ServerAddEditPane.qml b/qml/panes/ServerAddEditPane.qml index 9764a9b8..563ab79a 100644 --- a/qml/panes/ServerAddEditPane.qml +++ b/qml/panes/ServerAddEditPane.qml @@ -34,33 +34,40 @@ Opaque.SettingsList { // Add Profile Pane serverAddEditPane.server_messages = server_messages; } - settings: Column { - anchors.horizontalCenter: parent.horizontalCenter - width: 700 + settings: Column { - Opaque.ScalingLabel { - text: server_name - size: 16 - } + anchors.horizontalCenter: parent.horizontalCenter + width: 700 - Opaque.Setting { - label: qsTr("server-availability") + Opaque.ScalingLabel { + text: server_name + size: 16 + } + + Opaque.Setting { + label: qsTr("server-availability") - field: Opaque.ToggleSwitch { - anchors.right: parent.right + field: Opaque.ToggleSwitch { + anchors.right: parent.right - isToggled: serverAddEditPane.server_available - onToggled: function() { - serverAddEditPane.server_available = !serverAddEditPane.server_available - if (serverAddEditPane.server_available) { - gcd.startServer(serverAddEditPane.server_name) - } else { - gcd.stopServer(serverAddEditPane.server_name) + isToggled: serverAddEditPane.server_available + onToggled: function() { + serverAddEditPane.server_available = !serverAddEditPane.server_available + if (serverAddEditPane.server_available) { + gcd.startServer(serverAddEditPane.server_name) + } else { + gcd.stopServer(serverAddEditPane.server_name) + } } } } - } + + + + + + Opaque.Setting { label: qsTr("server-autostart") @@ -87,6 +94,7 @@ Opaque.SettingsList { // Add Profile Pane } } + Opaque.Setting { inline: false label: qsTr("server-key-bundle") diff --git a/qml/panes/SettingsPane.qml b/qml/panes/SettingsPane.qml index a214ae7d..cc7fe4d1 100644 --- a/qml/panes/SettingsPane.qml +++ b/qml/panes/SettingsPane.qml @@ -20,7 +20,7 @@ Opaque.SettingsList { // settingsPane settings: Column { anchors.horizontalCenter: parent.horizontalCenter - width: 700 + width: parent.width - 20 Opaque.Setting { //: Language @@ -70,8 +70,7 @@ Opaque.SettingsList { // settingsPane Opaque.Slider { id: zoomSlider from: 0.5 - // TODO: find out why > 2.0 halts desktop app on load - task: fix all the qml anchor/layout warnings on load - to: gcd.os == "android" ? 4.0 : 1.9 + to: 4.0 value: gcd.themeScale live: false snapMode: Slider.SnapAlways @@ -158,8 +157,6 @@ Opaque.SettingsList { // settingsPane target: gcd onSupplySettings: function(locale, zoom, theme) { - if (zoom != "") zoomSlider.value = zoom - for (var i=0; i < cbLangItems.count; i++) { var item = cbLangItems.get(i) if (item["value"] == locale) { diff --git a/qml/widgets/ContactList.qml b/qml/widgets/ContactList.qml index e391df71..92ac2120 100644 --- a/qml/widgets/ContactList.qml +++ b/qml/widgets/ContactList.qml @@ -56,7 +56,7 @@ ColumnLayout { //: ex: "... paste an address here to add a contact ..." //placeholderText: qsTr("paste-address-to-add-contact") horizontalAlignment: TextInput.AlignHCenter - icon: gcd.assetPath + "core/search-24px.svg" + icon: gcd.assetPath + "core/search-24px.webp" onTextChanged: { diff --git a/qml/widgets/ContactRow.qml b/qml/widgets/ContactRow.qml index 25bf535b..ddb93340 100644 --- a/qml/widgets/ContactRow.qml +++ b/qml/widgets/ContactRow.qml @@ -76,7 +76,7 @@ Opaque.PortraitRow { spacing: 16 * gcd.themeScale Opaque.Icon { - source: gcd.assetPath + "core/favorite-24px.svg" + source: gcd.assetPath + "core/favorite-24px.webp" iconColor: Theme.toolbarIconColor backgroundColor: rowColor height: 18 * gcd.themeScale @@ -86,7 +86,7 @@ Opaque.PortraitRow { } Opaque.Icon { - source: gcd.assetPath + "core/delete-24px.svg" + source: gcd.assetPath + "core/delete-24px.webp" iconColor: Theme.toolbarIconColor backgroundColor: rowColor height: 18 * gcd.themeScale diff --git a/qml/widgets/Message.qml b/qml/widgets/Message.qml index e8d2788d..23cec57e 100644 --- a/qml/widgets/Message.qml +++ b/qml/widgets/Message.qml @@ -109,25 +109,23 @@ Rectangle { color: parent.color } - Opaque.EllipsisLabel { + Label { id: handle visible: !fromMe && !calendarEvent text: displayName color: Theme.messageFromOtherTextColor - size: Theme.chatSize * gcd.themeScale - weight: Font.Bold + + elide: Text.ElideRight + font.pixelSize: Theme.chatSize * gcd.themeScale + font.weight: Font.Bold font.family: Fonts.applicationFontBold.name font.styleName: "Bold" leftPadding: 10 * gcd.themeScale topPadding: 10 * gcd.themeScale - - container: lbl } - onWidthChanged: { handle.textResize() } - Column { id: colMessageBubble @@ -176,7 +174,7 @@ Rectangle { Image { // ACKNOWLEDGEMENT ICON id: ack - source: root.error != "" ? gcd.assetPath + "fontawesome/regular/window-close.svg" : (root.ackd ? gcd.assetPath + "fontawesome/regular/check-circle.svg" : gcd.assetPath + "fontawesome/regular/hourglass.svg") + source: root.error != "" ? gcd.assetPath + "core/fontawesome/regular/window-close.webp" : (root.ackd ? gcd.assetPath + "core/fontawesome/regular/check-circle.svg" : gcd.assetPath + "core/fontawesome/regular/hourglass.svg") height: Theme.chatMetaTextSize * gcd.themeScale width: Theme.chatMetaTextSize * gcd.themeScale anchors.bottom: parent.bottom diff --git a/qml/widgets/MessageEditor.qml b/qml/widgets/MessageEditor.qml index 1311fbd5..f77d8d58 100644 --- a/qml/widgets/MessageEditor.qml +++ b/qml/widgets/MessageEditor.qml @@ -111,7 +111,7 @@ ColumnLayout { text: "" padding: 6 * gcd.themeScale wrapMode: TextEdit.Wrap - textFormat: Text.RichText + textFormat: Text.PlainText width: rectMessage.width color: Theme.mainTextColor @@ -208,7 +208,7 @@ ColumnLayout { Opaque.Icon { // SEND MESSAGE BUTTON id: btnSend - source: gcd.assetPath + "core/send-24px.svg" + source: gcd.assetPath + "core/send-24px.webp" width: colRight.width height: 50 * gcd.themeScale size: 36 * gcd.themeScale @@ -219,24 +219,10 @@ ColumnLayout { property int nextMessageID: 1 - TextEdit { - id: txtHidden - visible: false - textFormat: Text.RichText - } - onClicked: { - // Cannot use .text b/c in rich text mode it is always full of html - if (txtMessage.length != 0) { - txtHidden.text = restoreEmoji(txtMessage.text) - txtHidden.text = txtHidden.text.replace(/
/g,"[:newline:]"); - - var txt = txtHidden.text.trim() - if (txt.length > 0) { - var rawText = txtHidden.getText(0, txtHidden.text.length) - - root.sendClicked(rawText) - } + var txt = txtMessage.text.trim() + if (txt.length > 0) { + root.sendClicked(txt) } txtMessage.text = "" } @@ -248,7 +234,7 @@ ColumnLayout { Opaque.Icon { // EMOJI DRAWER BUTTON id: btnEmoji - source: gcd.assetPath + "core/mood-24px.svg" + source: gcd.assetPath + "core/mood-24px.webp" size: 25 height: 36 * gcd.themeScale @@ -263,7 +249,7 @@ ColumnLayout { Opaque.Icon { id: btnAttach - source: gcd.assetPath + "core/attach_file-24px.svg" + source: gcd.assetPath + "core/attach_file-24px.webp" size: 25 height: 36 * gcd.themeScale diff --git a/qml/widgets/MyProfile.qml b/qml/widgets/MyProfile.qml index a7048bf5..0d0086d1 100644 --- a/qml/widgets/MyProfile.qml +++ b/qml/widgets/MyProfile.qml @@ -31,6 +31,7 @@ Item { onDualPaneChanged: { realignProfile() } function realignProfile() { + if (dualPane) { profile.height = Theme.contactPortraitSize * logscale @@ -89,7 +90,7 @@ Item { badgeContent: Image {// Profle Type id: profiletype - source: tag == "v1-userPassword" ? gcd.assetPath + "/fontawesome/solid/lock.svg" : gcd.assetPath + "/fontawesome/solid/lock-open.svg" + source: tag == "v1-userPassword" ? gcd.assetPath + "core/lock-24px.webp" : gcd.assetPath + "core/lock_open-24px.webp" height: Theme.badgeTextSize * gcd.themeScale width: height } @@ -105,17 +106,16 @@ Item { id: nameCenter width: name.width + addBtn.width - Opaque.EllipsisLabel { + Label { id: name color: Theme.portraitOnlineTextColor - size: Theme.usernameSize * gcd.themeScale - weight: Font.Bold + elide: Text.ElideRight + font.pixelSize: Theme.usernameSize * gcd.themeScale + font.weight: Font.Bold font.family: Fonts.applicationFontExtraBold.name font.styleName: "ExtraBold" text: nick - extraPadding: addBtn.width + 30 - container: nameRow } Opaque.Button { // Add Button @@ -124,7 +124,7 @@ Item { anchors.left: name.right anchors.top: name.top - icon: "solid/plus" + icon: "fontawesome/solid/plus" height: name.height width: height diff --git a/qml/widgets/ProfileList.qml b/qml/widgets/ProfileList.qml index 6fa1aa9e..bcf4d0ef 100644 --- a/qml/widgets/ProfileList.qml +++ b/qml/widgets/ProfileList.qml @@ -93,6 +93,17 @@ ColumnLayout { image: _image tag: _tag Layout.fillWidth: true + rowClicked: function(handle) { + gcd.broadcast("ResetMessagePane"); + gcd.broadcast("ResetProfile"); + gcd.selectedProfile = handle; + gcd.loadProfile(handle); + parentStack.pane = parentStack.profilePane; + } + editClicked: function(handle, displayName, tag, image) { + profileAddEditPane.load(handle, displayName, tag, image); + parentStack.pane = parentStack.addEditProfilePane; + } } } @@ -101,7 +112,7 @@ ColumnLayout { handle: "" displayName: qsTr("add-new-profile-btn") nameColor: Theme.mainTextColor - image: "/core/account_circle-24px_negative_space.svg" //"/fontawesome/regular/user.svg" + image: "/core/account_circle-24px_negative_space.webp" tag: "" portraitBorderColor: Theme.defaultButtonColor portraitColor: Theme.defaultButtonColor @@ -109,7 +120,7 @@ ColumnLayout { portraitPerformTransform: true badgeVisible: true badgeContent: Image { - source: gcd.assetPath + "/fontawesome/solid/plus.svg" + source: gcd.assetPath + "core/fontawesome/solid/plus.webp" height: Theme.badgeTextSize * gcd.themeScale width: height } diff --git a/qml/widgets/ProfileRow.qml b/qml/widgets/ProfileRow.qml index 18422731..c058b01c 100644 --- a/qml/widgets/ProfileRow.qml +++ b/qml/widgets/ProfileRow.qml @@ -11,55 +11,53 @@ import "../opaque" as Opaque import "../opaque/styles" import "../opaque/theme" -Opaque.PortraitRow { +RowLayout { id: root - badgeColor: Theme.portraitProfileBadgeColor + property alias handle: prow.handle + property alias displayName: prow.displayName + property alias image: prow.image + property alias tag: prow.tag + property alias badgeColor: prow.badgeColor + property var rowClicked: {} + property var editClicked: {} - portraitBorderColor: Theme.portraitOnlineBorderColor - portraitColor: Theme.portraitOnlineBackgroundColor - nameColor: Theme.portraitOnlineTextColor - onionColor: Theme.portraitOnlineTextColor + Opaque.PortraitRow { + id: prow + badgeColor: Theme.portraitProfileBadgeColor + Layout.fillWidth: true + portraitBorderColor: Theme.portraitOnlineBorderColor + portraitColor: Theme.portraitOnlineBackgroundColor + nameColor: Theme.portraitOnlineTextColor + onionColor: Theme.portraitOnlineTextColor - badgeContent: Image {// Profle Type - id: profiletype - source: tag == "v1-userPassword" ? gcd.assetPath + "/fontawesome/solid/lock.svg" : gcd.assetPath + "/fontawesome/solid/lock-open.svg" - height: Theme.badgeTextSize * gcd.themeScale - width: height + badgeContent: Image {// Profle Type + id: profiletype + source: tag == "v1-userPassword" ? gcd.assetPath + "core/lock-24px.webp" : gcd.assetPath + "core/lock_open-24px.webp" + height: Theme.badgeTextSize * gcd.themeScale + width: height + } + + onClicked: rowClicked(handle) } Opaque.Icon {// Edit BUTTON id: btnEdit - source: gcd.assetPath + "core/edit-24px.svg" - - backgroundColor: root.color + source: gcd.assetPath + "core/edit-24px.webp" + Layout.minimumWidth: 80 + Layout.fillHeight: true + backgroundColor: Theme.backgroundMainColor + hilightBackgroundColor: Theme.backgroundHilightElementColor iconColor: Theme.altTextColor - anchors.right: parent.right - - //rectUnread.left anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: 1 * gcd.themeScale - anchors.rightMargin: 20 * gcd.themeScale + // Layout.alignment: Qt.AlignVCenter - height: parent.height * 0.5 - width: parent.height * 0.5 - size: parent.height * 0.5 - onClicked: { - profileAddEditPane.load(handle, displayName, tag, image) - parentStack.pane = parentStack.addEditProfilePane - } + height: root.height / 2 + width: root.height / 2 + size: root.height / 2 - onHover: function (hover) { - root.isHover = hover - } - } - - onClicked: function openClick(handle) { - gcd.broadcast("ResetMessagePane"); - gcd.broadcast("ResetProfile"); - gcd.selectedProfile = handle - gcd.loadProfile(handle) - parentStack.pane = parentStack.profilePane + onClicked: editClicked(handle, displayName, tag, image) } } + diff --git a/qml/widgets/ServerList.qml b/qml/widgets/ServerList.qml index 777bda74..2fcb61a1 100644 --- a/qml/widgets/ServerList.qml +++ b/qml/widgets/ServerList.qml @@ -93,6 +93,14 @@ ColumnLayout { autostart: _autostart messages: _messages Layout.fillWidth: true + rowClicked: function(handle) { + + } + editClicked: function(handle, displayName, tag, image) { + gcd.checkServer(handle) + serverAddEditPane.load(handle, displayName, status, _autostart, _messages, _bundle) + parentStack.pane = parentStack.addEditServerPane + } } } @@ -101,13 +109,13 @@ ColumnLayout { handle: "" displayName: qsTr("add-new-profile-btn") nameColor: Theme.mainTextColor - image: "/fontawesome/regular/user.svg" + image: "core/fontawesome/regular/user.webp" tag: "" portraitBorderColor: Theme.portraitOnlineBorderColor portraitColor: Theme.portraitOnlineBackgroundColor badgeVisible: true badgeContent: Image { - source: gcd.assetPath + "/fontawesome/solid/plus.svg" + source: gcd.assetPath + "core/fontawesome/solid/plus.webp" height: Theme.badgeTextSize * gcd.themeScale width: height } diff --git a/qml/widgets/ServerRow.qml b/qml/widgets/ServerRow.qml index 0585a13b..a448c19d 100644 --- a/qml/widgets/ServerRow.qml +++ b/qml/widgets/ServerRow.qml @@ -11,55 +11,13 @@ import "../opaque" as Opaque import "../opaque/styles" import "../opaque/theme" -Opaque.PortraitRow { +ProfileRow { id: root - property int status; - property string bundle; - property bool autostart; - property int messages; - - portraitBorderColor: Theme.portraitOnlineBorderColor - portraitColor: Theme.portraitOnlineBackgroundColor - nameColor: Theme.portraitOnlineTextColor - onionColor: Theme.portraitOnlineTextColor + property int status + property string bundle + property bool autostart + property int messages badgeColor: status == 1 ? Theme.portraitOnlineBadgeColor : Theme.portraitOfflineBadgeColor - badgeVisible: true - - Opaque.Icon {// Edit BUTTON - id: btnEdit - source: gcd.assetPath + "core/edit-24px.svg" - - backgroundColor: root.color - iconColor: Theme.altTextColor - - anchors.right: parent.right - - //rectUnread.left - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: 1 * gcd.themeScale - anchors.rightMargin: 20 * gcd.themeScale - - height: parent.height * 0.5 - width: parent.height * 0.5 - size: parent.height * 0.5 - - onClicked: { - gcd.checkServer(handle) - serverAddEditPane.load(handle, displayName, status, autostart, messages, bundle) - parentStack.pane = parentStack.addEditServerPane - } - - onHover: function (hover) { - root.isHover = hover - gcd.checkServer(handle) - } - - } - - onClicked: function openClick(handle) { - - } - - + // TODO Badge Images } diff --git a/qml/widgets/Statusbar.qml b/qml/widgets/Statusbar.qml index 8e13bbf9..4a64bb8b 100644 --- a/qml/widgets/Statusbar.qml +++ b/qml/widgets/Statusbar.qml @@ -63,9 +63,9 @@ Rectangle { statusbar.color = Theme.statusbarDisconnectedInternetColor statusMessage.color = Theme.statusbarDisconnectedInternetFontColor networkStatus.iconColor = Theme.statusbarDisconnectedInternetFontColor - networkStatus.source = gcd.assetPath + "core/signal_cellular_off-24px.svg" + networkStatus.source = gcd.assetPath + "core/signal_cellular_off-24px.webp" connectionStatus.iconColor = Theme.statusbarDisconnectedInternetFontColor - connectionStatus.source = gcd.assetPath + "core/syncing-03.svg" + connectionStatus.source = gcd.assetPath + "core/syncing-03.webp" //: Disconnected from the internet, check your connection statusMessage.text = qsTr("network-status-disconnected") show() @@ -73,9 +73,9 @@ Rectangle { statusbar.color = Theme.statusbarDisconnectedTorColor statusMessage.color = Theme.statusbarDisconnectedTorFontColor networkStatus.iconColor = Theme.statusbarDisconnectedTorFontColor - networkStatus.source = gcd.assetPath + "core/signal_cellular_connected_no_internet_4_bar-24px.svg" + networkStatus.source = gcd.assetPath + "core/signal_cellular_connected_no_internet_4_bar-24px.webp" connectionStatus.iconColor = Theme.statusbarDisconnectedTorFontColor - connectionStatus.source = gcd.assetPath + "core/syncing-03.svg" + connectionStatus.source = gcd.assetPath + "core/syncing-03.webp" //: Attempting to connect to Tor network statusMessage.text = qsTr("network-status-attempting-tor") show() @@ -83,9 +83,9 @@ Rectangle { statusbar.color = Theme.statusbarConnectingColor statusMessage.color = Theme.statusbarConnectingFontColor networkStatus.iconColor = Theme.statusbarConnectingFontColor - networkStatus.source = gcd.assetPath + "core/signal_cellular_connected_no_internet_4_bar-24px.svg" + networkStatus.source = gcd.assetPath + "core/signal_cellular_connected_no_internet_4_bar-24px.webp" connectionStatus.iconColor = Theme.statusbarConnectingFontColor - connectionStatus.source = gcd.assetPath + "core/syncing-02.svg" + connectionStatus.source = gcd.assetPath + "core/syncing-02.webp" //: Connecting... statusMessage.text = qsTr("network-status-connecting") show() @@ -93,9 +93,9 @@ Rectangle { statusbar.color = Theme.statusbarOnlineColor statusMessage.color = Theme.statusbarOnlineFontColor networkStatus.iconColor = Theme.statusbarOnlineFontColor - networkStatus.source = gcd.assetPath + "core/signal_cellular_4_bar-24px.svg" + networkStatus.source = gcd.assetPath + "core/signal_cellular_4_bar-24px.webp" connectionStatus.iconColor = Theme.statusbarOnlineFontColor - connectionStatus.source = gcd.assetPath + "core/syncing-01.svg" + connectionStatus.source = gcd.assetPath + "core/syncing-01.webp" //: Online statusMessage.text = qsTr("network-status-online") hide()