diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..32a53f1 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,2 @@ +[*.{kt,kts}] +indent_size=2 diff --git a/app/src/main/java/com/github/apognu/otter/activities/LoginActivity.kt b/app/src/main/java/com/github/apognu/otter/activities/LoginActivity.kt index 7a0240e..7a79260 100644 --- a/app/src/main/java/com/github/apognu/otter/activities/LoginActivity.kt +++ b/app/src/main/java/com/github/apognu/otter/activities/LoginActivity.kt @@ -54,7 +54,7 @@ class LoginActivity : AppCompatActivity() { throw Exception(getString(R.string.login_error_hostname_https)) } - if (scheme == null) hostname = "https://${hostname}" + if (scheme == null) hostname = "https://$hostname" } } catch (e: Exception) { val message = diff --git a/app/src/main/java/com/github/apognu/otter/adapters/AlbumsAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/AlbumsAdapter.kt index 2ee897e..7ef50e1 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/AlbumsAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/AlbumsAdapter.kt @@ -15,7 +15,7 @@ import jp.wasabeef.picasso.transformations.RoundedCornersTransformation import kotlinx.android.synthetic.main.row_album.view.* import kotlinx.android.synthetic.main.row_artist.view.art -class AlbumsAdapter(val context: Context?, val listener: OnAlbumClickListener) : FunkwhaleAdapter() { +class AlbumsAdapter(val context: Context?, private val listener: OnAlbumClickListener) : FunkwhaleAdapter() { interface OnAlbumClickListener { fun onClick(view: View?, album: Album) } diff --git a/app/src/main/java/com/github/apognu/otter/adapters/BrowseTabsAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/BrowseTabsAdapter.kt index d55eb5d..f4b6d16 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/BrowseTabsAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/BrowseTabsAdapter.kt @@ -4,16 +4,14 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentPagerAdapter import com.github.apognu.otter.R -import com.github.apognu.otter.fragments.AlbumsGridFragment -import com.github.apognu.otter.fragments.ArtistsFragment -import com.github.apognu.otter.fragments.FavoritesFragment -import com.github.apognu.otter.fragments.PlaylistsFragment +import com.github.apognu.otter.fragments.* +import com.github.apognu.otter.utils.Settings class BrowseTabsAdapter(val context: Fragment, manager: FragmentManager) : FragmentPagerAdapter(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { var tabs = mutableListOf() override fun getCount(): Int { - return 4 + return if (Settings.areExperimentsEnabled()) 5 else 4 } override fun getItem(position: Int): Fragment { @@ -21,13 +19,25 @@ class BrowseTabsAdapter(val context: Fragment, manager: FragmentManager) : Fragm return it } - val fragment = when (position) { - 0 -> ArtistsFragment() - 1 -> AlbumsGridFragment() - 2 -> PlaylistsFragment() - 3 -> FavoritesFragment() - else -> ArtistsFragment() - } + val fragment = + if (Settings.areExperimentsEnabled()) { + when (position) { + 0 -> ArtistsFragment() + 1 -> AlbumsGridFragment() + 2 -> PlaylistsFragment() + 3 -> RadiosFragment() + 4 -> FavoritesFragment() + else -> ArtistsFragment() + } + } else { + when (position) { + 0 -> ArtistsFragment() + 1 -> AlbumsGridFragment() + 2 -> PlaylistsFragment() + 3 -> FavoritesFragment() + else -> ArtistsFragment() + } + } tabs.add(position, fragment) @@ -35,12 +45,23 @@ class BrowseTabsAdapter(val context: Fragment, manager: FragmentManager) : Fragm } override fun getPageTitle(position: Int): String { - return when (position) { - 0 -> context.getString(R.string.artists) - 1 -> context.getString(R.string.albums) - 2 -> context.getString(R.string.playlists) - 3 -> context.getString(R.string.favorites) - else -> "" + return if (Settings.areExperimentsEnabled()) { + when (position) { + 0 -> context.getString(R.string.artists) + 1 -> context.getString(R.string.albums) + 2 -> context.getString(R.string.playlists) + 3 -> context.getString(R.string.radios) + 4 -> context.getString(R.string.favorites) + else -> "" + } + } else { + when (position) { + 0 -> context.getString(R.string.artists) + 1 -> context.getString(R.string.albums) + 2 -> context.getString(R.string.playlists) + 3 -> context.getString(R.string.favorites) + else -> "" + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/adapters/PlaylistTracksAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/PlaylistTracksAdapter.kt index ab8555f..3f0efec 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/PlaylistTracksAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/PlaylistTracksAdapter.kt @@ -75,7 +75,6 @@ class PlaylistTracksAdapter(private val context: Context?, private val favoriteL holder.artist.setTypeface(holder.artist.typeface, Typeface.NORMAL) }) - if (track.track == currentTrack) { holder.title.setTypeface(holder.title.typeface, Typeface.BOLD) holder.artist.setTypeface(holder.artist.typeface, Typeface.BOLD) @@ -145,7 +144,7 @@ class PlaylistTracksAdapter(private val context: Context?, private val favoriteL CommandBus.send(Command.MoveFromQueue(oldPosition, newPosition)) } - inner class ViewHolder(view: View, val context: Context?) : RecyclerView.ViewHolder(view), View.OnClickListener { + inner class ViewHolder(view: View, val context: Context?) : RecyclerView.ViewHolder(view), View.OnClickListener { val handle = view.handle val cover = view.cover val title = view.title diff --git a/app/src/main/java/com/github/apognu/otter/adapters/RadiosAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/RadiosAdapter.kt new file mode 100644 index 0000000..9943550 --- /dev/null +++ b/app/src/main/java/com/github/apognu/otter/adapters/RadiosAdapter.kt @@ -0,0 +1,45 @@ +package com.github.apognu.otter.adapters + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.github.apognu.otter.R +import com.github.apognu.otter.fragments.FunkwhaleAdapter +import com.github.apognu.otter.utils.Radio +import kotlinx.android.synthetic.main.row_radio.view.* + +class RadiosAdapter(val context: Context?, private val listener: OnRadioClickListener) : FunkwhaleAdapter() { + interface OnRadioClickListener { + fun onClick(holder: View?, radio: Radio) + } + + override fun getItemCount() = data.size + + override fun getItemId(position: Int) = data[position].id.toLong() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RadiosAdapter.ViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.row_radio, parent, false) + + return ViewHolder(view, listener).also { + view.setOnClickListener(it) + } + } + + override fun onBindViewHolder(holder: RadiosAdapter.ViewHolder, position: Int) { + val radio = data[position] + + holder.name.text = radio.name + holder.description.text = radio.description + } + + inner class ViewHolder(view: View, val listener: OnRadioClickListener) : RecyclerView.ViewHolder(view), View.OnClickListener { + val name = view.name + val description = view.description + + override fun onClick(view: View?) { + listener.onClick(view, data[layoutPosition]) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/adapters/SearchAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/SearchAdapter.kt index 6091c4b..1b2925b 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/SearchAdapter.kt @@ -108,7 +108,7 @@ class SearchAdapter(private val context: Context?, private val listener: OnSearc } } - if (position == (artists.size + albums.size + 2)){ + if (position == (artists.size + albums.size + 2)) { holder.title.text = context.getString(R.string.tracks) holder.itemView.visibility = View.VISIBLE diff --git a/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt index 5dbc8d9..c43b48c 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt @@ -74,7 +74,6 @@ class TracksAdapter(private val context: Context?, private val favoriteListener: holder.artist.typeface = Typeface.create(holder.artist.typeface, Typeface.NORMAL) }) - if (track == currentTrack || track.current) { holder.title.setTypeface(holder.title.typeface, Typeface.BOLD) holder.artist.setTypeface(holder.artist.typeface, Typeface.BOLD) diff --git a/app/src/main/java/com/github/apognu/otter/fragments/RadiosFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/RadiosFragment.kt new file mode 100644 index 0000000..8482dfb --- /dev/null +++ b/app/src/main/java/com/github/apognu/otter/fragments/RadiosFragment.kt @@ -0,0 +1,30 @@ +package com.github.apognu.otter.fragments + +import android.os.Bundle +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.github.apognu.otter.R +import com.github.apognu.otter.adapters.RadiosAdapter +import com.github.apognu.otter.repositories.RadiosRepository +import com.github.apognu.otter.utils.Command +import com.github.apognu.otter.utils.CommandBus +import com.github.apognu.otter.utils.Radio +import kotlinx.android.synthetic.main.fragment_radios.* + +class RadiosFragment : FunkwhaleFragment() { + override val viewRes = R.layout.fragment_radios + override val recycler: RecyclerView get() = radios + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + adapter = RadiosAdapter(context, RadioClickListener()) + repository = RadiosRepository(context) + } + + inner class RadioClickListener : RadiosAdapter.OnRadioClickListener { + override fun onClick(holder: View?, radio: Radio) { + CommandBus.send(Command.PlayRadio(radio)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt b/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt index d1cf155..f2b348b 100644 --- a/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt +++ b/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt @@ -18,6 +18,7 @@ import com.google.android.exoplayer2.* import com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector import com.google.android.exoplayer2.source.TrackGroupArray import com.google.android.exoplayer2.trackselection.TrackSelectionArray +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job @@ -43,6 +44,8 @@ class PlayerService : Service() { private var progressCache = Triple(0, 0, 0) + private lateinit var radioPlayer: RadioPlayer + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { watchEventBus() @@ -53,6 +56,7 @@ class PlayerService : Service() { super.onCreate() queue = QueueManager(this) + radioPlayer = RadioPlayer(this) audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager @@ -142,6 +146,8 @@ class PlayerService : Service() { } is Command.ReplaceQueue -> { + if (!message.fromRadio) radioPlayer.stop() + queue.replace(message.queue) player.prepare(queue.datasources, true, true) @@ -188,6 +194,11 @@ class PlayerService : Service() { is Command.ClearQueue -> queue.clear() + is Command.PlayRadio -> { + queue.clear() + radioPlayer.play(message.radio) + } + is Command.SetRepeatMode -> player.repeatMode = message.mode } @@ -415,6 +426,15 @@ class PlayerService : Service() { queue.current = player.currentWindowIndex mediaControlsManager.updateNotification(queue.current(), player.playWhenReady) + if (queue.get().isNotEmpty() && queue.current() == queue.get().last() && radioPlayer.isActive()) { + GlobalScope.launch(IO) { + if (radioPlayer.lock.tryAcquire()) { + radioPlayer.prepareNextTrack() + radioPlayer.lock.release() + } + } + } + Cache.set( this@PlayerService, "current", diff --git a/app/src/main/java/com/github/apognu/otter/playback/RadioPlayer.kt b/app/src/main/java/com/github/apognu/otter/playback/RadioPlayer.kt new file mode 100644 index 0000000..f8074bf --- /dev/null +++ b/app/src/main/java/com/github/apognu/otter/playback/RadioPlayer.kt @@ -0,0 +1,92 @@ +package com.github.apognu.otter.playback + +import android.content.Context +import com.github.apognu.otter.R +import com.github.apognu.otter.utils.* +import com.github.kittinunf.fuel.Fuel +import com.github.kittinunf.fuel.coroutines.awaitObjectResult +import com.github.kittinunf.fuel.gson.gsonDeserializerOf +import com.google.gson.Gson +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Dispatchers.Main +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Semaphore +import kotlinx.coroutines.withContext + +data class RadioSessionBody(val radio_type: String, val custom_radio: Int) +data class RadioSession(val id: Int) +data class RadioTrackBody(val session: Int) +data class RadioTrack(val position: Int, val track: RadioTrackID) +data class RadioTrackID(val id: Int) + +class RadioPlayer(val context: Context) { + val lock = Semaphore(1) + + private var currentRadio: Radio? = null + private var session: Int? = null + + fun play(radio: Radio) { + currentRadio = radio + session = null + + GlobalScope.launch(IO) { + createSession() + } + } + + fun stop() { + currentRadio = null + session = null + } + + fun isActive() = currentRadio != null && session != null + + private suspend fun createSession() { + currentRadio?.let { radio -> + try { + val body = Gson().toJson(RadioSessionBody("custom", radio.id)) + val result = Fuel.post(mustNormalizeUrl("/api/v1/radios/sessions/")) + .authorize() + .header("Content-Type", "application/json") + .body(body) + .awaitObjectResult(gsonDeserializerOf(RadioSession::class.java)) + + session = result.get().id + + prepareNextTrack(true) + } catch (e: Exception) { + withContext(Main) { + context.toast(context.getString(R.string.radio_playback_error)) + } + } + } + } + + suspend fun prepareNextTrack(first: Boolean = false) { + session?.let { session -> + try { + val body = Gson().toJson(RadioTrackBody(session)) + val result = Fuel.post(mustNormalizeUrl("/api/v1/radios/tracks/")) + .authorize() + .header("Content-Type", "application/json") + .body(body) + .awaitObjectResult(gsonDeserializerOf(RadioTrack::class.java)) + + val track = Fuel.get(mustNormalizeUrl("/api/v1/tracks/${result.get().track.id}/")) + .authorize() + .awaitObjectResult(gsonDeserializerOf(Track::class.java)) + + if (first) { + CommandBus.send(Command.ReplaceQueue(listOf(track.get()), true)) + } else { + CommandBus.send(Command.AddToQueue(listOf(track.get()))) + } + } catch (e: Exception) { + withContext(Main) { + context.toast(context.getString(R.string.radio_playback_error)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/repositories/RadiosRepository.kt b/app/src/main/java/com/github/apognu/otter/repositories/RadiosRepository.kt new file mode 100644 index 0000000..0c03bec --- /dev/null +++ b/app/src/main/java/com/github/apognu/otter/repositories/RadiosRepository.kt @@ -0,0 +1,18 @@ +package com.github.apognu.otter.repositories + +import android.content.Context +import com.github.apognu.otter.utils.FunkwhaleResponse +import com.github.apognu.otter.utils.Radio +import com.github.apognu.otter.utils.RadiosCache +import com.github.apognu.otter.utils.RadiosResponse +import com.github.kittinunf.fuel.gson.gsonDeserializerOf +import com.google.gson.reflect.TypeToken +import java.io.BufferedReader + +class RadiosRepository(override val context: Context?) : Repository() { + override val cacheId = "radios" + override val upstream = HttpUpstream>(HttpUpstream.Behavior.Progressive, "/api/v1/radios/radios/", object : TypeToken() {}.type) + + override fun cache(data: List) = RadiosCache(data) + override fun uncache(reader: BufferedReader) = gsonDeserializerOf(RadiosCache::class.java).deserialize(reader) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/utils/Data.kt b/app/src/main/java/com/github/apognu/otter/utils/Data.kt index eef31c5..9210464 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Data.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Data.kt @@ -1,7 +1,6 @@ package com.github.apognu.otter.utils import android.content.Context -import android.util.Log import com.github.apognu.otter.activities.FwCredentials import com.github.kittinunf.fuel.Fuel import com.github.kittinunf.fuel.core.FuelError diff --git a/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt b/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt index b451e71..82f5fde 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt @@ -20,10 +20,11 @@ sealed class Command { class AddToQueue(val tracks: List) : Command() class PlayNext(val track: Track) : Command() - class ReplaceQueue(val queue: List) : Command() + class ReplaceQueue(val queue: List, val fromRadio: Boolean = false) : Command() class RemoveFromQueue(val track: Track) : Command() class MoveFromQueue(val oldPosition: Int, val newPosition: Int) : Command() object ClearQueue : Command() + class PlayRadio(val radio: Radio) : Command() class SetRepeatMode(val mode: Int) : Command() diff --git a/app/src/main/java/com/github/apognu/otter/utils/Extensions.kt b/app/src/main/java/com/github/apognu/otter/utils/Extensions.kt index 55bee25..13c8cb9 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Extensions.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Extensions.kt @@ -7,6 +7,7 @@ import androidx.fragment.app.Fragment import com.github.apognu.otter.R import com.github.apognu.otter.fragments.BrowseFragment import com.github.apognu.otter.repositories.Repository +import com.github.kittinunf.fuel.core.Request import com.squareup.picasso.Picasso import com.squareup.picasso.RequestCreator import kotlinx.coroutines.Dispatchers.Main @@ -69,4 +70,12 @@ fun T.applyOnApi(api: Int, block: T.() -> T): T { fun Picasso.maybeLoad(url: String?): RequestCreator { if (url == null) return load(R.drawable.cover) else return load(url) -} \ No newline at end of file +} + +fun Request.authorize(): Request { + return this.apply { + if (!Settings.isAnonymous()) { + header("Authorization", "Bearer ${Settings.getAccessToken()}") + } + } +} diff --git a/app/src/main/java/com/github/apognu/otter/utils/Models.kt b/app/src/main/java/com/github/apognu/otter/utils/Models.kt index ad6ca94..82c2990 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Models.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Models.kt @@ -8,6 +8,7 @@ class AlbumsCache(data: List) : CacheItem(data) class TracksCache(data: List) : CacheItem(data) class PlaylistsCache(data: List) : CacheItem(data) class PlaylistTracksCache(data: List) : CacheItem(data) +class RadiosCache(data: List) : CacheItem(data) class FavoritedCache(data: List) : CacheItem(data) class QueueCache(data: List) : CacheItem(data) @@ -46,6 +47,10 @@ data class PlaylistTracksResponse(override val count: Int, override val next: St override fun getData() = results } +data class RadiosResponse(override val count: Int, override val next: String?, val results: List) : FunkwhaleResponse() { + override fun getData() = results +} + data class Covers(val original: String) typealias AlbumList = List @@ -133,4 +138,10 @@ data class Playlist( val duration: Int ) -data class PlaylistTrack(val track: Track) \ No newline at end of file +data class PlaylistTrack(val track: Track) + +data class Radio( + val id: Int, + val name: String, + val description: String +) \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/utils/Util.kt b/app/src/main/java/com/github/apognu/otter/utils/Util.kt index fa95fe5..c927335 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Util.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Util.kt @@ -16,6 +16,10 @@ fun Any.log(message: String) { Log.d("FUNKWHALE", "${this.javaClass.simpleName}: $message") } +fun Any.log() { + Log.d("FUNKWHALE", this.toString()) +} + fun maybeNormalizeUrl(url: String?): String? { if (url == null || url.isEmpty()) return null @@ -56,4 +60,5 @@ object Settings { fun hasAccessToken() = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).contains("access_token") fun getAccessToken(): String = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("access_token", "") fun isAnonymous() = PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getBoolean("anonymous", false) -} \ No newline at end of file + fun areExperimentsEnabled() = PowerPreference.getDefaultFile().getBoolean("experiments", false) +} diff --git a/app/src/main/res/layout/fragment_radios.xml b/app/src/main/res/layout/fragment_radios.xml new file mode 100644 index 0000000..6faaef8 --- /dev/null +++ b/app/src/main/res/layout/fragment_radios.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/partial_queue.xml b/app/src/main/res/layout/partial_queue.xml index 5961252..81d4ccc 100644 --- a/app/src/main/res/layout/partial_queue.xml +++ b/app/src/main/res/layout/partial_queue.xml @@ -1,8 +1,7 @@ + android:layout_height="wrap_content"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 17089c0..7ec9708 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -55,6 +55,7 @@ Albums Pistes Playlists + Radios Favoris Contrôle de lecture @@ -99,6 +100,8 @@ Bitrate Instance Funkwhale + Une erreur s\'est produite lors de la lecture de cette radio + Déconnexion Etes-vous certains de vouloir vous déconnecter de votre instance Funkwhale ? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 33ec42a..865378d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,6 +55,7 @@ Albums Tracks Playlists + Radios Favorites Media controls @@ -99,6 +100,8 @@ Bitrate Funkwhale instance + There was an error while trying to play this radio + Sign out Are you sure you want to sign out of your Funkwhale instance? diff --git a/build.gradle.kts b/build.gradle.kts index 77c0a3b..9351685 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath("com.android.tools.build:gradle:3.5.1") + classpath("com.android.tools.build:gradle:3.6.3") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.50") } } diff --git a/fastlane/metadata/android/en-US/changelogs/10000016.txt b/fastlane/metadata/android/en-US/changelogs/1000016.txt similarity index 100% rename from fastlane/metadata/android/en-US/changelogs/10000016.txt rename to fastlane/metadata/android/en-US/changelogs/1000016.txt diff --git a/fastlane/metadata/android/fr-FR/changelogs/10000016.txt b/fastlane/metadata/android/fr-FR/changelogs/1000016.txt similarity index 100% rename from fastlane/metadata/android/fr-FR/changelogs/10000016.txt rename to fastlane/metadata/android/fr-FR/changelogs/1000016.txt diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3a54a33..ea40b5a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Sat May 30 20:25:10 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip