Compare commits
No commits in common. "master" and "master" have entirely different histories.
222
.drone.yml
|
@ -1,222 +0,0 @@
|
||||||
workspace:
|
|
||||||
base: /media/sf_GOPATH1/src/cwtch.im
|
|
||||||
path: ui
|
|
||||||
|
|
||||||
pipeline:
|
|
||||||
build-linux:
|
|
||||||
mem_limit: 3G
|
|
||||||
image: therecipe/qt:linux_static
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: master
|
|
||||||
event: [ push, pull_request ]
|
|
||||||
environment:
|
|
||||||
- QT_DIR=/opt/Qt
|
|
||||||
- QT_DOCKER='true'
|
|
||||||
- QT_API=5.13.0
|
|
||||||
- GO111MODULE=on
|
|
||||||
commands:
|
|
||||||
- export PATH=$PATH:/home/user/work/bin:/media/sf_GOPATH1/bin
|
|
||||||
- apt-get -qq update && apt-get --no-install-recommends -qq -y install ca-certificates curl git openssh-client
|
|
||||||
- go mod download
|
|
||||||
- $QT_DIR/$QT_API/gcc_64/bin/lrelease ui.pro
|
|
||||||
- git fetch --tags
|
|
||||||
- export VERSION=`git describe --tags`
|
|
||||||
- export BUILDDATE=`date +%G-%m-%d-%H-%M`
|
|
||||||
- go mod vendor
|
|
||||||
- qtdeploy -ldflags "-X main.buildVer=$VERSION -X main.buildDate=$BUILDDATE" build linux
|
|
||||||
- cp README.md deploy/linux
|
|
||||||
- cp -R assets deploy/linux/
|
|
||||||
- export FILENAME=cwtch-linux-$BUILDDATE.tar.gz
|
|
||||||
- cd deploy
|
|
||||||
- mv linux cwtch
|
|
||||||
- tar -czf $FILENAME cwtch
|
|
||||||
- sha256sum $FILENAME > $FILENAME.sha256
|
|
||||||
- rm -r cwtch
|
|
||||||
build-android-arm-v7a:
|
|
||||||
mem_limit: 3G
|
|
||||||
image: therecipe/qt:android
|
|
||||||
secrets: [upload_jks_file,upload_jks_pass]
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: master
|
|
||||||
event: push
|
|
||||||
environment:
|
|
||||||
- QT_DIR=/opt/Qt
|
|
||||||
- QT_DOCKER='true'
|
|
||||||
- QT_API=5.13.0
|
|
||||||
- ANDROID_NDK_DIR=/home/user/android-ndk-r18b
|
|
||||||
- ANDROID_SDK_DIR=/home/user/android-sdk-linux
|
|
||||||
- GO111MODULE=on
|
|
||||||
commands:
|
|
||||||
- export PATH=$PATH:/home/user/work/bin:/media/sf_GOPATH1/bin
|
|
||||||
- apt-get -qq update && apt-get --no-install-recommends -qq -y install ca-certificates curl git
|
|
||||||
- rm -r vendor/
|
|
||||||
- make clean
|
|
||||||
- echo "cwtch-upload" > android/jks_alias
|
|
||||||
- echo $UPLOAD_JKS_PASS > android/jks_pass
|
|
||||||
- echo $UPLOAD_JKS_FILE | tr -d '\n ' > android/ui.jks.b64
|
|
||||||
- base64 --decode android/ui.jks.b64 > android/ui.jks
|
|
||||||
- export GOARCH=arm
|
|
||||||
- go mod download
|
|
||||||
- export VERSION=`git describe --tags`
|
|
||||||
- export BUILDDATE=`date +%G-%m-%d-%H-%M`
|
|
||||||
- go mod vendor
|
|
||||||
- qtsetup generate android
|
|
||||||
- mv assets android/
|
|
||||||
- ANDROID_MODULES_INCLUDE="Core,Gui,Svg,QuickWidgets,Xml" qtdeploy -ldflags "-X main.buildVer=$VERSION -X main.buildDate=$BUILDDATE" build android
|
|
||||||
- mv android/assets assets
|
|
||||||
- cd deploy
|
|
||||||
- export FILENAME=cwtch-android-arm-v7a-$BUILDDATE.apk
|
|
||||||
- cp android/build-release-signed.apk $FILENAME
|
|
||||||
- sha256sum $FILENAME > $FILENAME.sha256
|
|
||||||
- rm -r android
|
|
||||||
build-android-arm64-v8a:
|
|
||||||
mem_limit: 3G
|
|
||||||
image: therecipe/qt:android
|
|
||||||
secrets: [upload_jks_file,upload_jks_pass]
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: master
|
|
||||||
event: push
|
|
||||||
environment:
|
|
||||||
- QT_DIR=/opt/Qt
|
|
||||||
- QT_DOCKER='true'
|
|
||||||
- QT_API=5.13.0
|
|
||||||
- ANDROID_NDK_DIR=/home/user/android-ndk-r18b
|
|
||||||
- ANDROID_SDK_DIR=/home/user/android-sdk-linux
|
|
||||||
- GO111MODULE=on
|
|
||||||
commands:
|
|
||||||
- export PATH=$PATH:/home/user/work/bin:/media/sf_GOPATH1/bin
|
|
||||||
- apt-get -qq update && apt-get --no-install-recommends -qq -y install ca-certificates curl git
|
|
||||||
- rm -r vendor/
|
|
||||||
- make clean
|
|
||||||
- echo "cwtch-upload" > android/jks_alias
|
|
||||||
- echo $UPLOAD_JKS_PASS > android/jks_pass
|
|
||||||
- echo $UPLOAD_JKS_FILE | tr -d '\n ' > android/ui.jks.b64
|
|
||||||
- base64 --decode android/ui.jks.b64 > android/ui.jks
|
|
||||||
- export GOARCH=arm64
|
|
||||||
- perl -pe 's/versionCode="(\d+)"/"versionCode=\"" .($1+1)."\""/eg' android/AndroidManifest.xml > android/AndroidManifest.xml.inc
|
|
||||||
- rm android/AndroidManifest.xml
|
|
||||||
- mv android/AndroidManifest.xml.inc android/AndroidManifest.xml
|
|
||||||
- go mod download
|
|
||||||
- export VERSION=`git describe --tags`
|
|
||||||
- export BUILDDATE=`date +%G-%m-%d-%H-%M`
|
|
||||||
- go mod vendor
|
|
||||||
- qtsetup generate android
|
|
||||||
- mv assets android/
|
|
||||||
- ANDROID_MODULES_INCLUDE="Core,Gui,Svg,QuickWidgets,Xml" qtdeploy -ldflags "-X main.buildVer=$VERSION -X main.buildDate=$BUILDDATE" build android
|
|
||||||
- mv android/assets assets
|
|
||||||
- cd deploy
|
|
||||||
- export FILENAME=cwtch-android-arm64-v8a-$BUILDDATE.apk
|
|
||||||
- cp android/build-release-signed.apk $FILENAME
|
|
||||||
- sha256sum $FILENAME > $FILENAME.sha256
|
|
||||||
- rm -r android
|
|
||||||
build-windows:
|
|
||||||
mem_limit: 3G
|
|
||||||
image: therecipe/qt:windows_64_static
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: [ master, windows_build ]
|
|
||||||
event: push
|
|
||||||
environment:
|
|
||||||
- QT_DIR=/opt/Qt
|
|
||||||
- QT_DOCKER='true'
|
|
||||||
- QT_API=5.13.0
|
|
||||||
- GO111MODULE=on
|
|
||||||
commands:
|
|
||||||
- export PATH=$PATH:/home/user/work/bin:/media/sf_GOPATH1/bin
|
|
||||||
- apt-get -qq update && apt-get --no-install-recommends -qq -y install ca-certificates curl git zip
|
|
||||||
- rm -r vendor || true
|
|
||||||
- make clean || true
|
|
||||||
- go mod download
|
|
||||||
- export VERSION=`git describe --tags`
|
|
||||||
- export BUILDDATE=`date +%G-%m-%d-%H-%M`
|
|
||||||
- go mod vendor
|
|
||||||
- export QT_DEBUG=true
|
|
||||||
- export CONSOLE=true
|
|
||||||
- export QT_DEBUG_QML=true
|
|
||||||
- qtdeploy -ldflags "-X main.buildVer=$VERSION -X main.buildDate=$BUILDDATE" build windows
|
|
||||||
- cp README.md deploy/windows
|
|
||||||
- cp -R assets deploy/windows/
|
|
||||||
- cp -r windows/* deploy/windows
|
|
||||||
- cd deploy
|
|
||||||
- mv windows cwtch
|
|
||||||
- export FILENAME=cwtch-windows-$BUILDDATE.zip
|
|
||||||
- zip -r $FILENAME cwtch
|
|
||||||
- sha256sum $FILENAME > $FILENAME.sha256
|
|
||||||
- mv cwtch windows
|
|
||||||
package-windows:
|
|
||||||
mem_limit: 3G
|
|
||||||
image: hp41/nsis:latest
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: [ master, windows_build ]
|
|
||||||
event: push
|
|
||||||
environment:
|
|
||||||
commands:
|
|
||||||
- cp nsis/cwtch-installer.nsi deploy/
|
|
||||||
- cd deploy
|
|
||||||
- makensis -V3 cwtch-installer.nsi
|
|
||||||
- export BUILDDATE=`date +%G-%m-%d-%H-%M`
|
|
||||||
- export FILENAME=cwtch-installer-$BUILDDATE.exe
|
|
||||||
- mv cwtch-installer.exe $FILENAME
|
|
||||||
- sha256sum $FILENAME > $FILENAME.sha256
|
|
||||||
- rm cwtch-installer.nsi
|
|
||||||
- rm -r windows
|
|
||||||
deploy-buildfiles:
|
|
||||||
image: pivotaldata/concourse-ssh
|
|
||||||
secrets: [buildfiles_key]
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: master
|
|
||||||
event: push
|
|
||||||
status: [ success ]
|
|
||||||
commands:
|
|
||||||
- apk add --no-cache git
|
|
||||||
- echo $BUILDFILES_KEY > ~/id_rsab64
|
|
||||||
- base64 -d ~/id_rsab64 > ~/id_rsa
|
|
||||||
- chmod 400 ~/id_rsa
|
|
||||||
- export DIR=`date +%G.%m.%d-%H.%M`-`git describe --tags`
|
|
||||||
- cd deploy
|
|
||||||
- mkdir $DIR
|
|
||||||
- mv cwtch* $DIR/
|
|
||||||
- scp -r -o StrictHostKeyChecking=no -i ~/id_rsa $DIR buildfiles@openprivacy.ca:/home/buildfiles/buildfiles/
|
|
||||||
deploy-windows-build:
|
|
||||||
image: pivotaldata/concourse-ssh
|
|
||||||
secrets: [buildfiles_key]
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: windows_build
|
|
||||||
event: push
|
|
||||||
status: [ success ]
|
|
||||||
commands:
|
|
||||||
- apk add --no-cache git
|
|
||||||
- echo $BUILDFILES_KEY > ~/id_rsab64
|
|
||||||
- base64 -d ~/id_rsab64 > ~/id_rsa
|
|
||||||
- chmod 400 ~/id_rsa
|
|
||||||
- git fetch --tags
|
|
||||||
- export DIR=`date +%G.%m.%d-%H.%M`-`git describe --tags`
|
|
||||||
- cd deploy
|
|
||||||
- mkdir -p windows_build/$DIR
|
|
||||||
- mv cwtch* windows_build/$DIR/
|
|
||||||
- scp -r -o StrictHostKeyChecking=no -i ~/id_rsa windows_build buildfiles@openprivacy.ca:/home/buildfiles/buildfiles/
|
|
||||||
notify-email:
|
|
||||||
image: drillster/drone-email
|
|
||||||
host: build.openprivacy.ca
|
|
||||||
port: 25
|
|
||||||
skip_verify: true
|
|
||||||
from: drone@openprivacy.ca
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: master
|
|
||||||
status: [ failure ]
|
|
||||||
notify-gogs:
|
|
||||||
image: openpriv/drone-gogs
|
|
||||||
when:
|
|
||||||
repo: cwtch.im/ui
|
|
||||||
branch: master
|
|
||||||
event: pull_request
|
|
||||||
status: [ success, changed, failure ]
|
|
||||||
secrets: [gogs_account_token]
|
|
||||||
gogs_url: https://git.openprivacy.ca
|
|
|
@ -3,7 +3,3 @@ deploy
|
||||||
moc*
|
moc*
|
||||||
rcc*
|
rcc*
|
||||||
*.qmlc
|
*.qmlc
|
||||||
*.jsc
|
|
||||||
vendor/
|
|
||||||
.directory
|
|
||||||
cwtch_log.txt
|
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
[submodule "qml/opaque"]
|
|
||||||
path = qml/opaque
|
|
||||||
url = https://git.openprivacy.ca/openprivacy/opaque
|
|
|
@ -1,89 +0,0 @@
|
||||||
# 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=<vesion> 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_JDK=/path/to/jre8
|
|
||||||
ANDROID_NDK_DIR=/path/to/ndk
|
|
||||||
|
|
||||||
Once all that setup is done you should be able to run:
|
|
||||||
|
|
||||||
ANDROID_MODULES_INCLUDE="Core,Gui,Svg,QuickWidgets,Xml" 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 <blah>` - 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 <blah> "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
|
|
||||||
|
|
||||||
## Notifications
|
|
||||||
|
|
||||||
- Android 8 (API Level 26) forces you to call setChannelId()
|
|
||||||
- Android 9 "Do Not Disturb" mode also hides all notifications
|
|
||||||
- Setting up notification channels only seems possible *once* per install. any changes you need to make
|
|
||||||
require that the app is reinstalled, or the actual channel deleted and changed.
|
|
9
LICENSE
|
@ -1,9 +0,0 @@
|
||||||
All code in this repository, unless otherwise indicated, is distributed under the following license:
|
|
||||||
|
|
||||||
Copyright 2019 Open Privacy Research Society
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
33
Makefile
|
@ -1,33 +0,0 @@
|
||||||
.PHONY: all clean linux windows android
|
|
||||||
|
|
||||||
DEFAULT_GOAL: linux
|
|
||||||
|
|
||||||
SHELL := env QT_BUILD_VERSION=$(QT_BUILD_VERSION) $(SHELL)
|
|
||||||
QT_BUILD_VERSION ?= "5.13.4"
|
|
||||||
|
|
||||||
all: clean linux windows android
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -r vendor || true
|
|
||||||
find -type f -iname "moc*" | xargs rm
|
|
||||||
find -iname "rcc*" | xargs rm
|
|
||||||
|
|
||||||
linux:
|
|
||||||
date
|
|
||||||
qtdeploy -qt_version $(QT_BUILD_VERSION) build linux 2>&1 | tee qtdeploy.log | pv
|
|
||||||
date
|
|
||||||
cp -R assets deploy/linux/
|
|
||||||
|
|
||||||
windows:
|
|
||||||
date
|
|
||||||
qtdeploy -qt_version $(QT_BUILD_VERSION) build windows 2>&1 | tee qtdeploy.log | pv
|
|
||||||
date
|
|
||||||
cp -R assets deploy/windows/
|
|
||||||
|
|
||||||
android:
|
|
||||||
cp -R assets android/
|
|
||||||
date
|
|
||||||
## 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
|
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
# Settings List / Flickable
|
|
||||||
|
|
||||||
Content not scrolling: Flickable does some reparenting behind the scenes and so
|
|
||||||
in the top level child of the Flickable you will need:
|
|
||||||
|
|
||||||
parent: root.contentItem
|
|
||||||
|
|
||||||
And in the flickable you will need to set the contentHeight:
|
|
||||||
|
|
||||||
contentHeight: <childId>.height + <padding>
|
|
92
README.md
|
@ -1,92 +1,12 @@
|
||||||
# Cwtch - UI
|
# Setup
|
||||||
|
|
||||||
This codebase provides a graphical user interface for Desktop and Android for [Cwtch: Privacy Preserving Infrastructure for Asynchronous, Decentralized and Metadata Resistant Applications](https://git.openprivacy.ca/cwtch.im/cwtch)
|
|
||||||
|
|
||||||
# Security
|
|
||||||
|
|
||||||
**Cwtch is an experimental concept and prototype. We do not recommend you use Cwtch today if you require secure communication.** At least, not yet.
|
|
||||||
|
|
||||||
If you discover a security issue, please log an issue above, or email team@cwtch.im.
|
|
||||||
|
|
||||||
# Running
|
|
||||||
|
|
||||||
# Compiling
|
|
||||||
The UI is built using QT so you will need the development libraries and tools for your OS. Currently we are using QT 5.13.0
|
|
||||||
|
|
||||||
This code relies on [therecipe/qt](https://github.com/therecipe/qt) before getting started consult the [Installation](https://github.com/therecipe/qt/wiki/Installation) and [Getting Started](https://github.com/therecipe/qt/wiki/Getting-Started) documentation to get that up and running. It will make building this much easier.
|
|
||||||
|
|
||||||
Cwtch UI uses the Go module system for dependancies, and git submodules for includin QML components
|
|
||||||
|
|
||||||
```
|
|
||||||
git submodule init
|
|
||||||
git submodule update
|
|
||||||
```
|
|
||||||
|
|
||||||
## Linux
|
|
||||||
|
|
||||||
go mod vendor
|
|
||||||
qtdeploy build linux
|
|
||||||
./deploy/linux/ui -local -debug 2>&1 | grep -v 'Detected anchors on an item that is managed by a layout.'
|
|
||||||
|
|
||||||
The -debug flag increases the logging level.
|
|
||||||
|
|
||||||
The -local flag means the binary should use the local copies of QML files instead of the compiled ones allowing for more rapid UI development.
|
|
||||||
|
|
||||||
The grep statement filters out some QML noise.
|
|
||||||
|
|
||||||
## Android
|
## Android
|
||||||
|
|
||||||
We supply an arm-pie version of tor in `android/libs/armeabi-v7a` with the name `libtor.so`
|
A arm-pie version of tor like [tor-0.3.4.8.arm-pie](https://git.openprivacy.ca/openprivacy/buildfiles/raw/master/tor/tor-0.3.4.8.arm-pie) is required to be placed in `android/libs/armeabi-v7a` with the name `libtor.so`
|
||||||
|
|
||||||
|
# Deployment
|
||||||
|
|
||||||
|
## Android
|
||||||
|
|
||||||
go mod vendor
|
|
||||||
qtdeploy -docker build android
|
qtdeploy -docker build android
|
||||||
adb install deploy/android/build-debug.apk
|
adb install deploy/android/build-debug.apk
|
||||||
|
|
||||||
## Windows
|
|
||||||
|
|
||||||
- Download and install [QT](https://www.qt.io/download) Open Source edition
|
|
||||||
- Go to My Computer - Right Click on This PC - Advanced System Settings - Environment Variables
|
|
||||||
- New - QT_DIR = C:\Qt (or wherever you have it installed)
|
|
||||||
- New - QT_VERSION = 5.12.1 (because I picked 5.12.1)
|
|
||||||
- Edit the Path Variable and Add C:\Qt\Tools\mingw530_32\bin
|
|
||||||
- Install [MSYS2](https://www.msys2.org/) (Bash shell for windows)
|
|
||||||
- Install [Go](https://golang.org/) and make sure it's in the PATH, and add your GOPATH/bin to the PATH
|
|
||||||
- Setup therecipe/qt (instructions https://github.com/therecipe/qt/wiki/Installation-on-Windows)
|
|
||||||
- `go get -u -v github.com/therecipe/qt/cmd/...`
|
|
||||||
- `qtsetup` (Can take around an hour?)
|
|
||||||
|
|
||||||
If all that is done, then check out cwtch.im/ui
|
|
||||||
|
|
||||||
go mod vendor
|
|
||||||
qtdeploy
|
|
||||||
deploy/windows/ui
|
|
||||||
|
|
||||||
Currently if you do not have Tor running Cwtch will start tor for you, which will open a dos console window. We are working to hide this in the future.
|
|
||||||
|
|
||||||
# Contributing
|
|
||||||
|
|
||||||
## Translations
|
|
||||||
|
|
||||||
(If you'd like to add a new translation, feel free to open an issue and we can generate the .ts file for you to edit by hand, or in QT Linguist!)
|
|
||||||
|
|
||||||
### Add new translation
|
|
||||||
|
|
||||||
0. Install the language tools if you have not already (on linux: `sudo apt-get install qttools5-dev qttools-dev-tools`)
|
|
||||||
|
|
||||||
1. Edit `ui.pro` and add a new line in the variable definition for `TRANSLATIONS` like:
|
|
||||||
|
|
||||||
TRANSLATIONS = i18n/translation_en.ts \
|
|
||||||
i18n/translation_de.ts
|
|
||||||
|
|
||||||
2. Edit `qml.qrc` and add a new line near the other translation files like:
|
|
||||||
|
|
||||||
\<file>i18n/translation_de.qm\</file>
|
|
||||||
|
|
||||||
3. To update and generate your new translation file, run `lupdate ui.pro` and you will find your new file in the `i18n/` directory.
|
|
||||||
|
|
||||||
### Updating translations
|
|
||||||
|
|
||||||
Run `lupdate ui.pro` to update all the translation files in the `i18n/` directory, then edit your languages' .ts file to make the appropriate changes. It is recommended to use QT Linguist (`linguist`) to edit the files.
|
|
||||||
|
|
||||||
When done, run `lrelease ui.pro` to compile all the translations from their .ts files into .qm files for use in the program. Then you can compile the ui program.
|
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,11 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<manifest package="ca.openprivacy.cwtch.ui" xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest package="org.qtproject.example.go" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
|
||||||
android:versionName="1.0"
|
<application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="cwtch">
|
||||||
android:versionCode="4"
|
|
||||||
android:installLocation="auto">
|
|
||||||
<application android:hardwareAccelerated="true"
|
|
||||||
android:name="org.qtproject.qt5.android.bindings.QtApplication"
|
|
||||||
android:label="cwtch"
|
|
||||||
android:icon="@drawable/knot">
|
|
||||||
|
|
||||||
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation"
|
<activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation"
|
||||||
android:name="ca.openprivacy.cwtch.ui.CwtchActivity"
|
android:name="org.qtproject.qt5.android.bindings.QtActivity"
|
||||||
android:label="cwtch"
|
android:label="go"
|
||||||
android:theme="@style/AppTheme"
|
|
||||||
android:screenOrientation="unspecified"
|
android:screenOrientation="unspecified"
|
||||||
android:launchMode="singleTop"
|
android:launchMode="singleTop">
|
||||||
android:windowSoftInputMode="adjustResize">
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
@ -48,7 +39,6 @@
|
||||||
<!-- Messages maps -->
|
<!-- Messages maps -->
|
||||||
|
|
||||||
<!-- Splash screen -->
|
<!-- Splash screen -->
|
||||||
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
|
|
||||||
<!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
|
<!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
|
||||||
<!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
|
<!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
|
||||||
<!-- Splash screen -->
|
<!-- Splash screen -->
|
||||||
|
@ -76,59 +66,26 @@
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
|
<!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
|
||||||
<service
|
|
||||||
android:name="ca.openprivacy.cwtch.ui.CwtchService"
|
|
||||||
android:process=":cwtchService">
|
|
||||||
<!--
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="ca.openprivacy.cwtch.ui.CwtchService"/>
|
|
||||||
</intent-filter>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Application arguments -->
|
|
||||||
<meta-data android:name="android.app.arguments" android:value="-service"/>
|
|
||||||
<!-- Application arguments -->
|
|
||||||
|
|
||||||
<meta-data android:name="android.app.lib_name" android:value="go"/>
|
|
||||||
<meta-data android:name="android.app.qt_sources_resource_id" android:resource="@array/qt_sources"/>
|
|
||||||
<meta-data android:name="android.app.repository" android:value="default"/>
|
|
||||||
<meta-data android:name="android.app.qt_libs_resource_id" android:resource="@array/qt_libs"/>
|
|
||||||
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
|
|
||||||
<!-- Deploy Qt libs as part of package -->
|
|
||||||
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="1"/>
|
|
||||||
<meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
|
|
||||||
<meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
|
|
||||||
<!-- Run with local libs -->
|
|
||||||
<meta-data android:name="android.app.use_local_qt_libs" android:value="1"/>
|
|
||||||
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
|
|
||||||
<meta-data android:name="android.app.load_local_libs" android:value="plugins/platforms/android/libqtforandroid.so:plugins/bearer/libqandroidbearer.so:plugins/mediaservice/libqtmedia_android.so:lib/libQt5MultimediaQuick.so:lib/libQt5QuickParticles.so"/>
|
|
||||||
<meta-data android:name="android.app.load_local_jars" android:value="jar/QtAndroid.jar:jar/QtAndroidBearer.jar:jar/QtMultimedia.jar"/>
|
|
||||||
<meta-data android:name="android.app.static_init_classes" android:value="org.qtproject.qt5.android.multimedia.QtMultimediaUtils"/>
|
|
||||||
<!-- Used to specify custom system library path to run with local system libs -->
|
|
||||||
<!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
|
|
||||||
<!-- Messages maps -->
|
|
||||||
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
|
|
||||||
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
|
|
||||||
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
|
|
||||||
<!-- Messages maps -->
|
|
||||||
|
|
||||||
<!-- Background running -->
|
|
||||||
<!-- <meta-data android:name="android.app.background_running" android:value="true"/> -->
|
|
||||||
<!-- Background running -->
|
|
||||||
</service>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29"/> -->
|
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="16"/>
|
||||||
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
|
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
|
||||||
|
|
||||||
|
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
|
||||||
|
Remove the comment if you do not require these default permissions. -->
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission-sdk-23 android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
|
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
||||||
|
|
||||||
|
|
||||||
|
<!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
|
||||||
|
Remove the comment if you do not require these default features. -->
|
||||||
|
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
||||||
|
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
|
||||||
|
<uses-feature android:name="android.hardware.microphone" android:required="false" />
|
||||||
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
|
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
|
@ -1,150 +0,0 @@
|
||||||
buildscript {
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
jcenter()
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
classpath 'com.android.tools.build:gradle:3.2.0'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
google()
|
|
||||||
jcenter()
|
|
||||||
}
|
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
|
||||||
/*******************************************************
|
|
||||||
* The following variables:
|
|
||||||
* - androidBuildToolsVersion,
|
|
||||||
* - androidCompileSdkVersion
|
|
||||||
* - qt5AndroidDir - holds the path to qt android files
|
|
||||||
* needed to build any Qt application
|
|
||||||
* on Android.
|
|
||||||
*
|
|
||||||
* are defined in gradle.properties file. This file is
|
|
||||||
* updated by QtCreator and androiddeployqt tools.
|
|
||||||
* Changing them manually might break the compilation!
|
|
||||||
*******************************************************/
|
|
||||||
|
|
||||||
compileSdkVersion androidCompileSdkVersion.toInteger()
|
|
||||||
|
|
||||||
buildToolsVersion '28.0.3'
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
main {
|
|
||||||
manifest.srcFile 'AndroidManifest.xml'
|
|
||||||
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
|
|
||||||
aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
|
|
||||||
res.srcDirs = [qt5AndroidDir + '/res', 'res']
|
|
||||||
resources.srcDirs = ['src']
|
|
||||||
renderscript.srcDirs = ['src']
|
|
||||||
assets.srcDirs = ['assets']
|
|
||||||
jniLibs.srcDirs = ['libs']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// kinda of cheaty, would prefer to use if (System.getEnv("GOARCH") == "arm64") {
|
|
||||||
// but it doesn't want to work in this context
|
|
||||||
if (qt5AndroidDir.contains("arm64")) {
|
|
||||||
|
|
||||||
splits {
|
|
||||||
|
|
||||||
// Configures multiple APKs based on ABI.
|
|
||||||
abi {
|
|
||||||
|
|
||||||
// Enables building multiple APKs per ABI.
|
|
||||||
enable true
|
|
||||||
|
|
||||||
// By default all ABIs are included, so use reset() and include to specify that we only
|
|
||||||
// want APKs for x86 and x86_64.
|
|
||||||
|
|
||||||
// Resets the list of ABIs that Gradle should create APKs for to none.
|
|
||||||
reset()
|
|
||||||
|
|
||||||
// Specifies a list of ABIs that Gradle should create APKs for.
|
|
||||||
// Note that because of the way that therecipe/qt bundles libraries
|
|
||||||
// only the specific architecture specified by GOARCH /GOARM will *actually*
|
|
||||||
// work so we currently have to do separate builds for each arch - this needs to be fixed.
|
|
||||||
include "arm64-v8a"
|
|
||||||
|
|
||||||
// Specifies that we do not want to also generate a universal APK that includes all ABIs.
|
|
||||||
// QT deploy has to be run twice to generate the libgo_base.so for each arch
|
|
||||||
universalApk false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task linkBuildDebugArm64(type: Exec) {
|
|
||||||
workingDir '../build/build/outputs/apk/debug/'
|
|
||||||
commandLine 'ln', '-sf', 'build-arm64-v8a-debug.apk', 'build-debug.apk'
|
|
||||||
}
|
|
||||||
|
|
||||||
task renameBuildReleaseArm64(type: Exec) {
|
|
||||||
workingDir '../build/build/outputs/apk/release/'
|
|
||||||
commandLine 'mv', 'build-arm64-v8a-release-unsigned.apk', 'build-release-unsigned.apk'
|
|
||||||
}
|
|
||||||
|
|
||||||
afterEvaluate {
|
|
||||||
assembleDebug.finalizedBy(linkBuildDebugArm64)
|
|
||||||
assembleRelease.finalizedBy(renameBuildReleaseArm64)
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
splits {
|
|
||||||
|
|
||||||
// Configures multiple APKs based on ABI.
|
|
||||||
abi {
|
|
||||||
|
|
||||||
// Enables building multiple APKs per ABI.
|
|
||||||
enable true
|
|
||||||
|
|
||||||
// By default all ABIs are included, so use reset() and include to specify that we only
|
|
||||||
// want APKs for x86 and x86_64.
|
|
||||||
|
|
||||||
// Resets the list of ABIs that Gradle should create APKs for to none.
|
|
||||||
reset()
|
|
||||||
|
|
||||||
// Specifies a list of ABIs that Gradle should create APKs for.
|
|
||||||
// Note that because of the way that therecipe/qt bundles libraries
|
|
||||||
// only the specific architecture specified by GOARCH /GOARM will *actually*
|
|
||||||
// work so we currently have to do separate builds for each arch - this needs to be fixed.
|
|
||||||
include "armeabi-v7a"
|
|
||||||
|
|
||||||
// Specifies that we do not want to also generate a universal APK that includes all ABIs.
|
|
||||||
// QT deploy has to be run twice to generate the libgo_base.so for each arch
|
|
||||||
universalApk false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task linkBuildDebugArm7(type: Exec) {
|
|
||||||
workingDir '../build/build/outputs/apk/debug/'
|
|
||||||
commandLine 'ln', '-sf', 'build-armeabi-v7a-debug.apk', 'build-debug.apk'
|
|
||||||
}
|
|
||||||
|
|
||||||
task renameBuildReleaseArm7(type: Exec) {
|
|
||||||
workingDir '../build/build/outputs/apk/release/'
|
|
||||||
commandLine 'mv', 'build-armeabi-v7a-release-unsigned.apk', 'build-release-unsigned.apk'
|
|
||||||
}
|
|
||||||
|
|
||||||
afterEvaluate {
|
|
||||||
assembleDebug.finalizedBy(linkBuildDebugArm7)
|
|
||||||
assembleRelease.finalizedBy(renameBuildReleaseArm7)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
lintOptions {
|
|
||||||
abortOnError true
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 3.7 KiB |
|
@ -1,15 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<item>
|
|
||||||
<shape android:shape="rectangle" >
|
|
||||||
<solid android:color="#FFFDF3FC"/>
|
|
||||||
</shape>
|
|
||||||
</item>
|
|
||||||
|
|
||||||
<!-- It would be nice to find a way to use a transition and trigger it but I haven't yet -->
|
|
||||||
<item>
|
|
||||||
<bitmap android:src="@drawable/splash_350"
|
|
||||||
android:gravity="center" />
|
|
||||||
</item>
|
|
||||||
|
|
||||||
</layer-list>
|
|
Before Width: | Height: | Size: 13 KiB |
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar.Fullscreen">
|
|
||||||
<item name="android:windowBackground">@drawable/splash</item>
|
|
||||||
</style>
|
|
||||||
</resources>
|
|
|
@ -1,5 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<string name="loading_tor">Loading tor...</string>
|
|
||||||
</resources>
|
|
||||||
|
|
|
@ -1,108 +0,0 @@
|
||||||
package ca.openprivacy.cwtch.ui;
|
|
||||||
|
|
||||||
import android.app.Notification;
|
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.app.NotificationChannel;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.content.ComponentName;
|
|
||||||
|
|
||||||
import static android.app.Notification.DEFAULT_LIGHTS;
|
|
||||||
import static android.app.Notification.DEFAULT_SOUND;
|
|
||||||
import static android.app.Notification.DEFAULT_VIBRATE;
|
|
||||||
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
|
|
||||||
import static android.app.NotificationManager.IMPORTANCE_LOW;
|
|
||||||
import static android.content.Context.NOTIFICATION_SERVICE;
|
|
||||||
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
|
|
||||||
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
|
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
|
||||||
import static android.app.Notification.CATEGORY_SERVICE;
|
|
||||||
|
|
||||||
public class CwtchActivity extends org.qtproject.qt5.android.bindings.QtActivity
|
|
||||||
{
|
|
||||||
private static NotificationManager m_notificationManager;
|
|
||||||
private static Notification.Builder m_builderOngoing;
|
|
||||||
private static CwtchActivity m_instance;
|
|
||||||
|
|
||||||
private static String NOTIFICATION_CHANNEL_ID = "cwtch_notification_channel";
|
|
||||||
private static int CONTENT_NOTIFICATION_ID = 2;
|
|
||||||
private static String CONTENT_NOTIFICATION_ID_NAME = "Notifications from Peers";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public CwtchActivity() {
|
|
||||||
m_instance = this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://github.com/bbernhard/qtandroidservices_example/blob/master/source/java/MyCustomAppActivity.java
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle bundle) {
|
|
||||||
super.onCreate(bundle);
|
|
||||||
Log.i("CwtchActivity", "Starting service!");
|
|
||||||
Intent serviceIntent = new Intent(this, ca.openprivacy.cwtch.ui.CwtchService.class);
|
|
||||||
ComponentName ret = startService(serviceIntent);
|
|
||||||
if (ret == null) {
|
|
||||||
Log.i("CwtchActivity", "Started Service: FAILED with null");
|
|
||||||
} else {
|
|
||||||
Log.i("CwtchActivity", "Started Service: " + ret.flattenToString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void notify(String s, String o)
|
|
||||||
{
|
|
||||||
if (m_notificationManager == null) {
|
|
||||||
m_notificationManager = (NotificationManager)m_instance.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
createNotificationChannel();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apparently thr android documentation is just wrong and we need to provide a setGroupSummary
|
|
||||||
// notification regardless of targetted support version...
|
|
||||||
Notification groupSummary =
|
|
||||||
new Notification.Builder(m_instance)
|
|
||||||
.setContentTitle("Cwtch")
|
|
||||||
.setContentText("New Message from Peer: " + o)
|
|
||||||
.setGroupSummary(true)
|
|
||||||
.setWhen(System.currentTimeMillis())
|
|
||||||
.setSmallIcon(R.drawable.ic_launcher)
|
|
||||||
.setGroup(NOTIFICATION_CHANNEL_ID)
|
|
||||||
.setChannelId(NOTIFICATION_CHANNEL_ID)
|
|
||||||
.build();
|
|
||||||
m_notificationManager.notify(1, groupSummary);
|
|
||||||
|
|
||||||
Notification.Builder m_builder = new Notification.Builder(m_instance)
|
|
||||||
.setSmallIcon(R.drawable.ic_launcher)
|
|
||||||
.setChannelId(NOTIFICATION_CHANNEL_ID)
|
|
||||||
.setGroup(NOTIFICATION_CHANNEL_ID)
|
|
||||||
.setWhen(System.currentTimeMillis())
|
|
||||||
.setAutoCancel(true)
|
|
||||||
.setContentTitle("New Message from Peer: " + o)
|
|
||||||
.setContentText("[redacted: Open Cwtch App to see the Message]");
|
|
||||||
m_notificationManager.notify(CONTENT_NOTIFICATION_ID++, m_builder.build());
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void createNotificationChannel() {
|
|
||||||
// Create the NotificationChannel, but only on API 26+ because
|
|
||||||
// the NotificationChannel class is new and not in the support library
|
|
||||||
if (SDK_INT >= 26) {
|
|
||||||
String description = "Cwtch Notification Channel";
|
|
||||||
NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, CONTENT_NOTIFICATION_ID_NAME, NotificationManager.IMPORTANCE_HIGH);
|
|
||||||
channel.setDescription(description);
|
|
||||||
// Register the channel with the system; you can't change the importance
|
|
||||||
// or other notification behaviors after this
|
|
||||||
m_notificationManager.createNotificationChannel(channel);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle root level back button push as a home button push: don't exit, just go to home screen
|
|
||||||
public static void rootHomeHandle() {
|
|
||||||
Intent i = new Intent(Intent.ACTION_MAIN);
|
|
||||||
i.addCategory(Intent.CATEGORY_HOME);
|
|
||||||
m_instance.startActivity(i);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
package ca.openprivacy.cwtch.ui;
|
|
||||||
|
|
||||||
|
|
||||||
import android.app.IntentService;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import org.qtproject.qt5.android.bindings.QtService;
|
|
||||||
|
|
||||||
// https://github.com/bbernhard/qtandroidservices_example
|
|
||||||
public class CwtchService extends QtService {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 24.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:none;}
|
|
||||||
.st1{fill:#BCB6BC;}
|
|
||||||
</style>
|
|
||||||
<path class="st0" d="M0,0h24v24H0V0z"/>
|
|
||||||
<g>
|
|
||||||
<path class="st0" d="M12,5c-1.7,0-3,1.3-3,3s1.3,3,3,3c0.1,0,0.1,0,0.1,0l2.7-4C14.4,5.8,13.3,5,12,5z"/>
|
|
||||||
<path class="st0" d="M12,19.2c2.5,0,4.7-1.3,6-3.2c0-1.7-3.1-2.8-5.2-3l-3.8,5.6C10,19,11,19.2,12,19.2z"/>
|
|
||||||
<path class="st0" d="M6,16c0.4,0.7,1,1.2,1.6,1.7l3.2-4.7C8.7,13.3,6,14.3,6,16z"/>
|
|
||||||
<path class="st1" d="M6,16c0-1.6,2.7-2.7,4.8-3l1.4-2c-0.1,0-0.1,0-0.1,0c-1.7,0-3-1.3-3-3s1.3-3,3-3c1.3,0,2.4,0.8,2.8,2l2.4-3.5
|
|
||||||
C15.7,2.5,13.9,2,12,2C6.5,2,2,6.5,2,12c0,3.3,1.6,6.2,4.1,8l1.6-2.3C7,17.2,6.4,16.6,6,16z"/>
|
|
||||||
<path class="st1" d="M18.5,4.4L12.8,13c2.1,0.2,5.1,1.3,5.2,3c-1.3,1.9-3.5,3.2-6,3.2c-1,0-2-0.2-2.9-0.6l-1.6,2.4
|
|
||||||
C8.8,21.6,10.4,22,12,22c5.5,0,10-4.5,10-10C22,9,20.7,6.3,18.5,4.4z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.0 KiB |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 3c1.66 0 3 1.34 3 3s-1.34 3-3 3-3-1.34-3-3 1.34-3 3-3zm0 14.2c-2.5 0-4.71-1.28-6-3.22.03-1.99 4-3.08 6-3.08 1.99 0 5.97 1.09 6 3.08-1.29 1.94-3.5 3.22-6 3.22z"/></svg>
|
|
Before Width: | Height: | Size: 367 B |
Before Width: | Height: | Size: 774 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM7.07 18.28c.43-.9 3.05-1.78 4.93-1.78s4.51.88 4.93 1.78C15.57 19.36 13.86 20 12 20s-3.57-.64-4.93-1.72zm11.29-1.45c-1.43-1.74-4.9-2.33-6.36-2.33s-4.93.59-6.36 2.33C4.62 15.49 4 13.82 4 12c0-4.41 3.59-8 8-8s8 3.59 8 8c0 1.82-.62 3.49-1.64 4.83zM12 6c-1.94 0-3.5 1.56-3.5 3.5S10.06 13 12 13s3.5-1.56 3.5-3.5S13.94 6 12 6zm0 5c-.83 0-1.5-.67-1.5-1.5S11.17 8 12 8s1.5.67 1.5 1.5S12.83 11 12 11z"/></svg>
|
|
Before Width: | Height: | Size: 597 B |
Before Width: | Height: | Size: 1.1 KiB |
|
@ -1,22 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 24.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:none;}
|
|
||||||
</style>
|
|
||||||
<path class="st0" d="M0,0h24v24H0V0z"/>
|
|
||||||
<g>
|
|
||||||
<circle class="st0" cx="12" cy="9.5" r="1.5"/>
|
|
||||||
<path class="st0" d="M10.7,12.7c-1.3-0.5-2.2-1.8-2.2-3.2C8.5,7.6,10.1,6,12,6c1.7,0,3.2,1.3,3.4,2.9l2.7-2.1C16.6,5.1,14.4,4,12,4
|
|
||||||
c-4.4,0-8,3.6-8,8c0,1.8,0.6,3.5,1.6,4.7L10.7,12.7z"/>
|
|
||||||
<path class="st0" d="M12,16.5c-1.9,0-4.5,0.9-4.9,1.8c1.3,1.1,3,1.7,4.9,1.7s3.6-0.6,4.9-1.7C16.5,17.4,13.9,16.5,12,16.5z"/>
|
|
||||||
<path class="st0" d="M18.6,7.4l-3.1,2.4C15.3,11.6,13.8,13,12,13c-0.1,0-0.3,0-0.4,0l-2.5,2c1.1-0.3,2.2-0.4,2.9-0.4
|
|
||||||
c1.5,0,4.9,0.6,6.4,2.3c1-1.3,1.6-3,1.6-4.8C20,10.3,19.5,8.7,18.6,7.4z"/>
|
|
||||||
<path d="M12,3.4c-4.7,0-8.6,3.8-8.6,8.6c0,4.7,3.8,8.6,8.6,8.6c4.7,0,8.6-3.8,8.6-8.6C20.6,7.3,16.7,3.4,12,3.4z M12,4
|
|
||||||
c2.4,0,4.6,1.1,6.1,2.8l-2.7,2.1C15.2,7.3,13.7,6,12,6c-1.9,0-3.5,1.6-3.5,3.5c0,1.4,0.9,2.7,2.2,3.2l-5.1,4c-1-1.3-1.6-3-1.6-4.7
|
|
||||||
C4,7.6,7.6,4,12,4z M10.5,9.5C10.5,8.7,11.2,8,12,8s1.5,0.7,1.5,1.5S12.8,11,12,11S10.5,10.3,10.5,9.5z M12,20
|
|
||||||
c-1.9,0-3.6-0.6-4.9-1.7c0.4-0.9,3-1.8,4.9-1.8s4.5,0.9,4.9,1.8C15.6,19.4,13.9,20,12,20z M12,14.5c-0.7,0-1.8,0.1-2.9,0.4l2.5-2
|
|
||||||
c0.1,0,0.3,0,0.4,0c1.8,0,3.3-1.4,3.5-3.1l3.1-2.4C19.5,8.7,20,10.3,20,12c0,1.8-0.6,3.5-1.6,4.8C16.9,15.1,13.5,14.5,12,14.5z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.0 KiB |
|
@ -1,20 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:none;}
|
|
||||||
</style>
|
|
||||||
<path class="st0" d="M0,0h24v24H0V0z"/>
|
|
||||||
<g>
|
|
||||||
<circle class="st0" cx="12" cy="9.5" r="1.5"/>
|
|
||||||
<path class="st0" d="M12,4c-4.4,0-8,3.6-8,8c0,1.8,0.6,3.5,1.6,4.8c1.4-1.7,4.9-2.3,6.4-2.3s4.9,0.6,6.4,2.3c1-1.3,1.6-3,1.6-4.8
|
|
||||||
C20,7.6,16.4,4,12,4z M12,13c-1.9,0-3.5-1.6-3.5-3.5S10.1,6,12,6s3.5,1.6,3.5,3.5S13.9,13,12,13z"/>
|
|
||||||
<path class="st0" d="M12,16.5c-1.9,0-4.5,0.9-4.9,1.8C8.4,19.4,10.1,20,12,20s3.6-0.6,4.9-1.7C16.5,17.4,13.9,16.5,12,16.5z"/>
|
|
||||||
<path d="M12,6c-1.9,0-3.5,1.6-3.5,3.5S10.1,13,12,13s3.5-1.6,3.5-3.5S13.9,6,12,6z M12,11c-0.8,0-1.5-0.7-1.5-1.5S11.2,8,12,8
|
|
||||||
s1.5,0.7,1.5,1.5S12.8,11,12,11z"/>
|
|
||||||
<path d="M12,3.4c-4.7,0-8.6,3.8-8.6,8.6c0,4.7,3.8,8.6,8.6,8.6c4.7,0,8.6-3.8,8.6-8.6C20.6,7.3,16.7,3.4,12,3.4z M12,20
|
|
||||||
c-1.9,0-3.6-0.6-4.9-1.7c0.4-0.9,3-1.8,4.9-1.8s4.5,0.9,4.9,1.8C15.6,19.4,13.9,20,12,20z M12,14.5c-1.5,0-4.9,0.6-6.4,2.3
|
|
||||||
c-1-1.3-1.6-3-1.6-4.8c0-4.4,3.6-8,8-8s8,3.6,8,8c0,1.8-0.6,3.5-1.6,4.8C16.9,15.1,13.5,14.5,12,14.5z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 998 B |
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 24.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:none;}
|
|
||||||
</style>
|
|
||||||
<g id="Layer_1">
|
|
||||||
<path class="st0" d="M0,0h24v24H0V0z"/>
|
|
||||||
<g>
|
|
||||||
<circle cx="12" cy="8" r="3"/>
|
|
||||||
<path d="M12,12.9c-2,0-6,1.1-6,3.1c1.3,1.9,3.5,3.2,6,3.2s4.7-1.3,6-3.2C18,14,14,12.9,12,12.9z"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<g id="Layer_2">
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 635 B |
Before Width: | Height: | Size: 396 B |
|
@ -1,23 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 24.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:none;}
|
|
||||||
.st1{fill:#FF0000;}
|
|
||||||
</style>
|
|
||||||
<g>
|
|
||||||
<path class="st0" d="M5.6,16.8C5.6,16.8,5.6,16.8,5.6,16.8c1.5-1.7,4.9-2.3,6.4-2.3C10.5,14.5,7.1,15.1,5.6,16.8z"/>
|
|
||||||
<circle class="st0" cx="12" cy="9.5" r="1.5"/>
|
|
||||||
<path class="st0" d="M12,16.5c-1.9,0-4.4,0.9-4.9,1.8c1.3,1.1,3,1.7,4.9,1.7s3.5-0.6,4.9-1.7C16.4,17.4,13.9,16.5,12,16.5z"/>
|
|
||||||
<path d="M12,6c-1.9,0-3.5,1.6-3.5,3.5S10.1,13,12,13s3.5-1.6,3.5-3.5S13.9,6,12,6z M12,11c-0.8,0-1.5-0.7-1.5-1.5S11.2,8,12,8
|
|
||||||
s1.5,0.7,1.5,1.5S12.8,11,12,11z"/>
|
|
||||||
<path d="M12,11c0.8,0,1.5-0.7,1.5-1.5C13.5,10.3,12.8,11,12,11z"/>
|
|
||||||
<path d="M10.5,9.5c0,0.8,0.7,1.5,1.5,1.5C11.2,11,10.5,10.3,10.5,9.5z"/>
|
|
||||||
<path d="M12,8c0.8,0,1.5,0.7,1.5,1.5C13.5,8.7,12.8,8,12,8z"/>
|
|
||||||
<path d="M12,8c-0.8,0-1.5,0.7-1.5,1.5C10.5,8.7,11.2,8,12,8z"/>
|
|
||||||
<path d="M5.6,16.8c0.4,0.6,0.9,1.1,1.5,1.5c0.4-0.9,3-1.8,4.9-1.8c1.9,0,4.4,0.9,4.9,1.8c0.6-0.4,1.1-0.9,1.5-1.5
|
|
||||||
c-1.5-1.7-4.9-2.3-6.4-2.3S7.2,15.1,5.6,16.8z"/>
|
|
||||||
<path class="st1" d="M5.6,16.8C5.6,16.8,5.6,16.8,5.6,16.8C5.6,16.8,5.6,16.8,5.6,16.8C5.6,16.8,5.6,16.8,5.6,16.8z"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 478 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/></svg>
|
|
Before Width: | Height: | Size: 240 B |
Before Width: | Height: | Size: 512 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M16.5 6v11.5c0 2.21-1.79 4-4 4s-4-1.79-4-4V5c0-1.38 1.12-2.5 2.5-2.5s2.5 1.12 2.5 2.5v10.5c0 .55-.45 1-1 1s-1-.45-1-1V6H10v9.5c0 1.38 1.12 2.5 2.5 2.5s2.5-1.12 2.5-2.5V5c0-2.21-1.79-4-4-4S7 2.79 7 5v12.5c0 3.04 2.46 5.5 5.5 5.5s5.5-2.46 5.5-5.5V6h-1.5z"/></svg>
|
|
Before Width: | Height: | Size: 353 B |
Before Width: | Height: | Size: 530 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8z"/></svg>
|
|
Before Width: | Height: | Size: 373 B |
Before Width: | Height: | Size: 868 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z"/></svg>
|
|
Before Width: | Height: | Size: 197 B |
Before Width: | Height: | Size: 258 B |
Before Width: | Height: | Size: 393 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12l4.58-4.59z"/></svg>
|
|
Before Width: | Height: | Size: 195 B |
Before Width: | Height: | Size: 234 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z"/></svg>
|
|
Before Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 308 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M6 21h12V7H6v14zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"/></svg>
|
|
Before Width: | Height: | Size: 189 B |
Before Width: | Height: | Size: 166 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"/></svg>
|
|
Before Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 270 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>
|
|
Before Width: | Height: | Size: 431 B |
Before Width: | Height: | Size: 218 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM21.41 6.34l-3.75-3.75-2.53 2.54 3.75 3.75 2.53-2.54z"/></svg>
|
|
Before Width: | Height: | Size: 240 B |
Before Width: | Height: | Size: 268 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/></svg>
|
|
Before Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 532 B |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 8.0 KiB |
Before Width: | Height: | Size: 7.5 KiB |
|
@ -1,21 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:none;}
|
|
||||||
</style>
|
|
||||||
<g>
|
|
||||||
<path d="M8.9,12.9c-0.3,0-0.6,0-0.9,0c-2.1,0-6.3,1-6.3,3.1v2.2h5.4V16C7.1,14.7,7.8,13.7,8.9,12.9z"/>
|
|
||||||
<path d="M8,11.1c1.5,0,2.7-1.2,2.7-2.7c0-1.5-1.2-2.7-2.7-2.7c-1.5,0-2.7,1.2-2.7,2.7C5.3,9.9,6.5,11.1,8,11.1z"/>
|
|
||||||
<path d="M14.3,11.1c1.5,0,2.7-1.2,2.7-2.7c0-1.5-1.2-2.7-2.7-2.7s-2.7,1.2-2.7,2.7C11.7,9.9,12.8,11.1,14.3,11.1z"/>
|
|
||||||
<path d="M15.4,13c-0.4,0-0.7-0.1-1.1-0.1c-2.1,0-6-0.4-6.3,3.1v2.2h4.8c0-0.2,0-0.3,0-0.5C12.8,15.8,13.8,14,15.4,13z"/>
|
|
||||||
</g>
|
|
||||||
<path class="st0" d="M0,0h24v24H0V0z"/>
|
|
||||||
<path d="M22.1,18.3c0-0.1,0-0.3,0-0.4c0-0.2,0-0.3,0-0.4l1-0.7c0.1-0.1,0.1-0.2,0.1-0.3l-0.9-1.6c-0.1-0.1-0.2-0.1-0.3-0.1l-1.1,0.5
|
|
||||||
c-0.2-0.2-0.5-0.3-0.8-0.4l-0.2-1.2c0-0.1-0.1-0.2-0.2-0.2h-1.8c-0.1,0-0.2,0.1-0.2,0.2l-0.2,1.2c-0.3,0.1-0.5,0.3-0.8,0.4l-1.1-0.5
|
|
||||||
c-0.1,0-0.2,0-0.3,0.1l-0.9,1.6c-0.1,0.1,0,0.2,0.1,0.3l1,0.7c0,0.1,0,0.3,0,0.4s0,0.3,0,0.4l-1,0.7c-0.1,0.1-0.1,0.2-0.1,0.3
|
|
||||||
l0.9,1.6c0.1,0.1,0.2,0.1,0.3,0.1l1.1-0.5c0.2,0.2,0.5,0.3,0.8,0.4l0.2,1.2c0,0.1,0.1,0.2,0.2,0.2h1.8c0.1,0,0.2-0.1,0.2-0.2L20,21
|
|
||||||
c0.3-0.1,0.5-0.3,0.8-0.4l1.1,0.5c0.1,0,0.2,0,0.3-0.1l0.9-1.6c0.1-0.1,0-0.2-0.1-0.3L22.1,18.3z M18.7,19.5c-0.9,0-1.7-0.8-1.7-1.7
|
|
||||||
c0-0.9,0.8-1.7,1.7-1.7c0.9,0,1.7,0.8,1.7,1.7C20.5,18.8,19.7,19.5,18.7,19.5z"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.6 KiB |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>
|
|
Before Width: | Height: | Size: 236 B |
Before Width: | Height: | Size: 510 B |
Before Width: | Height: | Size: 445 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><g fill="none"><path d="M0 0h24v24H0V0z"/><path opacity=".87" d="M0 0h24v24H0V0z"/></g><path d="M20 8h-3V6.21c0-2.61-1.91-4.94-4.51-5.19C9.51.74 7 3.08 7 6v2H4v14h16V8zm-8 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM9 8V6c0-1.66 1.34-3 3-3s3 1.34 3 3v2H9z"/></svg>
|
|
Before Width: | Height: | Size: 349 B |
Before Width: | Height: | Size: 366 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M20 8h-3V6.21c0-2.61-1.91-4.94-4.51-5.19C9.51.74 7 3.08 7 6h2c0-1.13.6-2.24 1.64-2.7C12.85 2.31 15 3.9 15 6v2H4v14h16V8zm-2 12H6V10h12v10zm-6-3c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2z"/></svg>
|
|
Before Width: | Height: | Size: 327 B |
Before Width: | Height: | Size: 376 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z"/></svg>
|
|
Before Width: | Height: | Size: 185 B |
Before Width: | Height: | Size: 134 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm3.5-9c.83 0 1.5-.67 1.5-1.5S16.33 8 15.5 8 14 8.67 14 9.5s.67 1.5 1.5 1.5zm-7 0c.83 0 1.5-.67 1.5-1.5S9.33 8 8.5 8 7 8.67 7 9.5 7.67 11 8.5 11zm3.5 6.5c2.33 0 4.31-1.46 5.11-3.5H6.89c.8 2.04 2.78 3.5 5.11 3.5z"/></svg>
|
|
Before Width: | Height: | Size: 493 B |
Before Width: | Height: | Size: 984 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/></svg>
|
|
Before Width: | Height: | Size: 285 B |
Before Width: | Height: | Size: 194 B |
|
@ -1,13 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 24.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:none;}
|
|
||||||
</style>
|
|
||||||
<path class="st0" d="M0,0h24v24H0V0z"/>
|
|
||||||
<path id="Subtraction_1" d="M18.5,16L18.5,16L5.3,4.4C6.3,3.5,7.6,3,9,3c1.7,0,3.3,0.7,4.4,2c1.1-1.3,2.7-2,4.4-2
|
|
||||||
C20.6,3,23,5.3,23,8.2c0,0,0,0.1,0,0.1c0,0.6-0.1,1.3-0.3,1.9c-0.2,0.7-0.5,1.3-0.9,1.9C21.1,13.2,20.1,14.4,18.5,16L18.5,16z"/>
|
|
||||||
<path d="M20.2,18.6L2.3,3.1L1,4.6l2.6,2.2C3.2,7.5,3,8.4,3,9.2c0,3.7,3.3,6.6,8.3,11.2l1.4,1.3l1.4-1.3c0.9-0.8,1.7-1.6,2.5-2.3
|
|
||||||
l2.3,2L20.2,18.6z"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 840 B |
Before Width: | Height: | Size: 834 B |
|
@ -1,19 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
||||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
||||||
viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
|
|
||||||
<style type="text/css">
|
|
||||||
.st0{fill:none;}
|
|
||||||
</style>
|
|
||||||
<path class="st0" d="M0,0h24v24H0V0z"/>
|
|
||||||
<g>
|
|
||||||
<path d="M13.6,13.8c-1-0.2-2-0.3-2.8-0.3c-2.7,0-8,1.3-8,4v2h9.8c-0.3-0.6-0.4-1.3-0.4-2.1C12.2,15.9,12.7,14.7,13.6,13.8z"/>
|
|
||||||
<circle cx="10.8" cy="7.4" r="4"/>
|
|
||||||
</g>
|
|
||||||
<path d="M21.1,17.9c0-0.1,0-0.3,0-0.4c0-0.2,0-0.3,0-0.4l1-0.7c0.1-0.1,0.1-0.2,0.1-0.3l-0.9-1.6c-0.1-0.1-0.2-0.1-0.3-0.1l-1.1,0.5
|
|
||||||
c-0.2-0.2-0.5-0.3-0.8-0.4l-0.2-1.2c0-0.1-0.1-0.2-0.2-0.2h-1.8c-0.1,0-0.2,0.1-0.2,0.2l-0.2,1.2c-0.3,0.1-0.5,0.3-0.8,0.4l-1.1-0.5
|
|
||||||
c-0.1,0-0.2,0-0.3,0.1L13.4,16c-0.1,0.1,0,0.2,0.1,0.3l1,0.7c0,0.1,0,0.3,0,0.4c0,0.1,0,0.3,0,0.4l-1,0.7c-0.1,0.1-0.1,0.2-0.1,0.3
|
|
||||||
l0.9,1.6c0.1,0.1,0.2,0.1,0.3,0.1l1.1-0.5c0.2,0.2,0.5,0.3,0.8,0.4l0.2,1.2c0,0.1,0.1,0.2,0.2,0.2h1.8c0.1,0,0.2-0.1,0.2-0.2
|
|
||||||
l0.2-1.2c0.3-0.1,0.5-0.3,0.8-0.4l1.1,0.5c0.1,0,0.2,0,0.3-0.1l0.9-1.6c0.1-0.1,0-0.2-0.1-0.3L21.1,17.9z M17.7,19.2
|
|
||||||
c-0.9,0-1.7-0.8-1.7-1.7c0-0.9,0.8-1.7,1.7-1.7c0.9,0,1.7,0.8,1.7,1.7C19.4,18.4,18.7,19.2,17.7,19.2z"/>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 678 B |
Before Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 9.7 KiB |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/></svg>
|
|
Before Width: | Height: | Size: 374 B |
Before Width: | Height: | Size: 616 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2 .01 7z"/></svg>
|
|
Before Width: | Height: | Size: 183 B |
Before Width: | Height: | Size: 262 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M2 22h20V2L2 22z"/></svg>
|
|
Before Width: | Height: | Size: 156 B |
Before Width: | Height: | Size: 214 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M20 18h2v-8h-2v8zm0 4h2v-2h-2v2zM2 22h16V8h4V2L2 22z"/></svg>
|
|
Before Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 226 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0V0z"/><path d="M21 1l-8.31 8.31 8.31 8.3zM4.91 4.36L3.5 5.77l6.36 6.37L1 21h17.73l2 2 1.41-1.41z"/></svg>
|
|
Before Width: | Height: | Size: 221 B |
Before Width: | Height: | Size: 344 B |
|
@ -1 +0,0 @@
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="24" viewBox="0 0 24 24" width="24"><path d="M.01 0h24v24h-24V0z" fill="none"/><path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"/></svg>
|
|
Before Width: | Height: | Size: 367 B |