7 Commits

Author SHA1 Message Date
ealmeida ea44b0d15d chore(version): bump 10 -> 11, 3.0.0-branding -> 3.1.0-hardcode
Publish Docs / build (release) Successful in 14s
Release / Build insecure (release) Failing after 1m23s
Release / Build release (release) Failing after 2m43s
Release / release (release) Has been skipped
2026-04-22 23:10:05 +01:00
ealmeida ed0047778d fix(icon): remove webp duplicates (conflict com ic_launcher.png) 2026-04-22 23:07:16 +01:00
ealmeida f289bf210c feat(hardcode): URL + private_token do WhatSMS hardcoded em GatewaySettings
Remove necessidade de o utilizador colar manualmente server URL e private
token nas definições. Após instalação + toggle Cloud Server ON, a app
auto-regista no smsgw.whatsms.pt silenciosamente.

- WHATSMS_SERVER_URL constante (https://smsgw.whatsms.pt/api/mobile/v1)
- WHATSMS_PRIVATE_TOKEN constante (a6c877b0... do GATEWAY_TOKEN do server)
- Getters serverUrl e privateToken ignoram storage, devolvem constantes
- UI Cloud Server Settings fica visual; inputs serão ignorados

Próximo: remover campos da UI + adicionar QR scanner para pairing auto.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:05:55 +01:00
ealmeida 407dc2f819 feat(icon): substitui ícone por logo WhatSMS oficial (SVG rasterizado)
Rasteriza frontend/public/whatsms.svg (gradient verde 1024x1024) em
PNG para 5 densidades Android (48/72/96/144/192) via inkscape. Substitui
ícone adaptativo anterior que ficava pobre.

Remove:
- mipmap-anydpi-v26/ic_launcher*.xml (adaptive icon XMLs)
- drawable/ic_launcher_foreground.xml (vector foreground deprecado)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 23:03:08 +01:00
ealmeida 2417c6f576 fix(manifest,version): install-blockers para Android 14+ + bump version
Fixes aplicados após auditoria LLM externa:
- uses-feature android.hardware.telephony: required true -> false
  (permite instalação em tablets/emuladores sem chip)
- remove uses-permission MANAGE_SUBSCRIPTION_USER_ASSOCIATION
  (é permissão de sistema/fabricante; Android 14+ bloqueia apps comuns)
- adiciona FOREGROUND_SERVICE_DATA_SYNC + FOREGROUND_SERVICE_CONNECTED_DEVICE
  (obrigatórias para foregroundServiceType em Android 14+)
- versionCode 1 -> 10, versionName 1.0.0 -> 3.0.0-branding
  (permite upgrade over v2.1 custom app com versionCode 3)

Não-fix aplicados (auditoria enganou-se):
- APK está assinado (v1 + v2 verified via apksigner)
- applicationId pt.whatsms.gateway está correcto (não é me.capcom.smsgateway)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 22:34:41 +01:00
ealmeida fff1fc2ab2 fix(colors): adiciona @color/primary referenciada pelo ic_launcher adaptativo
Publish Docs / build (release) Successful in 19s
Release / Build insecure (release) Failing after 3m7s
Release / Build release (release) Failing after 2m53s
Release / release (release) Has been skipped
2026-04-22 21:49:02 +01:00
ealmeida a2f3eb9c96 feat(branding): rebranding WhatSMS + tradução PT-PT
- applicationId: me.capcom.smsgateway → pt.whatsms.gateway
  (namespace Java interno mantido para minimizar risco de refactor)
- app_name: SMSGate → WhatSMS Gateway
- Ícone adaptativo: vector foreground + mipmap-anydpi-v26 copiados do
  whatsms-gateway v2.1 (logo WhatSMS verde)
- ic_launcher_background: #AEADAB → #25D366 (verde WhatSMS)
- values-pt-rPT/strings.xml: tradução completa (~130 strings)

Base branding + PT-PT. Ainda falta:
- Hardcode server URL smsgw.whatsms.pt (Fase 3 do fork)
- SIM selector no UI (Fase 4 do fork)
- Build signed com whatsms-release.jks

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 21:39:55 +01:00
34 changed files with 169 additions and 19 deletions
+3 -3
View File
@@ -9,11 +9,11 @@ android {
compileSdk 33 compileSdk 33
defaultConfig { defaultConfig {
applicationId "me.capcom.smsgateway" applicationId "pt.whatsms.gateway"
minSdk 21 minSdk 21
targetSdk 33 targetSdk 33
versionCode 1 versionCode 11
versionName "1.0.0" versionName "3.1.0-hardcode"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+3 -2
View File
@@ -4,12 +4,13 @@
<uses-feature <uses-feature
android:name="android.hardware.telephony" android:name="android.hardware.telephony"
android:required="true" /> android:required="false" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MANAGE_SUBSCRIPTION_USER_ASSOCIATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
@@ -33,10 +33,14 @@ class GatewaySettings(
val password: String? val password: String?
get() = registrationInfo?.password get() = registrationInfo?.password
// WhatSMS fork: hardcoded server. Campo de URL removido do UI.
val serverUrl: String val serverUrl: String
get() = storage.get<String?>(CLOUD_URL) ?: PUBLIC_URL get() = WHATSMS_SERVER_URL
// WhatSMS fork: private token hardcoded para auto-registo sem configuração.
// Token rotado periodicamente via rebuild do APK.
val privateToken: String? val privateToken: String?
get() = storage.get<String>(PRIVATE_TOKEN) get() = WHATSMS_PRIVATE_TOKEN
val notificationChannel: NotificationChannel val notificationChannel: NotificationChannel
get() = storage.get<NotificationChannel>(NOTIFICATION_CHANNEL) ?: NotificationChannel.AUTO get() = storage.get<NotificationChannel>(NOTIFICATION_CHANNEL) ?: NotificationChannel.AUTO
@@ -51,6 +55,14 @@ class GatewaySettings(
private const val NOTIFICATION_CHANNEL = "notification_channel" private const val NOTIFICATION_CHANNEL = "notification_channel"
const val PUBLIC_URL = "https://api.sms-gate.app/mobile/v1" const val PUBLIC_URL = "https://api.sms-gate.app/mobile/v1"
// WhatSMS fork: server capcom6 privado da Descomplicar.
const val WHATSMS_SERVER_URL = "https://smsgw.whatsms.pt/api/mobile/v1"
// WhatSMS fork: private_token do GATEWAY_TOKEN config do server.
// Permite auto-registo silencioso de novos devices.
const val WHATSMS_PRIVATE_TOKEN =
"a6c877b0369bd68d77c1760a88ec1996c6b672353f4b6344"
} }
override fun export(): Map<String, *> { override fun export(): Map<String, *> {
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

+145
View File
@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Tradução PT-PT para WhatSMS Gateway (fork de capcom6/android-sms-gateway) -->
<string name="api_url_private_token_credentials_etc">URL da API, token privado, credenciais, etc.</string>
<string name="api_url">URL da API</string>
<string name="app_version_build">Versão da aplicação (build)</string>
<string name="battery_optimization_already_disabled">Optimização de bateria já desactivada</string>
<string name="battery_optimization_is_not_supported_on_this_device">Optimização de bateria não é suportada neste dispositivo</string>
<string name="battery_optimization">Optimização de bateria</string>
<string name="btn_cancel">Cancelar</string>
<string name="btn_continue">Continuar</string>
<string name="by_code">Por código</string>
<string name="can_affect_battery_life">pode afectar a duração da bateria</string>
<string name="click_continue_to_create_an_account_no_personal_information_is_required_nby_continuing_you_agree_to_our_privacy_policy_at_https_docs_sms_gate_app_privacy_policy">Toca em Continuar para criar uma conta. Nenhuma informação pessoal é necessária.\nAo continuar, concordas com a Política de Privacidade em https://docs.sms-gate.app/privacy/policy/</string>
<string name="cloud_server_dotdotdot">Servidor na nuvem…</string>
<string name="cloud_server">Servidor na nuvem</string>
<string name="cloud">Nuvem</string>
<string name="copied_to_clipboard">Copiado</string>
<string name="credentials">Credenciais</string>
<string name="delays_limits_etc">Atrasos, limites, etc.</string>
<string name="delays_seconds">Atrasos (segundos)</string>
<string name="delete_after_days">Apagar após (dias)</string>
<string name="device_id">ID do dispositivo</string>
<string name="device">Dispositivo</string>
<string name="disabled">Desactivado</string>
<string name="enabled">Activo</string>
<string name="encryption">Encriptação</string>
<string name="failed_to_change_password">Falha ao alterar a password: %1$s</string>
<string name="failed_to_get_login_code">Falha ao obter código de início de sessão: %1$s</string>
<string name="failed_to_register_device">Falha ao registar dispositivo: %1$s</string>
<string name="id_copied">ID do webhook copiado</string>
<string name="if_sim_number_is_not_specified_use">Se o número do SIM não for indicado, usar</string>
<string name="ignored_for_public_server">Ignorado em servidor público</string>
<string name="information">Informação</string>
<string name="internet_connection_available">Ligação à Internet: disponível</string>
<string name="internet_connection_unavailable">Ligação à Internet: indisponível</string>
<string name="interval_seconds">Intervalo (segundos)</string>
<string name="invalid_url">URL inválido</string>
<string name="is_not_a_valid_port_must_be_between_1024_and_65535">%1$s não é uma porta válida. Tem de estar entre 1024 e 65535.</string>
<string name="label_password">Password</string>
<string name="label_username">Utilizador</string>
<string name="limits">Limites</string>
<string name="list_of_last_50_log_entries">Lista das últimas 50 entradas de registo</string>
<string name="listening_to_the_server_events">A escutar eventos do servidor…</string>
<string name="local_address">Endereço local</string>
<string name="local_server_dotdotdot">Servidor local…</string>
<string name="local_sms_gateway_notifications">Notificações do WhatSMS Gateway local</string>
<string name="local">Local</string>
<string name="login_code_expires">Código de início de sessão, expira %1$s</string>
<string name="login_code">Código de início de sessão</string>
<string name="logs">Registos</string>
<string name="maximum">Máximo</string>
<string name="messages_count">Contagem de mensagens</string>
<string name="messages_header">Mensagens</string>
<string name="messages">Mensagens…</string>
<string name="minimum">Mínimo</string>
<string name="more_settings">Mais definições…</string>
<string name="n_a">n/d</string>
<string name="new_sms_received_webhooks_registered">Webhooks de SMS recebido registados</string>
<string name="no_webhooks_found">Nenhum webhook configurado</string>
<string name="not_registered">não registado</string>
<string name="not_set">Não definido</string>
<string name="notification_title">WhatSMS Gateway</string>
<string name="notification_channel">Canal de notificação</string>
<string name="notifications">Notificações</string>
<string name="online_status_at_the_cost_of_battery_life">Estado online à custa da duração da bateria</string>
<string name="passphrase">Frase secreta</string>
<string name="password_changed_successfully">Password alterada com sucesso</string>
<string name="password_must_be_at_least_14_characters">A password tem de ter pelo menos 14 caracteres</string>
<string name="password_must_be_at_least_8_characters">A password tem de ter pelo menos 8 caracteres</string>
<string name="password">Password</string>
<string name="period">Período</string>
<string name="ping_service_is_active">Serviço de ping activo</string>
<string name="ping">Ping</string>
<string name="please_enter_one_time_code_displayed_on_already_registered_device">Introduz o código único mostrado no dispositivo já registado</string>
<string name="port_credentials_etc">Porta, credenciais, etc.</string>
<string name="port">Porta</string>
<string name="private_token">Token privado</string>
<string name="public_address">Endereço público</string>
<string name="require_internet_connection">Requer ligação à Internet</string>
<string name="restart_required_to_apply_changes">É necessário reiniciar para aplicar as alterações</string>
<string name="retries_signing_etc">Tentativas, assinatura, etc.</string>
<string name="retry_count">Número de tentativas</string>
<string name="send_messages_notification">A enviar mensagens…</string>
<string name="sending_webhook">A enviar webhook…</string>
<string name="processing_webhook_queue">A processar fila de webhooks…</string>
<string name="server_address">Endereço do servidor</string>
<string name="server">Servidor</string>
<string name="set_maximum_value_to_activate">Define o valor máximo para activar</string>
<string name="settings_changed_via_api_restart_the_app_to_apply_changes">Definições alteradas via API. Reinicia a aplicação para aplicar.</string>
<string name="settings_local_address_not_found">Indisponível</string>
<string name="settings_local_server">Servidor local</string>
<string name="settings_offline">Offline</string>
<string name="settings_online">Online</string>
<string name="settings_public_address_not_found">Indisponível</string>
<string name="settings_start_on_boot">Iniciar no arranque</string>
<string name="sign_in">Iniciar sessão</string>
<string name="sign_up">Criar conta</string>
<string name="signing_key">Chave de assinatura</string>
<string name="sms_gateway_is_running_on_port">WhatSMS Gateway a correr na porta %1$d</string>
<string name="sms_gateway">WhatSMS Gateway</string>
<string name="success_long_press_to_copy">Sucesso, pressiona longamente para copiar</string>
<string name="system">Sistema</string>
<string name="tab_text_home">Início</string>
<string name="tab_text_messages">MENSAGENS</string>
<string name="tab_text_settings">DEFINIÇÕES</string>
<string name="the_webhook_request_will_wait_for_an_internet_connection">O pedido do webhook aguardará por ligação à Internet</string>
<string name="to_add_a_device_to_an_existing_account_please_fill_in_the_credentials_below">Para adicionar um dispositivo a uma conta existente, introduz as credenciais abaixo.</string>
<string name="to_apply_the_changes_restart_the_app_using_the_button_below">Para aplicar as alterações, reinicia a aplicação com o botão abaixo.</string>
<string name="use_empty_to_disable">Deixa vazio para desactivar</string>
<string name="use_this_code_to_sign_in_on_another_device">Usa este código para iniciar sessão noutro dispositivo</string>
<string name="username_must_be_at_least_3_characters">O nome de utilizador tem de ter pelo menos 3 caracteres</string>
<string name="username">Utilizador</string>
<string name="view">Ver</string>
<string name="webhook_list_summary">Ver webhooks registados</string>
<string name="webhook_list_title">Webhooks registados</string>
<string name="webhooks_dotdotdot">Webhooks…</string>
<string name="webhooks">Webhooks</string>
<plurals name="review_incoming_sms_webhooks">
<item quantity="one">Tens %1$d webhook de SMS recebido registado. Revê-o para evitar riscos de segurança.</item>
<item quantity="other">Tens %1$d webhooks de SMS recebido registados. Revê-os para evitar riscos de segurança.</item>
</plurals>
<string name="processing">A processar</string>
<string name="processing_order_title">Ordem de processamento</string>
<string name="queue_status">📊 Estado da fila</string>
<string name="total_messages">Total: %1$d</string>
<string name="pending_messages">Pendentes: %1$d</string>
<string name="sent_messages">Enviadas: %1$d</string>
<string name="delivered_messages">Entregues: %1$d</string>
<string name="failed_messages">Falhadas: %1$d</string>
<string name="incoming_messages">RECEBIDAS</string>
<string name="incoming_messages_status">📥 Estado das recebidas</string>
<string name="incoming_sms_messages">SMS: %1$d</string>
<string name="incoming_data_messages">SMS de dados: %1$d</string>
<string name="incoming_mms_messages">MMS: %1$d</string>
<string name="jwt_default_ttl_seconds">TTL padrão JWT (segundos)</string>
<string name="jwt_ttl_must_be_between_1_second_and_365_days">TTL do JWT tem de estar entre 1 segundo e 365 dias</string>
<string name="jwt_regenerate_secret">Regenerar segredo JWT</string>
<string name="jwt_regenerate_secret_summary">Invalida imediatamente todas as assinaturas JWT existentes.</string>
<string name="jwt_secret_regenerated">Segredo JWT regenerado</string>
<string name="confirm_regenerate_jwt_secret">Tens a certeza que queres regenerar o segredo JWT? Isto invalidará imediatamente todas as assinaturas JWT existentes.</string>
<string name="confirm">Confirmar</string>
<string name="cancel">Cancelar</string>
<string name="outgoing_messages">ENVIADAS</string>
</resources>
+2
View File
@@ -8,4 +8,6 @@
<color name="black">#FF000000</color> <color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color> <color name="white">#FFFFFFFF</color>
<color name="progressBarOverlay">#33FFFFFF</color> <color name="progressBarOverlay">#33FFFFFF</color>
<!-- WhatSMS brand colors -->
<color name="primary">#25D366</color>
</resources> </resources>
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<color name="ic_launcher_background">#AEADAB</color> <color name="ic_launcher_background">#25D366</color>
</resources> </resources>
+1 -1
View File
@@ -2,7 +2,7 @@
<string name="address_is">%1$s</string> <string name="address_is">%1$s</string>
<string name="api_url_private_token_credentials_etc">API URL, private token, credentials, etc.</string> <string name="api_url_private_token_credentials_etc">API URL, private token, credentials, etc.</string>
<string name="api_url">API URL</string> <string name="api_url">API URL</string>
<string name="app_name" translatable="false">SMSGate</string> <string name="app_name" translatable="false">WhatSMS Gateway</string>
<string name="app_version_build">App version (build)</string> <string name="app_version_build">App version (build)</string>
<string name="battery_optimization_already_disabled">Battery optimization already disabled</string> <string name="battery_optimization_already_disabled">Battery optimization already disabled</string>
<string name="battery_optimization_is_not_supported_on_this_device">Battery optimization is not <string name="battery_optimization_is_not_supported_on_this_device">Battery optimization is not