Compare commits
6 Commits
flutter_ap
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
b521f74951
|
|||
|
acc23c0d10
|
|||
|
693d2ad79e
|
|||
|
f19e8950e8
|
|||
|
64d0541dc6
|
|||
|
dfb4d9d9e5
|
@@ -30,25 +30,7 @@ install-release: java gen
|
|||||||
flutter run --release -d 35221JEHN07157
|
flutter run --release -d 35221JEHN07157
|
||||||
|
|
||||||
release: java gen
|
release: java gen
|
||||||
flutter build apk --release
|
@_utils/release.sh
|
||||||
cp build/app/outputs/flutter-apk/app-release.apk "_releases/v$(VERS).apk"
|
|
||||||
@echo ""
|
|
||||||
@echo "--> copied APK to _releases ( Version: $(VERS) )"
|
|
||||||
@echo ""
|
|
||||||
flutter build appbundle --release
|
|
||||||
cp build/app/outputs/bundle/release/app-release.aab "_releases/v$(VERS).aab"
|
|
||||||
cd "build/app/intermediates/merged_native_libs/release/out/lib" && zip -r "../../../../../../../_releases/v$(VERS).symbols.zip" .
|
|
||||||
@echo ""
|
|
||||||
@echo "--> copied AAB to _releases ( Version: $(VERS) )"
|
|
||||||
@echo ""
|
|
||||||
flutter build linux --release
|
|
||||||
tar -czf "_releases/v$(VERS).tar.gz" -C build/linux/x64/release/bundle .
|
|
||||||
@echo ""
|
|
||||||
@echo "--> copied linux-binary to _releases ( Version: $(VERS) )"
|
|
||||||
@echo ""
|
|
||||||
@echo "#=> file://$(shell pwd)/_releases"
|
|
||||||
@echo ""
|
|
||||||
@echo "Done."
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
dart analyze
|
dart analyze
|
||||||
@@ -63,7 +45,6 @@ gen: java
|
|||||||
|
|
||||||
# run `make run` in another terminal (or another variant of flutter run)
|
# run `make run` in another terminal (or another variant of flutter run)
|
||||||
autoreload:
|
autoreload:
|
||||||
@
|
|
||||||
@_utils/autoreload.sh
|
@_utils/autoreload.sh
|
||||||
|
|
||||||
icons:
|
icons:
|
||||||
|
|||||||
51
flutter/_utils/release.sh
Executable file
51
flutter/_utils/release.sh
Executable file
@@ -0,0 +1,51 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [[ -d ".git" ]]; then
|
||||||
|
|
||||||
|
echo "Must be called in project root"
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERS="$(cat pubspec.yaml | grep -oP '(?<=version: ).*' | sed 's/[\s]*//' | tr -d '\n' | tr -d '')"
|
||||||
|
|
||||||
|
VERS_BY_SPEC="$( echo -n "$VERS" | awk -F'+' '{print "v"$1}' )"
|
||||||
|
VERS_BY_TAG="$(git describe --abbrev=0 --tags)"
|
||||||
|
|
||||||
|
if [[ "$VERS_BY_TAG" != "$VERS_BY_SPEC" ]]; then
|
||||||
|
echo "Version in pubspec.yaml ($VERS_BY_SPEC) does not match latest git tag ($VERS_BY_TAG)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "(!) Make sure you've updated version-number in pubspec.yaml (current = ${VERS}) and created a tag (current = ${VERS_BY_TAG}) !"
|
||||||
|
echo '> Press Enter to confirm...' && read -r
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
flutter build apk --release
|
||||||
|
cp build/app/outputs/flutter-apk/app-release.apk "_releases/v${VERS}.apk"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "--> copied APK to _releases ( Version: ${VERS} )"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
flutter build appbundle --release
|
||||||
|
cp build/app/outputs/bundle/release/app-release.aab "_releases/v${VERS}.aab"
|
||||||
|
|
||||||
|
pushd "build/app/intermediates/merged_native_libs/release/out/lib" || exit 1
|
||||||
|
zip -r "../../../../../../../_releases/v${VERS}.symbols.zip" .
|
||||||
|
popd || exit 1
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "--> copied AAB to _releases ( Version: ${VERS} )"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
flutter build linux --release
|
||||||
|
tar -czf "_releases/v${VERS}.tar.gz" -C build/linux/x64/release/bundle .
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "--> copied linux-binary to _releases ( Version: ${VERS} )"
|
||||||
|
echo ""
|
||||||
|
echo "#=> file://$(pwd)/_releases"
|
||||||
|
echo ""
|
||||||
|
echo "Done."
|
||||||
@@ -3,6 +3,10 @@ include:
|
|||||||
- package:lints/recommended.yaml
|
- package:lints/recommended.yaml
|
||||||
- package:flutter_lints/flutter.yaml
|
- package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
|
formatter:
|
||||||
|
page_width: 512
|
||||||
|
trailing_commas: preserve
|
||||||
|
|
||||||
linter:
|
linter:
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -166,20 +166,34 @@ class _MessageViewPageState extends State<MessageViewPage> {
|
|||||||
title: 'Sender',
|
title: 'Sender',
|
||||||
values: [message.senderName!],
|
values: [message.senderName!],
|
||||||
mainAction: () => {
|
mainAction: () => {
|
||||||
Navi.push(context, () => FilteredMessageViewPage(title: message.senderName!, alertText: 'All message sent from \'${message.senderName!}\'', filter: MessageFilter(senderNames: [message.senderName!])))
|
Navi.push(
|
||||||
|
context,
|
||||||
|
() => FilteredMessageViewPage(
|
||||||
|
title: message.senderName!,
|
||||||
|
alertText: 'All message sent from \'${message.senderName!}\'',
|
||||||
|
filter: MessageFilter(senderNames: [message.senderName!]),
|
||||||
|
),
|
||||||
|
),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
if (cfg.showExtendedAttributes)
|
if (cfg.showExtendedAttributes)
|
||||||
UI.metaCard(
|
UI.metaCard(
|
||||||
context: context,
|
context: context,
|
||||||
icon: FontAwesomeIcons.solidGearCode,
|
icon: FontAwesomeIcons.solidGearCode,
|
||||||
title: 'KeyToken',
|
title: 'Used Key',
|
||||||
values: [message.usedKeyID, token?.name ?? '...'],
|
values: [message.usedKeyID, token?.name ?? '...'],
|
||||||
mainAction: () {
|
mainAction: () {
|
||||||
if (message.senderUserID == userAccUserID) {
|
if (message.senderUserID == userAccUserID) {
|
||||||
Navi.push(context, () => KeyTokenViewPage(keytokenID: message.usedKeyID, preloadedData: null, needsReload: null));
|
Navi.push(context, () => KeyTokenViewPage(keytokenID: message.usedKeyID, preloadedData: null, needsReload: null));
|
||||||
} else {
|
} else {
|
||||||
Navi.push(context, () => FilteredMessageViewPage(title: token?.name ?? message.usedKeyID, alertText: 'All message sent with the specified key', filter: MessageFilter(usedKeys: [message.usedKeyID])));
|
Navi.push(
|
||||||
|
context,
|
||||||
|
() => FilteredMessageViewPage(
|
||||||
|
title: token?.name ?? message.usedKeyID,
|
||||||
|
alertText: 'All message sent with the specified key',
|
||||||
|
filter: MessageFilter(usedKeys: [message.usedKeyID]),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@@ -187,13 +201,20 @@ class _MessageViewPageState extends State<MessageViewPage> {
|
|||||||
UI.metaCard(
|
UI.metaCard(
|
||||||
context: context,
|
context: context,
|
||||||
icon: FontAwesomeIcons.solidGearCode,
|
icon: FontAwesomeIcons.solidGearCode,
|
||||||
title: 'KeyToken',
|
title: 'Used Key',
|
||||||
values: [token.name],
|
values: [token.name],
|
||||||
mainAction: () {
|
mainAction: () {
|
||||||
if (message.senderUserID == userAccUserID) {
|
if (message.senderUserID == userAccUserID) {
|
||||||
Navi.push(context, () => KeyTokenViewPage(keytokenID: message.usedKeyID, preloadedData: null, needsReload: null));
|
Navi.push(context, () => KeyTokenViewPage(keytokenID: message.usedKeyID, preloadedData: null, needsReload: null));
|
||||||
} else {
|
} else {
|
||||||
Navi.push(context, () => FilteredMessageViewPage(title: token.name, alertText: 'All message sent with key \'${token.name}\'', filter: MessageFilter(usedKeys: [message.usedKeyID])));
|
Navi.push(
|
||||||
|
context,
|
||||||
|
() => FilteredMessageViewPage(
|
||||||
|
title: token.name,
|
||||||
|
alertText: 'All message sent with key \'${token.name}\'',
|
||||||
|
filter: MessageFilter(usedKeys: [message.usedKeyID]),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@@ -208,19 +229,21 @@ class _MessageViewPageState extends State<MessageViewPage> {
|
|||||||
}
|
}
|
||||||
: null,
|
: null,
|
||||||
),
|
),
|
||||||
UI.metaCard(
|
UI.metaCard(context: context, icon: FontAwesomeIcons.solidTimer, title: 'Timestamp', values: [message.timestamp]),
|
||||||
context: context,
|
|
||||||
icon: FontAwesomeIcons.solidTimer,
|
|
||||||
title: 'Timestamp',
|
|
||||||
values: [message.timestamp],
|
|
||||||
),
|
|
||||||
if (cfg.showExtendedAttributes)
|
if (cfg.showExtendedAttributes)
|
||||||
UI.metaCard(
|
UI.metaCard(
|
||||||
context: context,
|
context: context,
|
||||||
icon: FontAwesomeIcons.solidUser,
|
icon: FontAwesomeIcons.solidUser,
|
||||||
title: 'User',
|
title: 'User',
|
||||||
values: [user?.userID ?? message.senderUserID, if (user?.username != null) user?.username ?? ''],
|
values: [user?.userID ?? message.senderUserID, if (user?.username != null) user?.username ?? ''],
|
||||||
mainAction: () => Navi.push(context, () => FilteredMessageViewPage(title: user?.username ?? message.senderUserID, alertText: 'All message sent by the specified account', filter: MessageFilter(senderUserID: [message.senderUserID]))),
|
mainAction: () => Navi.push(
|
||||||
|
context,
|
||||||
|
() => FilteredMessageViewPage(
|
||||||
|
title: user?.username ?? message.senderUserID,
|
||||||
|
alertText: 'All message sent by the specified account',
|
||||||
|
filter: MessageFilter(senderUserID: [message.senderUserID]),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
if (!cfg.showExtendedAttributes)
|
if (!cfg.showExtendedAttributes)
|
||||||
UI.metaCard(
|
UI.metaCard(
|
||||||
@@ -228,14 +251,28 @@ class _MessageViewPageState extends State<MessageViewPage> {
|
|||||||
icon: FontAwesomeIcons.solidUser,
|
icon: FontAwesomeIcons.solidUser,
|
||||||
title: 'User',
|
title: 'User',
|
||||||
values: [user?.username ?? user?.userID ?? message.senderUserID],
|
values: [user?.username ?? user?.userID ?? message.senderUserID],
|
||||||
mainAction: () => Navi.push(context, () => FilteredMessageViewPage(title: user?.username ?? message.senderUserID, alertText: 'All message sent by the specified account', filter: MessageFilter(senderUserID: [message.senderUserID]))),
|
mainAction: () => Navi.push(
|
||||||
|
context,
|
||||||
|
() => FilteredMessageViewPage(
|
||||||
|
title: user?.username ?? message.senderUserID,
|
||||||
|
alertText: 'All message sent by the specified account',
|
||||||
|
filter: MessageFilter(senderUserID: [message.senderUserID]),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
UI.metaCard(
|
UI.metaCard(
|
||||||
context: context,
|
context: context,
|
||||||
icon: FontAwesomeIcons.solidBolt,
|
icon: FontAwesomeIcons.solidBolt,
|
||||||
title: 'Priority',
|
title: 'Priority',
|
||||||
values: [_prettyPrintPriority(message.priority)],
|
values: [_prettyPrintPriority(message.priority)],
|
||||||
mainAction: () => Navi.push(context, () => FilteredMessageViewPage(title: "Priority ${message.priority}", alertText: 'All message sent with priority ' + _prettyPrintPriority(message.priority), filter: MessageFilter(priority: [message.priority]))),
|
mainAction: () => Navi.push(
|
||||||
|
context,
|
||||||
|
() => FilteredMessageViewPage(
|
||||||
|
title: "Priority ${message.priority}",
|
||||||
|
alertText: 'All message sent with priority ' + _prettyPrintPriority(message.priority),
|
||||||
|
filter: MessageFilter(priority: [message.priority]),
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
if (message.senderUserID == userAccUserID)
|
if (message.senderUserID == userAccUserID)
|
||||||
UI.button(
|
UI.button(
|
||||||
@@ -243,7 +280,8 @@ class _MessageViewPageState extends State<MessageViewPage> {
|
|||||||
onPressed: () {
|
onPressed: () {
|
||||||
Toaster.info("Not Implemented", "... will be implemented in a later version"); // TODO
|
Toaster.info("Not Implemented", "... will be implemented in a later version"); // TODO
|
||||||
},
|
},
|
||||||
color: Colors.red[900]),
|
color: Colors.red[900],
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -261,16 +299,11 @@ class _MessageViewPageState extends State<MessageViewPage> {
|
|||||||
thumbVisibility: false,
|
thumbVisibility: false,
|
||||||
interactive: true,
|
interactive: true,
|
||||||
controller: _controller,
|
controller: _controller,
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(controller: _controller, child: child),
|
||||||
controller: _controller,
|
|
||||||
child: child,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return SingleChildScrollView(
|
return SingleChildScrollView(child: child);
|
||||||
child: child,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -284,12 +317,7 @@ class _MessageViewPageState extends State<MessageViewPage> {
|
|||||||
return [
|
return [
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
UI.channelChip(
|
UI.channelChip(context: context, text: _resolveChannelName(channel, message), margin: const EdgeInsets.fromLTRB(0, 0, 4, 0), fontSize: 16),
|
||||||
context: context,
|
|
||||||
text: _resolveChannelName(channel, message),
|
|
||||||
margin: const EdgeInsets.fromLTRB(0, 0, 4, 0),
|
|
||||||
fontSize: 16,
|
|
||||||
),
|
|
||||||
Expanded(child: SizedBox()),
|
Expanded(child: SizedBox()),
|
||||||
Text(dateFormat.format(DateTime.parse(message.timestamp)), style: const TextStyle(fontSize: 14)),
|
Text(dateFormat.format(DateTime.parse(message.timestamp)), style: const TextStyle(fontSize: 14)),
|
||||||
],
|
],
|
||||||
@@ -337,12 +365,7 @@ class _MessageViewPageState extends State<MessageViewPage> {
|
|||||||
),
|
),
|
||||||
borderColor: (message.priority == 2) ? Colors.red[900] : null,
|
borderColor: (message.priority == 2) ? Colors.red[900] : null,
|
||||||
)
|
)
|
||||||
: UI.box(
|
: UI.box(context: context, padding: const EdgeInsets.all(4), child: Text(message.content ?? ''), borderColor: (message.priority == 2) ? Colors.red[900] : null),
|
||||||
context: context,
|
|
||||||
padding: const EdgeInsets.all(4),
|
|
||||||
child: Text(message.content ?? ''),
|
|
||||||
borderColor: (message.priority == 2) ? Colors.red[900] : null,
|
|
||||||
)
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ class AppSettings extends ChangeNotifier {
|
|||||||
dateFormat = AppSettingsDateFormat.ISO;
|
dateFormat = AppSettingsDateFormat.ISO;
|
||||||
messagePreviewLength = 3;
|
messagePreviewLength = 3;
|
||||||
showInfoAlerts = true;
|
showInfoAlerts = true;
|
||||||
showExtendedAttributes = true;
|
showExtendedAttributes = false;
|
||||||
|
|
||||||
notification0 = AppNotificationSettings();
|
notification0 = AppNotificationSettings();
|
||||||
notification1 = AppNotificationSettings();
|
notification1 = AppNotificationSettings();
|
||||||
@@ -102,7 +102,7 @@ class AppSettings extends ChangeNotifier {
|
|||||||
dateFormat = AppSettingsDateFormat.parse(Globals().sharedPrefs.getString('settings.dateFormat')) ?? dateFormat;
|
dateFormat = AppSettingsDateFormat.parse(Globals().sharedPrefs.getString('settings.dateFormat')) ?? dateFormat;
|
||||||
messagePreviewLength = Globals().sharedPrefs.getInt('settings.messagePreviewLength') ?? messagePreviewLength;
|
messagePreviewLength = Globals().sharedPrefs.getInt('settings.messagePreviewLength') ?? messagePreviewLength;
|
||||||
showInfoAlerts = Globals().sharedPrefs.getBool('settings.showInfoAlerts') ?? showInfoAlerts;
|
showInfoAlerts = Globals().sharedPrefs.getBool('settings.showInfoAlerts') ?? showInfoAlerts;
|
||||||
showInfoAlerts = Globals().sharedPrefs.getBool('settings.showExtendedAttributes') ?? showExtendedAttributes;
|
showExtendedAttributes = Globals().sharedPrefs.getBool('settings.showExtendedAttributes') ?? showExtendedAttributes;
|
||||||
|
|
||||||
notification0 = AppNotificationSettings.load(Globals().sharedPrefs, 'settings.notification0');
|
notification0 = AppNotificationSettings.load(Globals().sharedPrefs, 'settings.notification0');
|
||||||
notification1 = AppNotificationSettings.load(Globals().sharedPrefs, 'settings.notification1');
|
notification1 = AppNotificationSettings.load(Globals().sharedPrefs, 'settings.notification1');
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ name: simplecloudnotifier
|
|||||||
description: "Receive push messages"
|
description: "Receive push messages"
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
|
|
||||||
version: 2.1.0+502
|
version: 2.1.1+509
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.9.0 <4.0.0'
|
sdk: '>=3.9.0 <4.0.0'
|
||||||
|
|||||||
@@ -1,18 +1,19 @@
|
|||||||
package handler
|
package handler
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"net/http"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"blackforestbytes.com/simplecloudnotifier/api/ginresp"
|
"blackforestbytes.com/simplecloudnotifier/api/ginresp"
|
||||||
"blackforestbytes.com/simplecloudnotifier/logic"
|
"blackforestbytes.com/simplecloudnotifier/logic"
|
||||||
"blackforestbytes.com/simplecloudnotifier/models"
|
"blackforestbytes.com/simplecloudnotifier/models"
|
||||||
"blackforestbytes.com/simplecloudnotifier/website"
|
"blackforestbytes.com/simplecloudnotifier/website"
|
||||||
"errors"
|
|
||||||
"git.blackforestbytes.com/BlackForestBytes/goext/ginext"
|
"git.blackforestbytes.com/BlackForestBytes/goext/ginext"
|
||||||
"git.blackforestbytes.com/BlackForestBytes/goext/rext"
|
"git.blackforestbytes.com/BlackForestBytes/goext/rext"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"net/http"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type WebsiteHandler struct {
|
type WebsiteHandler struct {
|
||||||
@@ -77,6 +78,18 @@ func (h WebsiteHandler) MessageSent(pctx ginext.PreContext) ginext.HTTPResponse
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h WebsiteHandler) PrivacyPolicy(pctx ginext.PreContext) ginext.HTTPResponse {
|
||||||
|
ctx, g, errResp := pctx.Start()
|
||||||
|
if errResp != nil {
|
||||||
|
return *errResp
|
||||||
|
}
|
||||||
|
defer ctx.Cancel()
|
||||||
|
|
||||||
|
return h.app.DoRequest(ctx, g, models.TLockNone, func(ctx *logic.AppContext, finishSuccess func(r ginext.HTTPResponse) ginext.HTTPResponse) ginext.HTTPResponse {
|
||||||
|
return h.serveAsset(g, "privacy_policy.html", true)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (h WebsiteHandler) FaviconIco(pctx ginext.PreContext) ginext.HTTPResponse {
|
func (h WebsiteHandler) FaviconIco(pctx ginext.PreContext) ginext.HTTPResponse {
|
||||||
ctx, g, errResp := pctx.Start()
|
ctx, g, errResp := pctx.Start()
|
||||||
if errResp != nil {
|
if errResp != nil {
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
"blackforestbytes.com/simplecloudnotifier/api/handler"
|
"blackforestbytes.com/simplecloudnotifier/api/handler"
|
||||||
"blackforestbytes.com/simplecloudnotifier/logic"
|
"blackforestbytes.com/simplecloudnotifier/logic"
|
||||||
"blackforestbytes.com/simplecloudnotifier/models"
|
"blackforestbytes.com/simplecloudnotifier/models"
|
||||||
"blackforestbytes.com/simplecloudnotifier/swagger"
|
"blackforestbytes.com/simplecloudnotifier/swagger"
|
||||||
"errors"
|
|
||||||
"git.blackforestbytes.com/BlackForestBytes/goext/ginext"
|
"git.blackforestbytes.com/BlackForestBytes/goext/ginext"
|
||||||
"github.com/gin-gonic/gin/binding"
|
"github.com/gin-gonic/gin/binding"
|
||||||
"github.com/go-playground/validator/v10"
|
"github.com/go-playground/validator/v10"
|
||||||
@@ -98,6 +99,10 @@ func (r *Router) Init(e *ginext.GinWrapper) error {
|
|||||||
frontend.GET("/message_sent.php").Handle(r.websiteHandler.MessageSent)
|
frontend.GET("/message_sent.php").Handle(r.websiteHandler.MessageSent)
|
||||||
frontend.GET("/message_sent.html").Handle(r.websiteHandler.MessageSent)
|
frontend.GET("/message_sent.html").Handle(r.websiteHandler.MessageSent)
|
||||||
|
|
||||||
|
frontend.GET("/privacy_policy").Handle(r.websiteHandler.PrivacyPolicy)
|
||||||
|
frontend.GET("/privacy_policy.php").Handle(r.websiteHandler.PrivacyPolicy)
|
||||||
|
frontend.GET("/privacy_policy.html").Handle(r.websiteHandler.PrivacyPolicy)
|
||||||
|
|
||||||
frontend.GET("/favicon.ico").Handle(r.websiteHandler.FaviconIco)
|
frontend.GET("/favicon.ico").Handle(r.websiteHandler.FaviconIco)
|
||||||
frontend.GET("/favicon.png").Handle(r.websiteHandler.FaviconPNG)
|
frontend.GET("/favicon.png").Handle(r.websiteHandler.FaviconPNG)
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<form id="mainpnl">
|
<form id="mainpnl">
|
||||||
|
|
||||||
<a tabindex="-1" href="https://play.google.com/store/apps/details?id=com.blackforestbytes.simplecloudnotifier" class="button bordered edge-btn" id="tl_link1"><span class="icn-google-play"></span></a>
|
<a tabindex="-1" href="https://play.google.com/store/apps/details?id=com.blackforestbytes.simplecloudnotifier" class="button bordered edge-btn" id="tl_link1"><span class="icn-google-play"></span></a>
|
||||||
<a tabindex="-1" href="#" class="button bordered edge-btn" id="tl_link2"><span class="icn-app-store"></span></a>
|
<a tabindex="-1" href="https://apps.apple.com/us/app/simplecloudnotifier/id6455594868" class="button bordered edge-btn" id="tl_link2"><span class="icn-app-store"></span></a>
|
||||||
|
|
||||||
<a tabindex="-1" href="/api" class="button bordered edge-btn" id="tr_link">API</a>
|
<a tabindex="-1" href="/api" class="button bordered edge-btn" id="tr_link">API</a>
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<div id="mainpnl">
|
<div id="mainpnl">
|
||||||
|
|
||||||
<a tabindex="-1" href="https://play.google.com/store/apps/details?id=com.blackforestbytes.simplecloudnotifier" class="button bordered edge-btn" id="tl_link1"><span class="icn-google-play"></span></a>
|
<a tabindex="-1" href="https://play.google.com/store/apps/details?id=com.blackforestbytes.simplecloudnotifier" class="button bordered edge-btn" id="tl_link1"><span class="icn-google-play"></span></a>
|
||||||
<a tabindex="-1" href="#" class="button bordered edge-btn" id="tl_link2"><span class="icn-app-store"></span></a>
|
<a tabindex="-1" href="https://apps.apple.com/us/app/simplecloudnotifier/id6455594868" class="button bordered edge-btn" id="tl_link2"><span class="icn-app-store"></span></a>
|
||||||
|
|
||||||
<a tabindex="-1" href="/" class="button bordered edge-btn" id="tr_link">Send</a>
|
<a tabindex="-1" href="/" class="button bordered edge-btn" id="tr_link">Send</a>
|
||||||
|
|
||||||
|
|||||||
54
scnserver/website/privacy_policy.html
Normal file
54
scnserver/website/privacy_policy.html
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
{{template|header.[theme].html}}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="copyinfo">
|
||||||
|
<a tabindex="-1" href="https://www.blackforestbytes.com">© blackforestbytes</a>
|
||||||
|
<a tabindex="-1" href="https://www.mikescher.com">made by Mike Schwörer</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template|theme_switch.[theme].html}}
|
||||||
|
|
||||||
|
<div id="mainpnl">
|
||||||
|
|
||||||
|
<strong>Privacy Policy</strong>
|
||||||
|
<p>This privacy policy applies to the SimpleCloudNotifier app (hereby referred to as "Application") for mobile devices that was created by blackforestbytes GmbH (hereby referred to as "Service Provider") as a Free service. This service is intended for use "AS IS".</p>
|
||||||
|
<br>
|
||||||
|
<strong>What information does the Application obtain and how is it used?</strong>
|
||||||
|
<p>The Application does not obtain any information when you download and use it. Registration is not required to use the Application.</p>
|
||||||
|
<br>
|
||||||
|
<strong>Does the Application collect precise real time location information of the device?</strong>
|
||||||
|
<p>This Application does not collect precise information about the location of your mobile device.</p>
|
||||||
|
<br>
|
||||||
|
<strong>Do third parties see and/or have access to information obtained by the Application?</strong>
|
||||||
|
<p>Since the Application does not collect any information, no data is shared with third parties.</p>
|
||||||
|
<br>
|
||||||
|
<strong>What are my opt-out rights?</strong>
|
||||||
|
<p>You can stop all collection of information by the Application easily by uninstalling it. You may use the standard uninstall processes as may be available as part of your mobile device or via the mobile application marketplace or network.</p>
|
||||||
|
<br>
|
||||||
|
<strong>Children</strong>
|
||||||
|
<p>The Application is not used to knowingly solicit data from or market to children under the age of 13.</p>
|
||||||
|
<br>
|
||||||
|
<p>The Service Provider does not knowingly collect personally identifiable information from children. The Service Provider encourages all children to never submit any personally identifiable information through the Application and/or Services. The Service Provider encourage parents and legal guardians to monitor their children's Internet usage and to help enforce this Policy by instructing their children never to provide personally identifiable information through the Application and/or Services without their permission. If you have reason to believe that a child has provided personally identifiable information to the Service Provider through the Application and/or Services, please contact the Service Provider (playstore_scn@blackforestbytes.de) so that they will be able to take the necessary actions. You must also be at least 16 years of age to consent to the processing of your personally identifiable information in your country (in some countries we may allow your parent or guardian to do so on your behalf).</p>
|
||||||
|
<br>
|
||||||
|
<strong>Security</strong>
|
||||||
|
<p>The Service Provider is concerned about safeguarding the confidentiality of your information. However, since the Application does not collect any information, there is no risk of your data being accessed by unauthorized individuals.</p>
|
||||||
|
<br>
|
||||||
|
<strong>Changes</strong>
|
||||||
|
<p>This Privacy Policy may be updated from time to time for any reason. The Service Provider will notify you of any changes to their Privacy Policy by updating this page with the new Privacy Policy. You are advised to consult this Privacy Policy regularly for any changes, as continued use is deemed approval of all changes.</p>
|
||||||
|
<br>
|
||||||
|
<p>This privacy policy is effective as of 2025-11-10</p>
|
||||||
|
<br>
|
||||||
|
<strong>Your Consent</strong>
|
||||||
|
<p>By using the Application, you are consenting to the processing of your information as set forth in this Privacy Policy now and as amended by the Service Provider.</p>
|
||||||
|
<br><strong>Contact Us</strong>
|
||||||
|
<p>If you have any questions regarding privacy while using the Application, or have questions about the practices, please contact the Service Provider via email at playstore_scn@blackforestbytes.de.</p>
|
||||||
|
<hr>
|
||||||
|
<p>This privacy policy page was generated by <a href="https://app-privacy-policy-generator.nisrulz.com/" target="_blank" rel="noopener noreferrer">App Privacy Policy Generator</a></p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user