diff --git a/.circleci/config.yml b/.circleci/config.yml index fc710f6c..b1876534 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -38,4 +38,90 @@ jobs: destination: reports - store_artifacts: path: build/reports/jacoco/jacocoFullReport/ + push_translations: + docker: + - image: circleci/python:3.6 + working_directory: ~/ultrasonic + steps: + - checkout + - run: + name: install transifex client + command: | + python -m venv ~/venv + . ~/venv/bin/activate + pip install transifex-client + - run: + name: configure transifex client + command: echo $'[https://www.transifex.com]\nhostname = https://www.transifex.com\nusername = api\npassword = '"${TRANSIFEX_PASSWORD}"$'\n' > ~/.transifexrc + - run: + name: push changes in translation files + command: | + . ~/venv/bin/activate + tx push -st + generate_signed_apk: + docker: + - image: circleci/android:api-27-alpha + working_directory: ~/ultrasonic + envoronment: + JAVA_TOOL_OPTIONS: "-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap" + steps: + - checkout + - restore_cache: + key: gradle-cache-{{ checksum "dependencies.gradle" }} + - run: + name: decrypt ultrasonic-keystore + command: openssl aes-256-cbc -K ${ULTRASONIC_KEYSTORE_KEY} -iv ${ULTRASONIC_KEYSTORE_IV} -in ultrasonic-keystore.enc -out ultrasonic-keystore -d + - run: + name: build release apk + command: ./gradlew build assembleRelease + - run: + name: sign release apk + command: | + mkdir -p /tmp/ultrasonic-release + jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ~/ultrasonic/ultrasonic-keystore -storepass ${ULTRASONIC_KEYSTORE_STOREPASS} -keypass ${ULTRASONIC_KEYSTORE_KEYPASS} ultrasonic/build/outputs/apk/release/ultrasonic-release-unsigned.apk ultrasonic + jarsigner -verify ultrasonic/build/outputs/apk/release/ultrasonic-release-unsigned.apk + ${ANDROID_HOME}/build-tools/27.0.0/zipalign -v 4 ultrasonic/build/outputs/apk/release/ultrasonic-release-unsigned.apk /tmp/ultrasonic-release/ultrasonic-${CIRCLE_TAG}.apk + - persist_to_workspace: + root: /tmp/ultrasonic-release + paths: + - ultrasonic-*.apk + publish_github_signed_apk: + docker: + - image: circleci/golang + steps: + - attach_workspace: + at: /tmp/ultrasonic-release + - run: + name: install ghr + command: go get -v github.com/tcnksm/ghr + - run: + name: publish release on github tag + command: ghr -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} ${CIRCLE_TAG} /tmp/ultrasonic-release +workflows: + version: 2 + build_and_push_translations: + jobs: + - build + - push_translations: + requires: + - build + filters: + branches: + only: + - develop + - master + - generate_signed_apk: + filters: + tags: + only: /^[0-9]+(\.[0-9]+)*/ + branches: + ignore: /.*/ + - publish_github_signed_apk: + requires: + - generate_signed_apk + filters: + tags: + only: /^[0-9]+(\.[0-9]+)*/ + branches: + ignore: /.*/ diff --git a/.gitignore b/.gitignore index cfd6b30f..e519a2a6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Release folder +ultrasonic/release/ + # Built application files *.apk *.ap_ diff --git a/.tx/config b/.tx/config new file mode 100644 index 00000000..e17226d9 --- /dev/null +++ b/.tx/config @@ -0,0 +1,10 @@ +[main] +host = https://www.transifex.com +lang_map = fr_CA:fr-rCA,pt_BR:pt-rBR,pt_PT:pt,zh_CN:zh-rCN,zh_HK:zh-rHK,zh_TW:zh-rTW,da_DK:da-rDK,de_DE:de,tr_TR:tr,fr_FR:fr,es_ES:es,hu_HU:hu,sv_SE:sv-rSE,bg_BG:bg,el_GR:el,kn_IN:kn-rIN,cs_CZ:cs,sr:sr,he:iw,id:in,lt_LT:lt,km_KH:km-rKH,th_TH:th + +[ultrasonic.app] +file_filter = ultrasonic/src/main/res/values-/strings.xml +source_file = ultrasonic/src/main/res/values/strings.xml +source_lang = en +type = ANDROID + diff --git a/build.gradle b/build.gradle index 97610b36..25ea3d17 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,6 @@ buildscript { classpath gradlePlugins.ktlintGradle classpath gradlePlugins.detekt classpath gradlePlugins.jacocoAndroid - classpath gradlePlugins.buildVersioning } } diff --git a/dependencies.gradle b/dependencies.gradle index 6c932026..212ef992 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,4 +1,7 @@ ext.versions = [ + versionCode : 63, + versionName : "2.2.2", + minSdk : 14, targetSdk : 22, compileSdk : 27, @@ -10,7 +13,6 @@ ext.versions = [ detekt : "1.0.0.RC6", jacoco : "0.7.9", jacocoAndroid : "0.1.2", - buildVersioning : "1.6.0", androidSupport : "22.2.1", @@ -28,12 +30,11 @@ ext.versions = [ ] ext.gradlePlugins = [ - androidTools : "com.android.tools.build:gradle:$versions.androidTools", - kotlin : "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin", - ktlintGradle : "gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:$versions.ktlintGradle", - detekt : "gradle.plugin.io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$versions.detekt", - jacocoAndroid : "com.dicedmelon.gradle:jacoco-android:$versions.jacocoAndroid", - buildVersioning : "org.moallemi.gradle.advanced-build-version:gradle-plugin:$versions.buildVersioning", + androidTools : "com.android.tools.build:gradle:$versions.androidTools", + kotlin : "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin", + ktlintGradle : "gradle.plugin.org.jlleitschuh.gradle:ktlint-gradle:$versions.ktlintGradle", + detekt : "gradle.plugin.io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$versions.detekt", + jacocoAndroid : "com.dicedmelon.gradle:jacoco-android:$versions.jacocoAndroid" ] ext.androidSupport = [ diff --git a/ultrasonic-keystore.enc b/ultrasonic-keystore.enc new file mode 100644 index 00000000..3c818567 Binary files /dev/null and b/ultrasonic-keystore.enc differ diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 01a2d3c8..0ba0a74b 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -1,30 +1,15 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'jacoco-android' -apply plugin: 'org.moallemi.advanced-build-version' apply from: "../gradle_scripts/code_quality.gradle" -advancedVersioning { - nameOptions { - versionMajor 2 - versionMinor 2 - versionPatch 1 - } - codeOptions { - versionCodeType org.moallemi.gradle.internal.VersionCodeType.AUTO_INCREMENT_ONE_STEP - } - outputOptions { - renameOutput true - } -} - android { compileSdkVersion versions.compileSdk defaultConfig { applicationId "org.moire.ultrasonic" - versionCode advancedVersioning.versionCode - versionName advancedVersioning.versionName + versionCode versions.versionCode + versionName versions.versionName minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk diff --git a/ultrasonic/src/main/AndroidManifest.xml b/ultrasonic/src/main/AndroidManifest.xml index 3d7bad42..c0c48bfc 100644 --- a/ultrasonic/src/main/AndroidManifest.xml +++ b/ultrasonic/src/main/AndroidManifest.xml @@ -202,4 +202,4 @@ - \ No newline at end of file + diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/domain/MusicDirectory.java b/ultrasonic/src/main/java/org/moire/ultrasonic/domain/MusicDirectory.java index 5d3d4786..e0a72f6a 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/domain/MusicDirectory.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/domain/MusicDirectory.java @@ -18,6 +18,8 @@ */ package org.moire.ultrasonic.domain; +import android.support.annotation.NonNull; + import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -352,6 +354,7 @@ public class MusicDirectory this.bitRate = bitRate; } + @NonNull public String getCoverArt() { return coverArt; diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/DownloadFile.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/DownloadFile.java index 9364fb2f..3c7d9ef4 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/DownloadFile.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/DownloadFile.java @@ -21,6 +21,7 @@ package org.moire.ultrasonic.service; import android.content.Context; import android.net.wifi.WifiManager; import android.os.PowerManager; +import android.text.TextUtils; import android.util.Log; import org.moire.ultrasonic.domain.MusicDirectory; @@ -457,8 +458,7 @@ public class DownloadFile { try { - if (song.getCoverArt() != null) - { + if (!TextUtils.isEmpty(song.getCoverArt())) { int size = Util.getMinDisplayMetric(context); musicService.getCoverArt(context, song, size, true, true, null); } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java b/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java index d9c7ca7d..43b7c9e7 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/service/RESTMusicService.java @@ -23,6 +23,7 @@ import android.graphics.Bitmap; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; +import android.text.TextUtils; import android.util.Log; import org.moire.ultrasonic.R; @@ -654,7 +655,7 @@ public class RESTMusicService implements MusicService { Log.d(TAG, "Loading cover art for: " + entry); final String id = entry.getCoverArt(); - if (id == null || id.isEmpty()) { + if (TextUtils.isEmpty(id)) { return null; // Can't load } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/FileUtil.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/FileUtil.java index e885d24f..c306cbb7 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/FileUtil.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/FileUtil.java @@ -22,6 +22,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment; +import android.text.TextUtils; import android.util.Log; import org.moire.ultrasonic.activity.SubsonicTabActivity; @@ -74,12 +75,9 @@ public class FileUtil } fileName.append(fileSystemSafe(song.getTitle())).append('.'); - if (song.getTranscodedSuffix() != null) - { + if (!TextUtils.isEmpty(song.getTranscodedSuffix())) { fileName.append(song.getTranscodedSuffix()); - } - else - { + } else { fileName.append(song.getSuffix()); } @@ -324,13 +322,10 @@ public class FileUtil File dir; - if (entry.getPath() != null) - { + if (!TextUtils.isEmpty(entry.getPath())) { File f = new File(fileSystemSafeDir(entry.getPath())); dir = new File(String.format("%s/%s", getMusicDirectory(context).getPath(), entry.isDirectory() ? f.getPath() : f.getParent())); - } - else - { + } else { String artist = fileSystemSafe(entry.getArtist()); String album = fileSystemSafe(entry.getAlbum()); diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/ImageLoader.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/ImageLoader.java index 6391e66d..60fe1b49 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/ImageLoader.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/ImageLoader.java @@ -25,6 +25,7 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.os.Handler; +import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.ImageView; @@ -179,8 +180,7 @@ public class ImageLoader implements Runnable String coverArt = entry.getCoverArt(); - if (coverArt == null) - { + if (TextUtils.isEmpty(coverArt)) { setUnknownImage(view, large); return; } @@ -230,8 +230,7 @@ public class ImageLoader implements Runnable String coverArt = entry.getCoverArt(); - if (coverArt == null) - { + if (TextUtils.isEmpty(coverArt)) { return null; } diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/view/SongView.java b/ultrasonic/src/main/java/org/moire/ultrasonic/view/SongView.java index 4336da1a..e17560e0 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/view/SongView.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/view/SongView.java @@ -21,6 +21,7 @@ package org.moire.ultrasonic.view; import android.content.Context; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -168,7 +169,10 @@ public class SongView extends UpdateView implements Checkable String suffix = song.getSuffix(); String transcodedSuffix = song.getTranscodedSuffix(); - fileFormat = transcodedSuffix == null || transcodedSuffix.equals(suffix) || (song.isVideo() && Util.getVideoPlayerType(this.context) != VideoPlayerType.FLASH) ? suffix : String.format("%s > %s", suffix, transcodedSuffix); + fileFormat = TextUtils.isEmpty(transcodedSuffix) || + transcodedSuffix.equals(suffix) || + (song.isVideo() && Util.getVideoPlayerType(this.context) != VideoPlayerType.FLASH) ? + suffix : String.format("%s > %s", suffix, transcodedSuffix); String artistName = song.getArtist(); diff --git a/ultrasonic/src/main/res/values-es/strings.xml b/ultrasonic/src/main/res/values-es/strings.xml index 514f1875..9ef97bff 100644 --- a/ultrasonic/src/main/res/values-es/strings.xml +++ b/ultrasonic/src/main/res/values-es/strings.xml @@ -14,6 +14,9 @@ Chat Inicio de UltraSonic Reproduciendo ahora + Podcast + No hay canales de Podcasts registrados + Podcast Listas de reproducción Buscar Enviar un mensaje @@ -393,9 +396,7 @@ 12 Caratula del Álbum Múltiples años - - Ninguna canción 1 canción %d canciones @@ -423,9 +424,6 @@ Queda un día de periodo de prueba Quedan %d días de periodo de prueba - Podcast - Podcast - No hay canales de Podcasts registrados Error genérico de api: %1$s @@ -439,4 +437,4 @@ Versiones incompatibles. Por favor actualiza la aplicación de Android UltraSonic. Versiones incompatibles. Por favor actualiza el servidor de Subsonic. - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/values-fr/strings.xml b/ultrasonic/src/main/res/values-fr/strings.xml index 0c6616f6..f2ca90fc 100644 --- a/ultrasonic/src/main/res/values-fr/strings.xml +++ b/ultrasonic/src/main/res/values-fr/strings.xml @@ -14,6 +14,9 @@ Salon de discussion Accueil Ultrasonic Lecture en cours + Podcast + No podcasts channels registered + Podcast Playlists Recherche Envoyer un message @@ -236,8 +239,8 @@ 60 secondes 75 secondes 90 secondes - Réseau Notifications + Réseau Autres paramètres Paramètres de contrôle de lecture Titres à pré-charger @@ -393,9 +396,7 @@ 12 albumArt Multiple Years - - Aucun titre Un titre %d titres @@ -423,9 +424,6 @@ Un jour restant à la période d\'essai %d jours restant à la période d\'essai - Podcast - Podcast - No podcasts channels registered Erreur api générique: %1$s @@ -439,4 +437,4 @@ Versions incompatible. Veuillez mette à jour l\'application Android UltraSonic. Versions incompatible. Veuillez mette à jour le serveur Subsonic. - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/values-hu/strings.xml b/ultrasonic/src/main/res/values-hu/strings.xml index 571ad7fc..9bfe728e 100644 --- a/ultrasonic/src/main/res/values-hu/strings.xml +++ b/ultrasonic/src/main/res/values-hu/strings.xml @@ -14,6 +14,9 @@ Csevegés (Chat) UltraSonic főoldal Lejátszó + Podcast + No podcasts channels registered + Podcast Lejátszási listák Keresés Üzenet küldése @@ -393,9 +396,7 @@ 12 albumArt Multiple Years - - Nincsenek dalok 1 dal %d dal @@ -423,9 +424,6 @@ 1 nap van hátra a próba időszakból. %d nap van hátra a próba időszakból. - Podcast - Podcast - No podcasts channels registered Általános api hiba: %1$s @@ -439,4 +437,4 @@ Nem kompatibilis verzió. Kérjük, frissítse az UltraSonic Android alkalmazást! Nem kompatibilis verzió. Kérjük, frissítse a Subsonic kiszolgálót! - \ No newline at end of file + diff --git a/ultrasonic/src/main/res/values-pt-rBR/strings.xml b/ultrasonic/src/main/res/values-pt-rBR/strings.xml index 88dd330a..ad8364ba 100644 --- a/ultrasonic/src/main/res/values-pt-rBR/strings.xml +++ b/ultrasonic/src/main/res/values-pt-rBR/strings.xml @@ -396,9 +396,7 @@ 12 albumArt Múltiplos Anos - - Nenhuma música 1 música %d músicas diff --git a/ultrasonic/src/main/res/values-pt/strings.xml b/ultrasonic/src/main/res/values-pt/strings.xml index 9286d0e5..15e827a1 100644 --- a/ultrasonic/src/main/res/values-pt/strings.xml +++ b/ultrasonic/src/main/res/values-pt/strings.xml @@ -1,5 +1,5 @@ - + Carregando… Ocorreu um erro de rede. Verifique o endereço do servidor ou tente mais tarde. @@ -396,9 +396,7 @@ 12 albumArt Múltiplos Anos - - - Nenhuma música + %d música %d músicas diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 4748a3eb..b9edf0d0 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -401,7 +401,6 @@ http://example.com - No songs 1 song %d songs @@ -442,4 +441,4 @@ Incompatible versions. Please upgrade UltraSonic Android app. Incompatible versions. Please upgrade Subsonic server. - \ No newline at end of file + diff --git a/ultrasonic/version.properties b/ultrasonic/version.properties deleted file mode 100644 index 9ebbcbd4..00000000 --- a/ultrasonic/version.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Tue Jan 23 22:14:32 CET 2018 -AI_VERSION_CODE=62