36 Commits

Author SHA1 Message Date
b1c0f97c65 Merge pull request 'build/apk-subida' (#4) from KevGore/Helldivers-app-movil:build/apk-subida into main
All checks were successful
Build Android APK / build (push) Successful in 3m1s
Reviewed-on: #4
2026-05-16 18:05:19 +00:00
Kevin Alonso
6f4ddfca23 Merge branch 'build/apk-subida' of https://git-dangilcal.duckdns.org/KevGore/Helldivers-app-movil into build/apk-subida 2026-05-16 19:55:54 +02:00
Kevin Alonso
d3f0a2692a volver movido a la izquierda 2026-05-16 19:54:01 +02:00
dafa6c4409 Merge pull request 'color de fondo cambiado' (#3) from KevGore/Helldivers-app-movil:build/apk-subida into main
All checks were successful
Build Android APK / build (push) Successful in 3m3s
Reviewed-on: #3
2026-05-16 15:21:44 +00:00
ced7d4c946 Merge branch 'main' into build/apk-subida 2026-05-16 15:21:34 +00:00
Kevin Alonso
fa728f575f color de fondo cambiado 2026-05-16 17:02:45 +02:00
b2cb5d904f Merge pull request 'build/apk-subida' (#2) from KevGore/Helldivers-app-movil:build/apk-subida into main
All checks were successful
Build Android APK / build (push) Successful in 2m59s
Reviewed-on: #2
2026-05-16 08:55:25 +00:00
6c92896dfd Merge branch 'main' into build/apk-subida 2026-05-16 08:53:41 +00:00
Kevin Alonso
1184a53a81 añadidi el boton de musica, bajado los botones medio cm 2026-05-16 02:02:11 +02:00
Kevin Alonso
03925e1ea8 modificado el qr y mejorada la kinestetika de los botones 2026-05-16 00:18:51 +02:00
f4d5182b3f Merge pull request 'Subir proyecto completo con build' (#1) from KevGore/Helldivers-app-movil:build/apk-subida into main
All checks were successful
Build Android APK / build (push) Successful in 3m3s
Reviewed-on: #1
2026-05-15 21:35:56 +00:00
Kevin Alonso
878934832a Subir proyecto completo con build 2026-05-15 23:25:37 +02:00
3db3075ca9 Fix tag fetch in pipeline
All checks were successful
Build Android APK / build (push) Successful in 3m2s
2026-04-17 14:32:30 +02:00
a299f081d5 Fix release creation by fetching tags
Some checks failed
Build Android APK / build (push) Failing after 3m0s
2026-04-17 14:16:25 +02:00
e69a617a96 Restore original SoundManager
Some checks failed
Build Android APK / build (push) Failing after 3m1s
2026-04-17 13:52:10 +02:00
d4b079bc75 Use Java 17 for compatibility
Some checks failed
Build Android APK / build (push) Has been cancelled
2026-04-17 13:49:33 +02:00
de1bd7c1b8 Fix sound overlapping and keystore path in pipeline
All checks were successful
Build Android APK / build (push) Successful in 2m54s
2026-04-17 13:46:20 +02:00
683287bfbb Configure signing for release builds
Some checks failed
Build Android APK / build (push) Failing after 1m36s
2026-04-17 13:39:39 +02:00
9b7f720564 Try alternative release creation
All checks were successful
Build Android APK / build (push) Successful in 3m4s
2026-04-17 00:51:11 +02:00
254c8bb67d Fix release tag issue 2026-04-16 19:55:16 +02:00
122eff7b03 Rename APK with version name 2026-04-16 19:51:24 +02:00
5eeefc0e32 Use GITEATOKEN secret
Some checks failed
Build Android APK / build (push) Failing after 2m54s
2026-04-16 19:29:54 +02:00
cf4aa32061 Improve release creation logging 2026-04-16 19:18:52 +02:00
0e1f2e0bd7 Debug release creation 2026-04-16 19:14:47 +02:00
6dffd6786b Fix release API call 2026-04-16 19:09:02 +02:00
cdf30c7f09 Fix release creation for Gitea 2026-04-16 19:03:09 +02:00
4a118a3883 Add release creation step 2026-04-16 18:48:37 +02:00
4f57184e78 Use upload-artifact v3 for GHES compatibility
All checks were successful
Build Android APK / build (push) Successful in 2m59s
2026-04-16 18:22:28 +02:00
1ab2a5069c Remove corrupted PNG file
Some checks failed
Build Android APK / build (push) Failing after 2m59s
2026-04-16 18:18:22 +02:00
2ef39942cd Change Java version to 17 for CI compatibility
Some checks failed
Build Android APK / build (push) Failing after 1m30s
2026-04-16 18:15:37 +02:00
d08f5169f3 Use setup-android action
Some checks failed
Build Android APK / build (push) Failing after 1m5s
2026-04-16 18:13:49 +02:00
0b83656b9d Add distribution to setup-java
Some checks failed
Build Android APK / build (push) Failing after 17s
2026-04-16 18:12:57 +02:00
062232a0bc Remove debugging step
Some checks failed
Build Android APK / build (push) Failing after 6s
2026-04-16 18:11:55 +02:00
7b0f443426 Use Java 17 in workflow
Some checks failed
Build Android APK / build (push) Failing after 1m21s
2026-04-16 17:54:48 +02:00
08202d097f Fix workflow config
Some checks failed
Build Android APK / build (push) Has been cancelled
2026-04-16 17:52:19 +02:00
93a71a75b8 Add gradle wrapper jar
Some checks failed
Build Android APK / build (push) Has been cancelled
2026-04-16 17:49:14 +02:00
29 changed files with 464 additions and 267 deletions

View File

@@ -8,34 +8,103 @@ on:
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up JDK 21 - name: Setup JDK
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
java-version: '21' java-version: '17'
distribution: 'temurin' distribution: 'temurin'
- name: Setup Android SDK - name: Setup Android SDK
run: | uses: android-actions/setup-android@v2
mkdir -p $ANDROID_HOME/cmdline-tools
cd $ANDROID_HOME/cmdline-tools
wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O cmdline-tools.zip
unzip -q cmdline-tools.zip
mv cmdline-tools latest
echo "y" | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses > /dev/null 2>&1
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0"
- name: Build APK - name: Setup Keystore
run: |
echo "${{ secrets.ANDROIDKEYSTOREBASE64 }}" | base64 -d > app/helldivers.keystore
env:
ANDROIDKEYSTOREPATH: app/helldivers.keystore
ANDROIDKEYSTOREPASS: ${{ secrets.ANDROIDKEYSTOREPASS }}
ANDROIDKEYALIAS: ${{ secrets.ANDROIDKEYALIAS }}
ANDROIDKEYPASS: ${{ secrets.ANDROIDKEYPASS }}
- name: Build with Gradle
run: | run: |
chmod +x ./gradlew chmod +x ./gradlew
./gradlew assembleRelease --no-daemon -Dorg.gradle.java.home=$JAVA_HOME ./gradlew assembleRelease --no-daemon
- name: Upload APK - name: Upload APK
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v3
with: with:
name: apk name: apk
path: app/build/outputs/apk/release/*.apk path: app/build/outputs/apk/release/*.apk
- name: Create Release
run: |
# Fetch the specific tag from remote
git fetch origin tag v0.2.0 --force
# Get tag name from git
TAG_NAME=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$TAG_NAME" ]; then
TAG_NAME="${GITHUB_REF#refs/tags/}"
fi
# Quitar la v del tag si existe
TAG_NAME_CLEAN="${TAG_NAME#v}"
APK_FILE=$(ls app/build/outputs/apk/release/*.apk | head -1)
# Rename APK with version
NEW_NAME="Helldivers-app-${TAG_NAME}.apk"
cp "$APK_FILE" "$NEW_NAME"
echo "=== Creating release for tag: $TAG_NAME ==="
echo "APK file: $APK_FILE"
# Use the token from secrets
if [ -z "${{ secrets.GITEATOKEN }}" ]; then
echo "ERROR: No GITEATOKEN found"
exit 1
fi
# Create release using Gitea API - Create from existing tag
echo "Creating release..."
RELEASE_RESP=$(curl -s -X POST "https://git-dangilcal.duckdns.org/api/v1/repos/dangilcal/Helldivers-app-movil/releases" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: token ${{ secrets.GITEATOKEN }}" \
-d "{
\"tag_name\": \"${TAG_NAME}\",
\"name\": \"Release ${TAG_NAME_CLEAN}\",
\"body\": \"Built from tag ${TAG_NAME}\",
\"draft\": false,
\"prerelease\": false
}")
echo "Release response: $RELEASE_RESP"
# Extract release ID
RELEASE_ID=$(echo "$RELEASE_RESP" | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2)
if [ -z "$RELEASE_ID" ]; then
echo "ERROR: Could not get release ID"
echo "$RELEASE_RESP"
exit 1
fi
echo "Release ID: $RELEASE_ID"
# Upload the APK as an asset
echo "Uploading APK..."
UPLOAD_RESP=$(curl -s -X POST "https://git-dangilcal.duckdns.org/api/v1/repos/dangilcal/Helldivers-app-movil/releases/${RELEASE_ID}/assets" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-H "Authorization: token ${{ secrets.GITEATOKEN }}" \
-F "attachment=@${NEW_NAME}")
echo "Upload response: $UPLOAD_RESP"
echo "=== Release created successfully ==="

View File

@@ -9,14 +9,24 @@ android {
defaultConfig { defaultConfig {
applicationId "com.helldivers.app" applicationId "com.helldivers.app"
minSdk 18 minSdk 18
targetSdk 21 targetSdk 34
versionCode 1 versionCode 1
versionName "1.0.0-LIBERTY" versionName "1.0.0-LIBERTY"
multiDexEnabled true multiDexEnabled true
} }
signingConfigs {
release {
storeFile file(System.getenv("ANDROIDKEYSTOREPATH") ?: "helldivers.keystore")
storePassword System.getenv("ANDROIDKEYSTOREPASS") ?: "HelldiversPorLaSuPerTierraYKevinTambien"
keyAlias System.getenv("ANDROIDKEYALIAS") ?: "helldivers"
keyPassword System.getenv("ANDROIDKEYPASS") ?: "HelldiversPorLaSuPerTierraYKevinTambien"
}
}
buildTypes { buildTypes {
release { release {
signingConfig signingConfigs.release
minifyEnabled true minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
multiDexEnabled true multiDexEnabled true
@@ -27,17 +37,11 @@ android {
} }
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_21 sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_21 targetCompatibility JavaVersion.VERSION_17
coreLibraryDesugaringEnabled true coreLibraryDesugaringEnabled true
} }
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
buildFeatures { buildFeatures {
buildConfig true buildConfig true
} }

View File

@@ -82,7 +82,7 @@ private static final int[][] STRATAGEMS = {
new int[]{UP, DOWN, RIGHT, LEFT, UP}, // Reinforce new int[]{UP, DOWN, RIGHT, LEFT, UP}, // Reinforce
new int[]{DOWN, DOWN, UP, RIGHT}, // Resupply new int[]{DOWN, DOWN, UP, RIGHT}, // Resupply
new int[]{UP, DOWN, RIGHT, UP}, // SOS Beacon new int[]{UP, DOWN, RIGHT, UP}, // SOS Beacon
new int[]{DOWN, UP, LEFT, DOWN, UP, RIGHT, DOWN, UP}, // NUX-223 Hellbomb new int[]{DOWN, UP, LEFT, DOWN, UP, RIGHT, DOWN}, // NUX-223 Hellbomb
new int[]{DOWN, DOWN, DOWN, UP, UP}, // SSSD Delivery new int[]{DOWN, DOWN, DOWN, UP, UP}, // SSSD Delivery
new int[]{UP, UP, LEFT, RIGHT, DOWN, DOWN}, // Seismic Probe new int[]{UP, UP, LEFT, RIGHT, DOWN, DOWN}, // Seismic Probe
new int[]{UP, UP, LEFT, UP, RIGHT}, // Eagle Rearm new int[]{UP, UP, LEFT, UP, RIGHT}, // Eagle Rearm
@@ -190,17 +190,17 @@ private static final String[] NAMES = {
private SoundManager soundManager; private SoundManager soundManager;
private Handler handler = new Handler(); private Handler handler = new Handler();
private TextView tvCounter; private TextView tvCounter, tvFailuresCounter;
private ImageView ivStratagemIcon; private ImageView ivStratagemIcon;
private LinearLayout sequenceContainer; private LinearLayout sequenceContainer;
private ImageButton btnUp, btnDown, btnLeft, btnRight; private ImageButton btnUp, btnDown, btnLeft, btnRight, btnVolver;
private android.widget.Button btnVolver;
private ProgressBar progressBar; private ProgressBar progressBar;
private ImageView ivFailure; private ImageView ivFailure;
private int[] sequence; private int[] sequence;
private int playerIndex = 0; private int playerIndex = 0;
private int completadas = 0; private int completadas = 0;
private int fallos = 0;
private boolean esperando = false; private boolean esperando = false;
private boolean juegoActivo = true; private boolean juegoActivo = true;
private int currentStratagemIndex = 0; private int currentStratagemIndex = 0;
@@ -215,6 +215,7 @@ private static final String[] NAMES = {
catch (Exception e) { soundManager = null; } catch (Exception e) { soundManager = null; }
tvCounter = findViewById(R.id.tv_counter); tvCounter = findViewById(R.id.tv_counter);
tvFailuresCounter = findViewById(R.id.tv_failures_counter);
ivStratagemIcon = findViewById(R.id.iv_stratagem_icon); ivStratagemIcon = findViewById(R.id.iv_stratagem_icon);
sequenceContainer = findViewById(R.id.sequence_container); sequenceContainer = findViewById(R.id.sequence_container);
btnUp = findViewById(R.id.btn_up); btnUp = findViewById(R.id.btn_up);
@@ -227,14 +228,32 @@ private static final String[] NAMES = {
btnVolver.setOnClickListener(v -> finish()); btnVolver.setOnClickListener(v -> finish());
if (btnUp != null) btnUp.setOnClickListener(v -> onInputWithSound(UP)); if (btnUp != null) btnUp.setOnClickListener(v -> { animateButtonClick(v); onInputWithSound(UP); });
if (btnDown != null) btnDown.setOnClickListener(v -> onInputWithSound(DOWN)); if (btnDown != null) btnDown.setOnClickListener(v -> { animateButtonClick(v); onInputWithSound(DOWN); });
if (btnLeft != null) btnLeft.setOnClickListener(v -> onInputWithSound(LEFT)); if (btnLeft != null) btnLeft.setOnClickListener(v -> { animateButtonClick(v); onInputWithSound(LEFT); });
if (btnRight != null) btnRight.setOnClickListener(v -> onInputWithSound(RIGHT)); if (btnRight != null) btnRight.setOnClickListener(v -> { animateButtonClick(v); onInputWithSound(RIGHT); });
nuevaRonda(); nuevaRonda();
} }
private void animateButtonClick(View v) {
// Feedback háptico (vibración corta)
v.performHapticFeedback(android.view.HapticFeedbackConstants.VIRTUAL_KEY);
// Animación de escala más agresiva y rápida
v.animate()
.scaleX(0.7f)
.scaleY(0.7f)
.setDuration(40)
.withEndAction(() -> v.animate()
.scaleX(1.0f)
.scaleY(1.0f)
.setDuration(150)
.setInterpolator(new android.view.animation.OvershootInterpolator(4.0f)) // Rebote más fuerte
.start())
.start();
}
private int getArrowRotation(int dir) { private int getArrowRotation(int dir) {
switch(dir) { switch(dir) {
case UP: return 0; case UP: return 0;
@@ -278,27 +297,25 @@ private static final String[] NAMES = {
sequenceContainer.removeAllViews(); sequenceContainer.removeAllViews();
for (int i = 0; i < sequence.length; i++) { for (int i = 0; i < sequence.length; i++) {
TextView arrowView = new TextView(this); ImageView arrowView = new ImageView(this);
int size = (int)(56 * getResources().getDisplayMetrics().density); int size = (int) (45 * getResources().getDisplayMetrics().density);
int margin = (int)(4 * getResources().getDisplayMetrics().density); int margin = (int) (2 * getResources().getDisplayMetrics().density);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(size, size); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(size, size);
params.setMargins(margin, margin, margin, margin); params.setMargins(margin, margin, margin, margin);
arrowView.setLayoutParams(params); arrowView.setLayoutParams(params);
arrowView.setText(String.valueOf(ARROW_CHARS.charAt(sequence[i]))); arrowView.setImageResource(R.drawable.ic_dpad_button);
arrowView.setTextSize(36); arrowView.setBackgroundResource(R.drawable.btn_direction);
arrowView.setTextColor(Color.parseColor("#FFD700")); arrowView.setRotation(getArrowRotation(sequence[i]));
arrowView.setGravity(Gravity.CENTER); arrowView.setColorFilter(Color.WHITE);
arrowView.setBackgroundResource(R.drawable.arrow_white); int padding = (int) (8 * getResources().getDisplayMetrics().density);
arrowView.setPadding(padding, padding, padding, padding);
sequenceContainer.addView(arrowView); sequenceContainer.addView(arrowView);
} }
} }
private void onInputWithSound(int dir) { private void onInputWithSound(int dir) {
if (soundManager != null) {
try { soundManager.playTone(dir); } catch (Exception e) {}
}
onInput(dir); onInput(dir);
} }
@@ -307,13 +324,16 @@ private static final String[] NAMES = {
bloqueado = true; bloqueado = true;
if (dir == sequence[playerIndex]) { if (dir == sequence[playerIndex]) {
if (soundManager != null) {
try { soundManager.playTone(dir); } catch (Exception e) {}
}
playerIndex++; playerIndex++;
if (sequenceContainer != null && playerIndex <= sequence.length) { if (sequenceContainer != null && playerIndex <= sequence.length) {
View child = sequenceContainer.getChildAt(playerIndex - 1); View child = sequenceContainer.getChildAt(playerIndex - 1);
if (child instanceof TextView) { if (child instanceof ImageView) {
TextView arrowView = (TextView) child; ImageView arrowView = (ImageView) child;
arrowView.setTextColor(Color.parseColor("#00FF00")); arrowView.setColorFilter(Color.parseColor("#fde902"));
} }
} }
@@ -339,11 +359,26 @@ private static final String[] NAMES = {
try { soundManager.playFailure(); } catch (Exception e) {} try { soundManager.playFailure(); } catch (Exception e) {}
} }
juegoActivo = false; juegoActivo = false;
if (ivFailure != null) ivFailure.setVisibility(View.VISIBLE); fallos++;
handler.postDelayed(this::nuevaRonda, 1500); if (tvFailuresCounter != null) tvFailuresCounter.setText(String.valueOf(fallos));
// Delay de medio segundo antes de reiniciar
handler.postDelayed(this::nuevaRonda, 500);
} }
} }
@Override
protected void onPause() {
super.onPause();
if (soundManager != null) soundManager.pause();
}
@Override
protected void onResume() {
super.onResume();
if (soundManager != null) soundManager.resume();
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();

View File

@@ -3,7 +3,7 @@ package com.helldivers.app;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import com.google.zxing.BarcodeFormat; import com.google.zxing.BarcodeFormat;
@@ -20,7 +20,7 @@ public class ActivityQR extends AppCompatActivity {
private SoundManager soundManager; private SoundManager soundManager;
private ImageView qrImageView; private ImageView qrImageView;
private Button btnVolver; private ImageButton btnVolver;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -38,7 +38,6 @@ public class ActivityQR extends AppCompatActivity {
btnVolver.setOnClickListener(new View.OnClickListener() { btnVolver.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
soundManager.playButtonClick();
finish(); finish();
} }
}); });
@@ -55,14 +54,14 @@ public class ActivityQR extends AppCompatActivity {
int width = bitMatrix.getWidth(); int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight(); int height = bitMatrix.getHeight();
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
int black = 0xFF000000; int qrColor = 0xFFFFFFFF; // Blanco para los módulos del QR
int white = 0xFFFFFFFF; int transparent = 0x00000000; // Transparente para el fondo
for (int x = 0; x < width; x++) { for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) { for (int y = 0; y < height; y++) {
bmp.setPixel(x, y, bitMatrix.get(x, y) ? black : white); bmp.setPixel(x, y, bitMatrix.get(x, y) ? qrColor : transparent);
} }
} }

View File

@@ -1,6 +1,7 @@
package com.helldivers.app; package com.helldivers.app;
import android.content.Intent; import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle; import android.os.Bundle;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
@@ -13,7 +14,9 @@ public class MainActivity extends AppCompatActivity {
private SoundManager soundManager; private SoundManager soundManager;
private Button btnQrInstagram; private Button btnQrInstagram;
private Button btnMinijuego; private Button btnMinijuego;
private Button btnMusic;
private ImageButton btnUp, btnDown, btnLeft, btnRight; private ImageButton btnUp, btnDown, btnLeft, btnRight;
private MediaPlayer mediaPlayer;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -32,25 +35,24 @@ public class MainActivity extends AppCompatActivity {
btnDown = findViewById(R.id.btn_down); btnDown = findViewById(R.id.btn_down);
btnLeft = findViewById(R.id.btn_left); btnLeft = findViewById(R.id.btn_left);
btnRight = findViewById(R.id.btn_right); btnRight = findViewById(R.id.btn_right);
btnMusic = findViewById(R.id.btn_music);
if (btnQrInstagram != null) { if (btnQrInstagram != null) {
btnQrInstagram.setOnClickListener(v -> { btnQrInstagram.setOnClickListener(v -> {
if (soundManager != null) {
try { soundManager.playButtonClick(); } catch (Exception e) {}
}
startActivity(new Intent(this, ActivityQR.class)); startActivity(new Intent(this, ActivityQR.class));
}); });
} }
if (btnMinijuego != null) { if (btnMinijuego != null) {
btnMinijuego.setOnClickListener(v -> { btnMinijuego.setOnClickListener(v -> {
if (soundManager != null) {
try { soundManager.playButtonClick(); } catch (Exception e) {}
}
startActivity(new Intent(this, ActivityGame.class)); startActivity(new Intent(this, ActivityGame.class));
}); });
} }
if (btnMusic != null) {
btnMusic.setOnClickListener(v -> toggleMusic());
}
View.OnClickListener arrowSoundListener = v -> { View.OnClickListener arrowSoundListener = v -> {
if (soundManager != null) { if (soundManager != null) {
try { soundManager.playButtonClick(); } catch (Exception e) {} try { soundManager.playButtonClick(); } catch (Exception e) {}
@@ -63,6 +65,31 @@ public class MainActivity extends AppCompatActivity {
if (btnRight != null) btnRight.setOnClickListener(arrowSoundListener); if (btnRight != null) btnRight.setOnClickListener(arrowSoundListener);
} }
private void toggleMusic() {
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(this, R.raw.ost);
mediaPlayer.setOnCompletionListener(mp -> {
stopMusic();
});
}
if (mediaPlayer.isPlaying()) {
stopMusic();
} else {
mediaPlayer.start();
btnMusic.setAlpha(0.5f); // Efecto visual de activado
}
}
private void stopMusic() {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
btnMusic.setAlpha(1.0f); // Restaurar opacidad
}
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
@@ -78,6 +105,7 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
stopMusic();
if (soundManager != null) soundManager.release(); if (soundManager != null) soundManager.release();
} }
} }

View File

@@ -1,97 +1,68 @@
package com.helldivers.app; package com.helldivers.app;
import android.content.Context; import android.content.Context;
import android.media.AudioManager; import android.media.AudioAttributes;
import android.media.ToneGenerator; import android.media.SoundPool;
import android.os.Handler;
import android.os.Looper;
/** /**
* SoundManager - Gestor de sonidos usando ToneGenerator * SoundManager - Gestor de sonidos usando SoundPool para reproducir archivos de recursos
* Compatible con API 18+, mas ligero que SoundPool para dispositivos de baja potencia
*/ */
public class SoundManager { public class SoundManager {
private static final int VOLUME = 80; // 0-100 private SoundPool soundPool;
private int soundPop;
private ToneGenerator toneGenerator; private int soundError;
private Handler handler;
private boolean enabled = true; private boolean enabled = true;
public SoundManager(Context context) { public SoundManager(Context context) {
// ToneGenerator.STREAM_MUSIC para compatibilidad API 18+ AudioAttributes audioAttributes = new AudioAttributes.Builder()
toneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, VOLUME); .setUsage(AudioAttributes.USAGE_GAME)
handler = new Handler(Looper.getMainLooper()); .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build();
soundPool = new SoundPool.Builder()
.setMaxStreams(5)
.setAudioAttributes(audioAttributes)
.build();
// Cargar los sonidos desde res/raw
soundPop = soundPool.load(context, R.raw.pop, 1);
soundError = soundPool.load(context, R.raw.error, 1);
} }
/** /**
* Sonido de click de boton - tono corto y agudo * Sonido de click de boton - reproduce pop.mp3
*/ */
public void playButtonClick() { public void playButtonClick() {
if (!enabled || toneGenerator == null) return; playPop();
// Tono DTMF 6 - sonido tipo boton tactil
toneGenerator.startTone(ToneGenerator.TONE_DTMF_6, 80);
} }
/** /**
* Sonido de exito - secuencia ascendente * Sonido de exito
*/ */
public void playSuccess() { public void playSuccess() {
if (!enabled || toneGenerator == null) return; // Por ahora no tenemos un sonido de éxito específico en raw,
// Tono de confirmacion propositivo // podríamos usar pop o dejarlo vacío si no se solicita.
toneGenerator.startTone(ToneGenerator.TONE_PROP_ACK, 150);
} }
/** /**
* Sonido de fallo - tono bajo grave * Sonido de fallo - reproduce error.mp3
*/ */
public void playFailure() { public void playFailure() {
if (!enabled || toneGenerator == null) return; if (!enabled || soundPool == null) return;
// Tono de error soundPool.play(soundError, 1.0f, 1.0f, 1, 0, 1.0f);
toneGenerator.startTone(ToneGenerator.TONE_PROP_NACK, 200);
} }
/** /**
* Tono para direcciones del juego * Tono para direcciones del juego - reproduce pop.mp3 para cualquier dirección
* Usa diferentes tonos DTMF para cada direccion
*/ */
public void playTone(int direction) { public void playTone(int direction) {
if (!enabled || toneGenerator == null) return; playPop();
int tone;
switch (direction) {
case 0: // UP
tone = ToneGenerator.TONE_DTMF_2;
break;
case 1: // DOWN
tone = ToneGenerator.TONE_DTMF_8;
break;
case 2: // LEFT
tone = ToneGenerator.TONE_DTMF_4;
break;
case 3: // RIGHT
tone = ToneGenerator.TONE_DTMF_6;
break;
default:
tone = ToneGenerator.TONE_DTMF_0;
}
toneGenerator.startTone(tone, 100);
} }
/** private void playPop() {
* Tono de inicio de secuencia if (!enabled || soundPool == null) return;
*/ soundPool.play(soundPop, 1.0f, 1.0f, 1, 0, 1.0f);
public void playSequenceStart() {
if (!enabled || toneGenerator == null) return;
toneGenerator.startTone(ToneGenerator.TONE_SUP_DIAL, 100);
}
/**
* Tono de alerta/peligro
*/
public void playAlert() {
if (!enabled || toneGenerator == null) return;
toneGenerator.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 150);
} }
public void setEnabled(boolean enabled) { public void setEnabled(boolean enabled) {
@@ -102,26 +73,18 @@ public class SoundManager {
return enabled; return enabled;
} }
/**
* Stub para compatibilidad con ciclo de vida Activity
* ToneGenerator no necesita pause/resume explicito
*/
public void pause() { public void pause() {
// No-op: ToneGenerator se maneja automaticamente if (soundPool != null) soundPool.autoPause();
} }
/**
* Stub para compatibilidad con ciclo de vida Activity
* ToneGenerator no necesita pause/resume explicito
*/
public void resume() { public void resume() {
// No-op: ToneGenerator se maneja automaticamente if (soundPool != null) soundPool.autoResume();
} }
public void release() { public void release() {
if (toneGenerator != null) { if (soundPool != null) {
toneGenerator.release(); soundPool.release();
toneGenerator = null; soundPool = null;
} }
} }
} }

View File

@@ -4,7 +4,7 @@
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#232830" /> <solid android:color="#232830" />
<corners android:radius="6dp" /> <corners android:radius="6dp" />
<stroke android:width="2dp" android:color="#FFD700" /> <stroke android:width="2dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
<item android:top="4dp" android:bottom="4dp" android:left="4dp" android:right="4dp"> <item android:top="4dp" android:bottom="4dp" android:left="4dp" android:right="4dp">

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Fondo con gradiente vertical estilo Helldivers 2 --> <!-- Fondo con gradiente horizontal (oscuro en los laterales, claro en el centro) -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item> <item>
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<gradient <gradient
android:angle="270" android:angle="0"
android:startColor="#0D0D0D" android:startColor="@color/helldivers_dark_secondary"
android:centerColor="#121417" android:centerColor="@color/helldivers_dark_bg"
android:endColor="#1B1F25" android:endColor="@color/helldivers_dark_secondary"
android:type="linear" /> android:type="linear" />
</shape> </shape>
</item> </item>

View File

@@ -4,6 +4,6 @@
android:shape="rectangle"> android:shape="rectangle">
<solid android:color="#FFFFFF" /> <solid android:color="#FFFFFF" />
<corners android:radius="12dp" /> <corners android:radius="12dp" />
<stroke android:width="3dp" android:color="#FFD700" /> <stroke android:width="3dp" android:color="#FFFFFF" />
<padding android:left="16dp" android:top="16dp" android:right="16dp" android:bottom="16dp" /> <padding android:left="16dp" android:top="16dp" android:right="16dp" android:bottom="16dp" />
</shape> </shape>

View File

@@ -5,7 +5,7 @@
<layer-list> <layer-list>
<item> <item>
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#FFD700" /> <solid android:color="#FFFFFF" />
<corners android:radius="8dp" /> <corners android:radius="8dp" />
</shape> </shape>
</item> </item>
@@ -42,7 +42,7 @@
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="#1B1F25" />
<corners android:radius="8dp" /> <corners android:radius="8dp" />
<stroke android:width="2dp" android:color="#FFD700" /> <stroke android:width="2dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
<item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp"> <item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp">

View File

@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Boton primario estilo Helldivers - Amarillo neon --> <!-- Boton primario estilo Helldivers - Blanco -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"> <item android:state_pressed="true">
<layer-list> <layer-list>
<item> <item>
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#2C3138" /> <solid android:color="@color/btn_bg_pressed" />
<corners android:radius="8dp" /> <corners android:radius="8dp" />
<stroke android:width="3dp" android:color="#FFE135" /> <stroke android:width="3dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
<item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp"> <item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp">
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="@color/btn_bg_dark" />
<corners android:radius="6dp" /> <corners android:radius="6dp" />
</shape> </shape>
</item> </item>
@@ -23,14 +23,14 @@
<layer-list> <layer-list>
<item> <item>
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="@color/btn_bg_dark" />
<corners android:radius="8dp" /> <corners android:radius="8dp" />
<stroke android:width="2dp" android:color="#FFE135" /> <stroke android:width="2dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
<item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp"> <item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp">
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="@color/btn_bg_dark" />
<corners android:radius="6dp" /> <corners android:radius="6dp" />
</shape> </shape>
</item> </item>
@@ -41,14 +41,14 @@
<layer-list> <layer-list>
<item> <item>
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="@color/btn_bg_dark" />
<corners android:radius="8dp" /> <corners android:radius="8dp" />
<stroke android:width="2dp" android:color="#FFD700" /> <stroke android:width="2dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
<item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp"> <item android:top="2dp" android:left="2dp" android:right="2dp" android:bottom="2dp">
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="@color/btn_bg_dark" />
<corners android:radius="6dp" /> <corners android:radius="6dp" />
</shape> </shape>
</item> </item>

View File

@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Boton secundario estilo Helldivers - Azul neon --> <!-- Boton secundario estilo Helldivers - Azul con bordes blancos -->
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"> <item android:state_pressed="true">
<layer-list> <layer-list>
<item> <item>
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#2C3138" /> <solid android:color="@color/btn_bg_pressed" />
<corners android:radius="6dp" /> <corners android:radius="6dp" />
<stroke android:width="2dp" android:color="#1E90FF" /> <stroke android:width="2dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
<item android:top="1dp" android:left="1dp" android:right="1dp" android:bottom="1dp"> <item android:top="1dp" android:left="1dp" android:right="1dp" android:bottom="1dp">
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="@color/btn_bg_dark" />
<corners android:radius="5dp" /> <corners android:radius="5dp" />
</shape> </shape>
</item> </item>
@@ -23,14 +23,14 @@
<layer-list> <layer-list>
<item> <item>
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="@color/btn_bg_dark" />
<corners android:radius="6dp" /> <corners android:radius="6dp" />
<stroke android:width="1dp" android:color="#00BFFF" /> <stroke android:width="1dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
<item android:top="1dp" android:left="1dp" android:right="1dp" android:bottom="1dp"> <item android:top="1dp" android:left="1dp" android:right="1dp" android:bottom="1dp">
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#1B1F25" /> <solid android:color="@color/btn_bg_dark" />
<corners android:radius="5dp" /> <corners android:radius="5dp" />
</shape> </shape>
</item> </item>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
</vector>

View File

@@ -0,0 +1,14 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="256dp"
android:height="256dp"
android:viewportWidth="256"
android:viewportHeight="256">
<group
android:scaleX="0.1"
android:scaleY="-0.1"
android:translateY="256">
<path
android:fillColor="#FFFFFF"
android:pathData="M983 1634 c-164 -185 -299 -340 -301 -345 -2 -5 72 -9 172 -9 l176 0 0 -345 0 -345 250 0 250 0 0 345 0 345 186 0 c107 0 184 4 182 9 -6 17 -599 681 -608 681 -5 0 -143 -151 -307 -336z" />
</group>
</vector>

View File

@@ -5,35 +5,35 @@
android:height="32dp" android:height="32dp"
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24" android:viewportHeight="24"
android:tint="#FFD700"> android:tint="#FFFFFF">
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M3,11h8V3H3V11zM5,5h4v4H5V5z" /> android:pathData="M3,11h8V3H3V11zM5,5h4v4H5V5z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M13,3v8h8V3H13zM19,9h-4V5h4V9z" /> android:pathData="M13,3v8h8V3H13zM19,9h-4V5h4V9z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M3,21h8v-8H3V21zM5,15h4v4H5V15z" /> android:pathData="M3,21h8v-8H3V21zM5,15h4v4H5V15z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M13,13h2v2h-2z" /> android:pathData="M13,13h2v2h-2z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M13,17h2v2h-2z" /> android:pathData="M13,17h2v2h-2z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M17,13h2v4h-2z" /> android:pathData="M17,13h2v4h-2z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M19,17h2v2h-2z" /> android:pathData="M19,17h2v2h-2z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M19,13h2v2h-2z" /> android:pathData="M19,13h2v2h-2z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M17,19h4v2h-4z" /> android:pathData="M17,19h4v2h-4z" />
<path <path
android:fillColor="#FFD700" android:fillColor="#FFFFFF"
android:pathData="M13,19h2v2h-2z" /> android:pathData="M13,19h2v2h-2z" />
</vector> </vector>

View File

@@ -14,7 +14,7 @@
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#00000000" /> <solid android:color="#00000000" />
<corners android:radius="8dp" /> <corners android:radius="8dp" />
<stroke android:width="3dp" android:color="#FFD700" /> <stroke android:width="3dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
</layer-list> </layer-list>

View File

@@ -8,7 +8,7 @@
<item android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp"> <item android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp">
<shape android:shape="rectangle"> <shape android:shape="rectangle">
<solid android:color="#00000000" /> <solid android:color="#00000000" />
<stroke android:width="2dp" android:color="#FFD700" /> <stroke android:width="2dp" android:color="#FFFFFF" />
</shape> </shape>
</item> </item>
</layer-list> </layer-list>

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@drawable/bg_helldivers_gradient"> android:background="@drawable/bg_helldivers_gradient">
@@ -8,32 +9,35 @@
<!-- Nombre de la estratagema --> <!-- Nombre de la estratagema -->
<TextView <LinearLayout
android:id="@+id/tv_counter_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/tv_counter"
android:layout_marginTop="5dp"
android:layout_marginEnd="24dp"
android:layout_toStartOf="@id/tv_counter"
android:text="ESTRATAGEMAS: "
android:textColor="#00FF00"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_counter"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="15dp" android:layout_marginEnd="15dp"
android:layout_marginBottom="207dp" android:layout_marginBottom="180dp"
android:text="0" android:gravity="center_horizontal"
android:textColor="#00FF00" android:orientation="vertical">
android:textSize="24sp"
android:textStyle="bold" /> <TextView
android:id="@+id/tv_counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0"
android:textColor="#fde902"
android:textSize="24sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_failures_counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="0"
android:textColor="#bd0000"
android:textSize="24sp"
android:textStyle="bold" />
</LinearLayout>
<TextView <TextView
android:id="@+id/tv_stratagem_name" android:id="@+id/tv_stratagem_name"
@@ -45,7 +49,7 @@
android:text="" android:text=""
android:textSize="20sp" android:textSize="20sp"
android:textStyle="bold" android:textStyle="bold"
android:textColor="#FFD700" /> android:textColor="#FFFFFF" />
<!-- Contenedor principal: Icono + Secuencia + Grid flechas --> <!-- Contenedor principal: Icono + Secuencia + Grid flechas -->
<LinearLayout <LinearLayout
@@ -53,6 +57,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:translationY="30dp"
android:gravity="center_vertical" android:gravity="center_vertical"
android:orientation="horizontal"> android:orientation="horizontal">
@@ -106,9 +111,10 @@
android:layout_margin="4dp" android:layout_margin="4dp"
android:background="@drawable/btn_direction" android:background="@drawable/btn_direction"
android:contentDescription="Up" android:contentDescription="Up"
android:rotation="-90" android:rotation="0"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/stepforward" /> app:tint="#FFFFFF"
android:src="@drawable/ic_dpad_button" />
<Space <Space
android:layout_width="80dp" android:layout_width="80dp"
@@ -125,9 +131,10 @@
android:layout_margin="4dp" android:layout_margin="4dp"
android:background="@drawable/btn_direction" android:background="@drawable/btn_direction"
android:contentDescription="Left" android:contentDescription="Left"
android:rotation="180" android:rotation="-90"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/stepforward" /> app:tint="#FFFFFF"
android:src="@drawable/ic_dpad_button" />
<ImageButton <ImageButton
android:id="@+id/btn_down" android:id="@+id/btn_down"
@@ -138,9 +145,10 @@
android:layout_margin="4dp" android:layout_margin="4dp"
android:background="@drawable/btn_direction" android:background="@drawable/btn_direction"
android:contentDescription="Down" android:contentDescription="Down"
android:rotation="90" android:rotation="180"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/stepforward" /> app:tint="#FFFFFF"
android:src="@drawable/ic_dpad_button" />
<ImageButton <ImageButton
android:id="@+id/btn_right" android:id="@+id/btn_right"
@@ -151,9 +159,10 @@
android:layout_margin="4dp" android:layout_margin="4dp"
android:background="@drawable/btn_direction" android:background="@drawable/btn_direction"
android:contentDescription="Right" android:contentDescription="Right"
android:rotation="0" android:rotation="90"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/stepforward" /> app:tint="#FFFFFF"
android:src="@drawable/ic_dpad_button" />
<Space <Space
android:layout_width="80dp" android:layout_width="80dp"
@@ -180,19 +189,20 @@
</LinearLayout> </LinearLayout>
<!-- Volver --> <!-- Volver -->
<Button <ImageButton
android:id="@+id/btn_volver" android:id="@+id/btn_volver"
android:layout_width="wrap_content" android:layout_width="53dp"
android:layout_height="wrap_content" android:layout_height="53dp"
android:layout_alignParentBottom="true" android:layout_alignParentEnd="true"
android:layout_centerHorizontal="true" android:layout_alignParentTop="true"
android:layout_marginBottom="8dp" android:layout_marginEnd="16dp"
android:text="VOLVER" android:layout_marginTop="16dp"
android:textSize="14sp"
android:textColor="#FFD700"
android:background="@drawable/btn_helldivers_secondary" android:background="@drawable/btn_helldivers_secondary"
android:paddingHorizontal="24dp" android:contentDescription="Volver"
android:paddingVertical="8dp" /> android:padding="10dp"
android:scaleType="centerInside"
android:src="@drawable/ic_back_arrow"
app:tint="#FFFFFF" />
<ImageView <ImageView
android:id="@+id/iv_stratagem_icon" android:id="@+id/iv_stratagem_icon"
@@ -211,7 +221,7 @@
android:layout_width="80dp" android:layout_width="80dp"
android:layout_height="80dp" android:layout_height="80dp"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:indeterminateTint="#FFD700" android:indeterminateTint="#FFFFFF"
android:visibility="gone" /> android:visibility="gone" />
<!-- Failure Indicator (X) --> <!-- Failure Indicator (X) -->

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@drawable/bg_helldivers_gradient"> android:background="@drawable/bg_helldivers_gradient">
@@ -16,7 +17,7 @@
android:contentDescription="Super Tierra" android:contentDescription="Super Tierra"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:maxWidth="280dp" android:maxWidth="280dp"
android:tint="#FFD700" /> android:tint="#FFFFFF" />
<!-- Botón Estratagemas - Esquina izquierda --> <!-- Botón Estratagemas - Esquina izquierda -->
<Button <Button
@@ -32,7 +33,7 @@
android:paddingVertical="10dp" android:paddingVertical="10dp"
android:text="ESTRATAGEMAS" android:text="ESTRATAGEMAS"
android:textAllCaps="true" android:textAllCaps="true"
android:textColor="#FFD700" android:textColor="#FFFFFF"
android:textSize="14sp" /> android:textSize="14sp" />
<!-- Botón QR Instagram - Esquina derecha --> <!-- Botón QR Instagram - Esquina derecha -->
@@ -49,7 +50,7 @@
android:paddingVertical="10dp" android:paddingVertical="10dp"
android:text="@string/btn_qr_instagram" android:text="@string/btn_qr_instagram"
android:textAllCaps="true" android:textAllCaps="true"
android:textColor="#FFD700" android:textColor="#FFFFFF"
android:textSize="14sp" /> android:textSize="14sp" />
<!-- Grid de Flechas - Centro --> <!-- Grid de Flechas - Centro -->
@@ -59,6 +60,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" android:layout_centerInParent="true"
android:layout_marginTop="40dp" android:layout_marginTop="40dp"
android:translationY="30dp"
android:rowCount="3" android:rowCount="3"
android:columnCount="3" android:columnCount="3"
android:padding="8dp"> android:padding="8dp">
@@ -73,9 +75,10 @@
android:layout_column="1" android:layout_column="1"
android:background="@drawable/btn_direction" android:background="@drawable/btn_direction"
android:contentDescription="Up" android:contentDescription="Up"
android:rotation="-90" android:rotation="0"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/stepforward" /> app:tint="#FFFFFF"
android:src="@drawable/ic_dpad_button" />
<Space android:layout_width="100dp" android:layout_height="100dp" android:layout_row="0" android:layout_column="2" /> <Space android:layout_width="100dp" android:layout_height="100dp" android:layout_row="0" android:layout_column="2" />
@@ -87,9 +90,10 @@
android:layout_column="0" android:layout_column="0"
android:background="@drawable/btn_direction" android:background="@drawable/btn_direction"
android:contentDescription="Left" android:contentDescription="Left"
android:rotation="180" android:rotation="-90"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/stepforward" /> app:tint="#FFFFFF"
android:src="@drawable/ic_dpad_button" />
<ImageButton <ImageButton
android:id="@+id/btn_down" android:id="@+id/btn_down"
@@ -99,9 +103,10 @@
android:layout_column="1" android:layout_column="1"
android:background="@drawable/btn_direction" android:background="@drawable/btn_direction"
android:contentDescription="Down" android:contentDescription="Down"
android:rotation="90" android:rotation="180"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/stepforward" /> app:tint="#FFFFFF"
android:src="@drawable/ic_dpad_button" />
<ImageButton <ImageButton
android:id="@+id/btn_right" android:id="@+id/btn_right"
@@ -111,9 +116,10 @@
android:layout_column="2" android:layout_column="2"
android:background="@drawable/btn_direction" android:background="@drawable/btn_direction"
android:contentDescription="Right" android:contentDescription="Right"
android:rotation="0" android:rotation="90"
android:scaleType="centerInside" android:scaleType="centerInside"
android:src="@drawable/stepforward" /> app:tint="#FFFFFF"
android:src="@drawable/ic_dpad_button" />
<Space android:layout_width="100dp" android:layout_height="20dp" android:layout_row="2" android:layout_column="0" /> <Space android:layout_width="100dp" android:layout_height="20dp" android:layout_row="2" android:layout_column="0" />
<Space android:layout_width="100dp" android:layout_height="20dp" android:layout_row="2" android:layout_column="1" /> <Space android:layout_width="100dp" android:layout_height="20dp" android:layout_row="2" android:layout_column="1" />
@@ -123,4 +129,19 @@
<!-- Footer - Versión abajo centro --> <!-- Footer - Versión abajo centro -->
<!-- Botón Música - Derecha, nivelado con el botón de la derecha -->
<Button
android:id="@+id/btn_music"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_alignParentEnd="true"
android:layout_alignBottom="@id/buttons_grid"
android:layout_marginEnd="16dp"
android:layout_marginBottom="20dp"
android:background="@drawable/btn_helldivers_primary"
android:text="♪"
android:textColor="#FFFFFF"
android:textSize="24sp"
android:textStyle="bold" />
</RelativeLayout> </RelativeLayout>

View File

@@ -1,33 +1,31 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@drawable/bg_helldivers_gradient"> android:background="@drawable/bg_helldivers_gradient">
<ImageButton
android:id="@+id/btn_volver"
android:layout_width="53dp"
android:layout_height="53dp"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="16dp"
android:layout_marginTop="16dp"
android:background="@drawable/btn_helldivers_secondary"
android:contentDescription="Volver"
android:padding="10dp"
android:scaleType="centerInside"
android:src="@drawable/ic_back_arrow"
app:tint="#FFFFFF" />
<ImageView <ImageView
android:id="@+id/qr_image" android:id="@+id/qr_image"
android:layout_width="440dp" android:layout_width="404dp"
android:layout_height="379dp" android:layout_height="344dp"
android:layout_above="@id/btn_volver" android:layout_centerInParent="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="-48dp"
android:background="#FFFFFF"
android:contentDescription="@string/qr_description" android:contentDescription="@string/qr_description"
android:padding="8dp"
android:scaleType="fitCenter" /> android:scaleType="fitCenter" />
<Button
android:id="@+id/btn_volver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="8dp"
android:background="@drawable/btn_helldivers_secondary"
android:paddingHorizontal="36dp"
android:paddingVertical="12dp"
android:text="VOLVER"
android:textColor="#FFD700"
android:textSize="18sp" />
</RelativeLayout> </RelativeLayout>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- Colores Helldivers 2 Theme --> <!-- Colores Helldivers 2 Theme Modificado -->
<!-- Colores principales --> <!-- Colores principales -->
<color name="helldivers_black">#000000</color> <color name="helldivers_black">#000000</color>
<color name="helldivers_dark_bg">#0D0D0D</color> <color name="helldivers_dark_bg">#41639C</color>
<color name="helldivers_dark_secondary">#1B1F25</color> <color name="helldivers_dark_secondary">#2B4269</color>
<color name="helldivers_dark_tertiary">#121417</color> <color name="helldivers_dark_tertiary">#2B4269</color>
<!-- Colores neon/accent --> <!-- Colores neon/accent -->
<color name="helldivers_yellow">#FFD700</color> <color name="helldivers_yellow">#FFFFFF</color>
<color name="helldivers_yellow_bright">#FFE135</color> <color name="helldivers_yellow_bright">#FFFFFF</color>
<color name="helldivers_blue">#00BFFF</color> <color name="helldivers_blue">#00BFFF</color>
<color name="helldivers_blue_bright">#1E90FF</color> <color name="helldivers_blue_bright">#1E90FF</color>
<color name="helldivers_red">#FF3B30</color> <color name="helldivers_red">#FF3B30</color>
@@ -23,9 +23,9 @@
<color name="helldivers_gray_light">#C7C7CC</color> <color name="helldivers_gray_light">#C7C7CC</color>
<!-- Colores botones --> <!-- Colores botones -->
<color name="btn_bg_dark">#1B1F25</color> <color name="btn_bg_dark">#2B4269</color>
<color name="btn_bg_pressed">#2C3138</color> <color name="btn_bg_pressed">#1E2E4A</color>
<color name="btn_border_yellow">#FFD700</color> <color name="btn_border_yellow">#FFFFFF</color>
<color name="btn_border_blue">#00BFFF</color> <color name="btn_border_blue">#00BFFF</color>
<!-- Colores genericos de sistema --> <!-- Colores genericos de sistema -->

View File

@@ -7,7 +7,7 @@
<string name="logo_description">Logo Helldivers 2</string> <string name="logo_description">Logo Helldivers 2</string>
<!-- Botones Main --> <!-- Botones Main -->
<string name="btn_qr_instagram">Seguir en\nInstagram</string> <string name="btn_qr_instagram">INSTAGRAM</string>
<string name="btn_minijuego">Estratagemas\nTraining</string> <string name="btn_minijuego">Estratagemas\nTraining</string>
<string name="btn_volver">VOLVER</string> <string name="btn_volver">VOLVER</string>

View File

@@ -5,7 +5,7 @@
<!-- Colores principales --> <!-- Colores principales -->
<item name="colorPrimary">@color/helldivers_dark_secondary</item> <item name="colorPrimary">@color/helldivers_dark_secondary</item>
<item name="colorPrimaryDark">@color/helldivers_black</item> <item name="colorPrimaryDark">@color/helldivers_black</item>
<item name="colorAccent">@color/helldivers_yellow</item> <item name="colorAccent">@color/helldivers_white</item>
<!-- Fondo --> <!-- Fondo -->
<item name="android:windowBackground">@color/helldivers_black</item> <item name="android:windowBackground">@color/helldivers_black</item>
@@ -23,19 +23,19 @@
<!-- Botones --> <!-- Botones -->
<item name="colorButtonNormal">@color/btn_bg_dark</item> <item name="colorButtonNormal">@color/btn_bg_dark</item>
<item name="colorControlHighlight">@color/helldivers_yellow</item> <item name="colorControlHighlight">@color/helldivers_white</item>
</style> </style>
<!-- Estilo base para botones Helldivers --> <!-- Estilo base para botones Helldivers -->
<style name="HelldiversButton" parent="Widget.AppCompat.Button"> <style name="HelldiversButton" parent="Widget.AppCompat.Button">
<item name="android:minHeight">48dp</item> <item name="android:minHeight">48dp</item>
<item name="android:textColor">@color/helldivers_yellow</item> <item name="android:textColor">@color/helldivers_white</item>
</style> </style>
<!-- Estilo para botones primarios Helldivers --> <!-- Estilo para botones primarios Helldivers -->
<style name="HelldiversButton.Primary" parent="HelldiversButton"> <style name="HelldiversButton.Primary" parent="HelldiversButton">
<item name="android:background">@drawable/btn_helldivers_primary</item> <item name="android:background">@drawable/btn_helldivers_primary</item>
<item name="android:textColor">@color/helldivers_yellow</item> <item name="android:textColor">@color/helldivers_white</item>
<item name="android:textSize">16sp</item> <item name="android:textSize">16sp</item>
<item name="android:fontFamily">sans-serif-medium</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textAllCaps">true</item> <item name="android:textAllCaps">true</item>
@@ -47,7 +47,7 @@
<!-- Estilo para botones secundarios --> <!-- Estilo para botones secundarios -->
<style name="HelldiversButton.Secondary" parent="HelldiversButton"> <style name="HelldiversButton.Secondary" parent="HelldiversButton">
<item name="android:background">@drawable/btn_helldivers_secondary</item> <item name="android:background">@drawable/btn_helldivers_secondary</item>
<item name="android:textColor">@color/helldivers_yellow</item> <item name="android:textColor">@color/helldivers_white</item>
<item name="android:textSize">14sp</item> <item name="android:textSize">14sp</item>
<item name="android:fontFamily">sans-serif-medium</item> <item name="android:fontFamily">sans-serif-medium</item>
<item name="android:textAllCaps">true</item> <item name="android:textAllCaps">true</item>
@@ -62,7 +62,7 @@
<!-- Estilo para texto de titulo --> <!-- Estilo para texto de titulo -->
<style name="HelldiversText.Title" parent="HelldiversText"> <style name="HelldiversText.Title" parent="HelldiversText">
<item name="android:textColor">@color/helldivers_yellow</item> <item name="android:textColor">@color/helldivers_white</item>
<item name="android:textSize">20sp</item> <item name="android:textSize">20sp</item>
<item name="android:fontFamily">sans-serif-condensed</item> <item name="android:fontFamily">sans-serif-condensed</item>
<item name="android:textStyle">bold</item> <item name="android:textStyle">bold</item>

47
docker-compose.yml Normal file
View File

@@ -0,0 +1,47 @@
version: "3.8"
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: always
environment:
- USER_UID=1000
- USER_GID=1000
volumes:
- /srv/data/gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.gitea.rule=Host(`git-dangilcal.duckdns.org`)"
- "traefik.http.routers.gitea.entrypoints=websecure"
- "traefik.http.routers.gitea.tls.certresolver=le"
- "traefik.http.services.gitea.loadbalancer.server.port=3000"
- "traefik.http.routers.gitea-http.rule=Host(`git-dangilcal.duckdns.org`)"
- "traefik.http.routers.gitea-http.entrypoints=web"
- "traefik.http.routers.gitea-http.middlewares=redirect-to-https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true"
gitea-runner:
image: gitea/act_runner:latest
container_name: gitea-runner
restart: always
depends_on:
- gitea
environment:
- GITEA_INSTANCE_URL=https://git-dangilcal.duckdns.org
- GITEA_RUNNER_REGISTRATION_TOKEN=TU_TOKEN_AQUI
- GITEA_RUNNER_NAME=runner-docker
volumes:
- /srv/data/gitea-runner:/data
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
networks:
proxy:
external: true

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.