Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Build

on:
push:
branches: ["master"]
pull_request:
branches: ["master"]
workflow_dispatch:

jobs:
build:
runs-on: ubuntu-24.04
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up JDK 8
uses: actions/setup-java@v4
with:
java-version: 8
distribution: 'zulu'

- name: Set up Android SDK
uses: android-actions/setup-android@v3
with:
cmdline-tools-version: 8512546
log-accepted-android-sdk-licenses: false

- name: Make gradlew executable
run: chmod +x gradlew

- name: Build APK
run: ./gradlew assembleFdroidDebug

- name: Rename APK
id: rename
run: |
if [ "${{ github.event_name }}" == "pull_request" ]; then
SHA_FULL="${{ github.event.pull_request.head.sha }}"
else
SHA_FULL="${{ github.sha }}"
fi
SHA_SHORT="${SHA_FULL:0:7}"

APK_NAME="app-fdroid-debug-$SHA_SHORT.apk"
mv app/build/outputs/apk/fdroid/debug/app-fdroid-debug.apk "app/build/outputs/apk/fdroid/debug/$APK_NAME"
echo "apk_name=$APK_NAME" >> $GITHUB_OUTPUT

- name: Upload APK artifact
uses: actions/upload-artifact@v4
with:
name: ${{ steps.rename.outputs.apk_name }}
path: app/build/outputs/apk/fdroid/debug/${{ steps.rename.outputs.apk_name }}
retention-days: 7
57 changes: 0 additions & 57 deletions .github/workflows/publish-dev-release.yml

This file was deleted.

57 changes: 57 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Publish

on:
workflow_run:
workflows: ["Build"]
types:
- completed
branches:
- master

permissions:
contents: write
actions: read

jobs:
publish:
runs-on: ubuntu-24.04
if: "${{ github.event.workflow_run.conclusion == 'success' }}"
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: "${{ github.event.workflow_run.head_sha }}"

- name: Set environment variables
run: |
SHA_FULL="${{ github.event.workflow_run.head_sha }}"
SHA_SHORT="${SHA_FULL:0:7}"
echo "BUILD_ARTIFACT_NAME=app-fdroid-debug-$SHA_SHORT.apk" >> $GITHUB_ENV
echo "APK_NAME=LRC.Editor.Dev.Debug.$SHA_SHORT.apk" >> $GITHUB_ENV

- name: Download APK artifact
uses: actions/download-artifact@v4
with:
name: ${{ env.BUILD_ARTIFACT_NAME }}
path: apk_output
run-id: "${{ github.event.workflow_run.id }}"
github-token: "${{ github.token }}"

- name: Rename APK
run: mv apk_output/${{ env.BUILD_ARTIFACT_NAME }} apk_output/${{ env.APK_NAME }}

- name: Cleanup v-dev tag and release
run: gh release delete v-dev --cleanup-tag --yes || true
env:
GH_TOKEN: "${{ github.token }}"

- name: Upload APK release
run: |
gh release create v-dev apk_output/${{ env.APK_NAME }} \
--title "LRC Editor Developer Build" \
--notes "Unreleased developer build (\`fdroid\` build variant) with the latest updates" \
--target "${{ github.event.workflow_run.head_sha }}" \
--prerelease
env:
GH_TOKEN: "${{ github.token }}"

1 change: 1 addition & 0 deletions app/src/main/java/com/cg/lrceditor/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class Constants {
static final String SAVE_LOCATION_PREFERENCE = "saveLocation";
static final String TIMESTAMP_STEP_AMOUNT_PREFERENCE = "timestamp_step_amount";
static final String THREE_DIGIT_MILLISECONDS_PREFERENCE = "three_digit_milliseconds";
static final String LYRIC_LEADING_SPACE_PREFERENCE = "lyric_leading_space";
static final String THEME_PREFERENCE = "current_theme";
static final String PURCHASED_PREFERENCE = "lrceditor_purchased";
}
11 changes: 8 additions & 3 deletions app/src/main/java/com/cg/lrceditor/FinalizeActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ public class FinalizeActivity extends AppCompatActivity {
private boolean overwriteFailed = false;
private boolean threadIsExecuting = false;
private boolean useThreeDigitMilliseconds = false;
private boolean useLyricLeadingSpace = false;

@SuppressLint("ClickableViewAccessibility")
@Override
Expand Down Expand Up @@ -111,6 +112,7 @@ protected void onCreate(Bundle savedInstanceState) {
});

useThreeDigitMilliseconds = preferences.getBoolean(Constants.THREE_DIGIT_MILLISECONDS_PREFERENCE, false);
useLyricLeadingSpace = preferences.getBoolean(Constants.LYRIC_LEADING_SPACE_PREFERENCE, false);

Toolbar toolbar = findViewById(R.id.toolbar);
if (isDarkTheme) {
Expand Down Expand Up @@ -296,7 +298,7 @@ private void writeLyrics(final String filePath, final String fileName) {
file = file.createFile("application/*", fileName);

OutputStream out = getContentResolver().openOutputStream(file.getUri());
InputStream in = new ByteArrayInputStream(lyricsToString(useThreeDigitMilliseconds).getBytes(StandardCharsets.UTF_8));
InputStream in = new ByteArrayInputStream(lyricsToString(useThreeDigitMilliseconds, useLyricLeadingSpace).getBytes(StandardCharsets.UTF_8));

byte[] buffer = new byte[1024];
int read;
Expand Down Expand Up @@ -327,7 +329,7 @@ public void setAsLRCFileName(View view) {
((EditText) dialogView.findViewById(R.id.dialog_edittext)).setText(lrcFileName);
}

private String lyricsToString(boolean useThreeDigitMilliseconds) {
private String lyricsToString(boolean useThreeDigitMilliseconds, boolean useLyricLeadingSpace) {
StringBuilder sb = new StringBuilder();

String str;
Expand Down Expand Up @@ -360,7 +362,10 @@ private String lyricsToString(boolean useThreeDigitMilliseconds) {
// Some players might skip empty lyric lines (I'm looking at you Huawei music player)
// Hence we replace empty lyric lines with a space
lyric = " ";
} else if (useLyricLeadingSpace) {
lyric = " " + lyric;
}

if (useThreeDigitMilliseconds) {
sb.append("[").append(timestamp.toStringWithThreeDigitMilliseconds(Locale.ENGLISH)).append("]").append(lyric).append("\n");
} else {
Expand Down Expand Up @@ -468,7 +473,7 @@ public boolean isExternalStorageWritable() {

public void copyLrc(View view) {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Generated LRC data", lyricsToString(useThreeDigitMilliseconds));
ClipData clip = ClipData.newPlainText("Generated LRC data", lyricsToString(useThreeDigitMilliseconds, useLyricLeadingSpace));
if (clipboard != null) {
clipboard.setPrimaryClip(clip);
} else {
Expand Down
25 changes: 23 additions & 2 deletions app/src/main/java/com/cg/lrceditor/SettingsActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public class SettingsActivity extends AppCompatActivity {
private TextView readLocation;
private TextView timestampStep;
private Switch threeDigitMillisecondsSwitch;
private Switch lyricLeadingSpaceSwitch;

private RadioButton light, dark, darker;

Expand Down Expand Up @@ -78,6 +79,14 @@ protected void onCreate(Bundle savedInstanceState) {
editor.apply();
});

lyricLeadingSpaceSwitch = findViewById(R.id.lyric_leading_space_switch);
lyricLeadingSpaceSwitch.setChecked(preferences.getBoolean(Constants.LYRIC_LEADING_SPACE_PREFERENCE, false));
lyricLeadingSpaceSwitch.setOnCheckedChangeListener((compoundButton, checked) -> {
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(Constants.LYRIC_LEADING_SPACE_PREFERENCE, checked);
editor.apply();
});

RadioGroup themeGroup = findViewById(R.id.theme_group);
light = findViewById(R.id.radioButtonLight);
dark = findViewById(R.id.radioButtonDark);
Expand Down Expand Up @@ -212,7 +221,7 @@ public void adjustTimestampStep(View v) {
public void showTimestampStepHelp(View view) {
new AlertDialog.Builder(this)
.setMessage(R.string.timestamp_step_help)
.setNeutralButton(getString(R.string.ok), null)
.setNegativeButton(getString(R.string.ok), null)
.create()
.show();
}
Expand All @@ -224,7 +233,19 @@ public void toggleThreeDigitMillisecondSwitch(View view) {
public void showThreeDigitMillisecondsHelp(View view) {
new AlertDialog.Builder(this)
.setMessage(R.string.three_digit_milliseconds_help)
.setNeutralButton(getString(R.string.ok), null)
.setNegativeButton(getString(R.string.ok), null)
.create()
.show();
}

public void toggleLyricLeadingSpaceSwitch(View view) {
lyricLeadingSpaceSwitch.toggle();
}

public void showLyricLeadingSpaceHelp(View view) {
new AlertDialog.Builder(this)
.setMessage(R.string.lyric_leading_space_help)
.setNegativeButton(getString(R.string.ok), null)
.create()
.show();
}
Expand Down
33 changes: 33 additions & 0 deletions app/src/main/res/layout/activity_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,39 @@

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center_vertical"
android:onClick="toggleLyricLeadingSpaceSwitch"
android:orientation="horizontal"
android:padding="@dimen/dp16">

<Switch
android:id="@+id/lyric_leading_space_switch"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".8"
android:text="@string/lyric_leading_space_prompt" />

<Button
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight=".1"
android:onClick="showLyricLeadingSpaceHelp"
android:text="\?" />

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,10 @@
<string name="storage_unavailable_message">Fehler: Speicher nicht verfügbar/überlastet</string>
<string name="tap_to_select_song_prompt">Musiktitel auswählen</string>
<string name="thats_a_miss">Fehlgeschlagen\nKeine LRC-Dateien gefunden</string>
<string name="three_digit_milliseconds_help">Das Speichern mit dreistelligen Millisekunden kann für Anwendungen nützlich sein, die LRC-Dateien mit dreistelligen Millisekunden-Zeitstempeln anstelle von zweistelligen Millisekunden-Zeitstempeln erwarten</string>
<string name="three_digit_milliseconds_help">Dies ist nützlich für Anwendungen, die LRC-Dateien mit dreistelligen Millisekunden-Zeitstempeln anstelle von zweistelligen erwarten. Im Zweifelsfall sollten Sie diese Option deaktiviert lassen.</string>
<string name="three_digit_milliseconds_prompt">Zeitstempel mit dreistelligen Millisekunden speichern</string>
<string name="lyric_leading_space_help">Dies ist nützlich für Anwendungen, die ein Leerzeichen zwischen dem Zeitstempel und dem Liedtext erwarten. Im Zweifelsfall sollten Sie diese Option deaktiviert lassen.</string>
<string name="lyric_leading_space_prompt">Songtexte mit einem vorangestellten Leerzeichen speichern</string>
<string name="timestamp_step_amount_prompt">Schrittlänge des Zeitstempels</string>
<string name="timestamp_step_help">Zeitstempel werden im Editor um diese Millisekunden angepasst. Beachten Sie, dass im Editor nur die beiden wichtigsten Stellen der Millisekunden angezeigt werden</string>
<string name="title_error_text">Ein unerwarteter Fehler trat beim Versuch, den Titel zu verwenden, auf</string>
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,10 @@
<string name="storage_unavailable_message">Eror: Almancimiento indisponible/ocupado</string>
<string name="tap_to_select_song_prompt">Toca para seleccionar una canción</string>
<string name="thats_a_miss">Fallo\nNo se encontraron letras</string>
<string name="three_digit_milliseconds_help">Guardar el archivo con precision de tres decimales (milisegundos). Puede sér útil en aplicaciones con expectativa de tiempo en milisegundos (3 decimales) en vez de centisegundos (2 decimales).</string>
<string name="three_digit_milliseconds_help">Esto es útil para aplicaciones que esperan archivos LRC con marcas de tiempo en milisegundos de tres dígitos en lugar de dos. Si no está seguro, manténgalo desactivado.</string>
<string name="three_digit_milliseconds_prompt">Guardar con milisegundos (3 decimales)</string>
<string name="lyric_leading_space_help">Esto es útil para aplicaciones que esperan un espacio entre la marca de tiempo y la letra. Si no está seguro, manténgalo desactivado.</string>
<string name="lyric_leading_space_prompt">Guardar la letra con un espacio al principio</string>
<string name="timestamp_step_amount_prompt">Tamaño del paso de tiempo</string>
<string name="timestamp_step_help">Ajuste del tamaño del paso de tiempo del editor, en milisegundos. Notar que el editor solo indica en centisegundos aunque el ajuste esté en milisegundos.</string>
<string name="title_error_text">Eror configurando el título</string>
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/res/values-fr/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,10 @@
<string name="storage_unavailable_message">Erreur : Stockage indisponible/occupé</string>
<string name="tap_to_select_song_prompt">Tap pour sélectionner une musique</string>
<string name="thats_a_miss">Echec\nPas de fichier de parole trouvé</string>
<string name="three_digit_milliseconds_help">Enregistrer le fichier avec une précision à 3 chiffres des millisecondes sera utile pour les application qui s\'attendent des fichiers LRC avec des millisecondes en 3 caractères plutôt que 2.</string>
<string name="three_digit_milliseconds_help">Cette option est utile pour les applications qui attendent des fichiers LRC avec des horodatages en millisecondes à trois chiffres plutôt qu\'à deux. En cas de doute, laissez cette option désactivée.</string>
<string name="three_digit_milliseconds_prompt">Enregistrer avec des millisecondes en 3 caractères</string>
<string name="lyric_leading_space_help">Cette option est utile pour les applications qui nécessitent un espace entre l\'horodatage et les paroles. En cas de doute, laissez-la désactivée.</string>
<string name="lyric_leading_space_prompt">Enregistrer les paroles avec un espace au début</string>
<string name="timestamp_step_amount_prompt">Pas des marqueurs temporels</string>
<string name="timestamp_step_help">Précision des millisecondes du marqueur temporel. Les millisecondes auront autant de chiffres significatifs que le nombre précisé ici. A noter que le volet éditeur n\'affiche que les deux premiers chiffres des millisecondes.</string>
<string name="title_error_text">Une erreur s\'est produite pendant le changement de titre</string>
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/res/values-in/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,10 @@
<string name="storage_unavailable_message">Kesalahan: Penyimpanan tidak tersedia/sibuk</string>
<string name="tap_to_select_song_prompt">Ketuk di sini untuk memilih lagu</string>
<string name="thats_a_miss">Meleset\nTak ditemukan berkas lirik</string>
<string name="three_digit_milliseconds_help">Meyimpan dengan milidetik tiga angka mungkin akan berguna bagi aplikasi yang menganggap berkas LRC dengan cap waktu milidetik tiga angka daripada cap waktu dengan milidetik dua angka saja</string>
<string name="three_digit_milliseconds_help">Ini berguna untuk aplikasi yang mengharapkan file LRC dengan stempel waktu milidetik tiga digit, bukan dua digit. Jika tidak yakin, biarkan pengaturan ini tetap nonaktif.</string>
<string name="three_digit_milliseconds_prompt">Simpan dengan milidetik tiga angka</string>
<string name="lyric_leading_space_help">Ini berguna untuk aplikasi yang mengharapkan adanya spasi antara stempel waktu dan lirik. Jika tidak yakin, biarkan pengaturan ini tetap nonaktif.</string>
<string name="lyric_leading_space_prompt">Simpan lirik dengan spasi di awal</string>
<string name="timestamp_step_amount_prompt">Jumlah langkah cap waktu</string>
<string name="timestamp_step_help">Stempel waktu akan disesuaikan dengan jumlah milidetik ini di editor. Perhatikan bahwa hanya dua digit paling signifikan dari milidetik yang ditampilkan di editor</string>
<string name="title_error_text">Terjadi kesalahan yang ketika mencoba menyetel judul!</string>
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/res/values-pl/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,10 @@
<string name="storage_unavailable_message">Błąd: pamięć niedostępna/zajęta</string>
<string name="tap_to_select_song_prompt">Stuknij tutaj, aby wybrać utwór</string>
<string name="thats_a_miss">"Tego brakuje\nNie znaleziono plików Lyric"</string>
<string name="three_digit_milliseconds_help">Zapisywanie znaczników czasowych z trzycyfrowymi milisekundami może być przydatne w aplikacjach które oczekują pliku LRC z trzycyfrowymi znacznikami milisekund, a nie dwucyfrowymi znacznikami milisekund</string>
<string name="three_digit_milliseconds_help">Ta opcja jest przydatna w aplikacjach, które oczekują plików LRC z trzycyfrowymi znacznikami czasu w milisekundach, a nie dwucyfrowymi. W razie wątpliwości, lepiej pozostawić ją wyłączoną.</string>
<string name="three_digit_milliseconds_prompt">Zapisz znaczniki z trzycyfrowymi milisekundami</string>
<string name="lyric_leading_space_help">Ta opcja jest przydatna w aplikacjach, które wymagają spacji między znacznikiem czasu a tekstem piosenki. W razie wątpliwości, lepiej pozostawić ją wyłączoną.</string>
<string name="lyric_leading_space_prompt">Zapisz tekst piosenki z wiodącą spacją</string>
<string name="timestamp_step_amount_prompt">Kwota kroku znacznika czasu</string>
<string name="timestamp_step_help">Znaczniki czasu zostaną skorygowane o tę liczbę milisekund w edytorze. Zwróć uwagę, że w edytorze wyświetlane są tylko dwie najbardziej znaczące cyfry milisekund</string>
<string name="title_error_text">Wystąpił nieoczekiwany błąd podczas próby ustawienia tytułu</string>
Expand Down
Loading