From 94f4560478deb3ed7c6e5c89a1e4e95072a70d88 Mon Sep 17 00:00:00 2001 From: shabinder Date: Sat, 25 Jul 2020 00:03:40 +0530 Subject: [PATCH] Error Handling Improved,Shifted To client id:secret Flow(MoreLimit & Fast) --- app/src/main/AndroidManifest.xml | 7 +- app/src/main/ic_launcher-playstore.png | Bin 0 -> 91246 bytes .../musicForEveryone/MainActivity.kt | 257 ++++++++++----- .../musicForEveryone/SharedViewModel.kt | 38 ++- .../downloadHelper/DownloadHelper.kt | 49 ++- .../fragments/MainFragment.kt | 298 ++++++++++++------ .../fragments/MainViewModel.kt | 11 + .../recyclerView/TrackListAdapter.kt | 15 +- .../musicForEveryone/utils/BindingAdapter.kt | 20 +- .../utils/SpotifyNewService.kt | 36 --- .../musicForEveryone/utils/SpotifyService.kt | 35 ++ .../utils/YoutubeInterface.kt | 6 +- 12 files changed, 521 insertions(+), 251 deletions(-) create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/shabinder/musicForEveryone/fragments/MainViewModel.kt delete mode 100644 app/src/main/java/com/shabinder/musicForEveryone/utils/SpotifyNewService.kt create mode 100644 app/src/main/java/com/shabinder/musicForEveryone/utils/SpotifyService.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 64d7de01..71fcd374 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,9 +26,14 @@ + + + + - diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cd15255c1c1fa27e0cb8a888ec38902b86c627 GIT binary patch literal 91246 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
  • (m*B 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ůd>^zTO&~zVhas*d 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 K>b50=`TqeHXfnP4 literal 0 HcmV?d00001 diff --git a/app/src/main/java/com/shabinder/musicForEveryone/MainActivity.kt b/app/src/main/java/com/shabinder/musicForEveryone/MainActivity.kt index 0789fe4b..26d2db73 100644 --- a/app/src/main/java/com/shabinder/musicForEveryone/MainActivity.kt +++ b/app/src/main/java/com/shabinder/musicForEveryone/MainActivity.kt @@ -4,26 +4,22 @@ import android.Manifest import android.app.DownloadManager import android.content.Context import android.content.Intent +import android.content.SharedPreferences +import android.net.ConnectivityManager import android.os.Build import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil -import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.github.kiulian.downloader.YoutubeDownloader import com.shabinder.musicForEveryone.databinding.MainActivityBinding import com.shabinder.musicForEveryone.downloadHelper.DownloadHelper -import com.shabinder.musicForEveryone.utils.SpotifyNewService +import com.shabinder.musicForEveryone.utils.SpotifyService +import com.shabinder.musicForEveryone.utils.SpotifyServiceToken import com.shabinder.musicForEveryone.utils.YoutubeInterface -import com.spotify.sdk.android.authentication.AuthenticationClient -import com.spotify.sdk.android.authentication.AuthenticationRequest -import com.spotify.sdk.android.authentication.AuthenticationResponse -import com.spotify.sdk.android.authentication.LoginActivity import com.squareup.moshi.Moshi import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory -import kaaes.spotify.webapi.android.SpotifyApi -import kaaes.spotify.webapi.android.SpotifyService import kotlinx.coroutines.launch import okhttp3.Interceptor import okhttp3.OkHttpClient @@ -32,30 +28,43 @@ import okhttp3.Response import retrofit2.Retrofit import retrofit2.converter.moshi.MoshiConverterFactory - +@Suppress("DEPRECATION") class MainActivity : AppCompatActivity() ,DownloadHelper{ private lateinit var binding: MainActivityBinding - var ytDownloader : YoutubeDownloader? = null - var spotifyExtra : SpotifyNewService? = null - var downloadManager : DownloadManager? = null - val REDIRECT_URI = "musicforeveryone://callback" - val CLIENT_ID:String = "694d8bf4f6ec420fa66ea7fb4c68f89d" - var token :String ="" - var spotify: SpotifyService? = null - lateinit var sharedViewModel: SharedViewModel + private var ytDownloader : YoutubeDownloader? = null + private var spotifyService : SpotifyService? = null + private var spotifyServiceToken : SpotifyServiceToken? = null + private var downloadManager : DownloadManager? = null +// private val redirectUri = "musicforeveryone://callback" + private val clientId:String = "694d8bf4f6ec420fa66ea7fb4c68f89d" + private val clientSecret:String = "02ca2d4021a7452dae2328b47a6e8fe8" + private var isConnected: Boolean = false + private var sharedPref :SharedPreferences? = null + + private var token :String ="" + private lateinit var sharedViewModel: SharedViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = DataBindingUtil.setContentView(this,R.layout.main_activity) - sharedViewModel = ViewModelProvider(this).get(SharedViewModel::class.java) -// val policy = -// StrictMode.ThreadPolicy.Builder().permitAll().build() -// StrictMode.setThreadPolicy(policy) - //TODO Use Coroutines - if(spotify==null){ + sharedPref = this.getPreferences(Context.MODE_PRIVATE) + +// if(sharedPref?.contains("token")!! && (sharedPref?.getLong("time",System.currentTimeMillis()/1000/60/60)!! < (System.currentTimeMillis()/1000/60/60)) ){ +// val savedToken = sharedPref?.getString("token","error")!! +// sharedViewModel.accessToken.value = savedToken +// Log.i("SharedPrefs Token:",savedToken) +// token = savedToken +// +// implementSpotifyService(savedToken) +// }else{authenticateSpotify()} + + if(sharedViewModel.spotifyService == null){ authenticateSpotify() + }else{ + implementSpotifyService(sharedViewModel.accessToken.value!!) } + requestPermission() //Object to download From Youtube {"https://github.com/sealedtx/java-youtube-downloader"} @@ -68,69 +77,22 @@ class MainActivity : AppCompatActivity() ,DownloadHelper{ downloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager sharedViewModel.downloadManager = downloadManager - if (intent?.action == Intent.ACTION_SEND) { - if ("text/plain" == intent.type) { - intent.getStringExtra(Intent.EXTRA_TEXT)?.let { - Log.i("Intent Received",it) - sharedViewModel.intentString = it - } - } - } - } + isConnected = isOnline() + sharedViewModel.isConnected.value = isConnected + + Log.i("Connection Status",isConnected.toString()) - override fun onActivityResult( - requestCode: Int, - resultCode: Int, - intent: Intent? - ) { - super.onActivityResult(requestCode, resultCode, intent) - // Check if result comes from the correct activity - if (requestCode == LoginActivity.REQUEST_CODE) { - val response = AuthenticationClient.getResponse(resultCode, intent) - when (response.type) { - AuthenticationResponse.Type.TOKEN -> { - Log.i("Network",response.accessToken.toString()) - token = response.accessToken - sharedViewModel.accessToken = response.accessToken - - //Implementing My Own Spotify Requests - implementSpotifyExtra() - val api = SpotifyApi() - api.setAccessToken(token) - spotify = api.service - sharedViewModel.spotify = api.service - //Initiate Processes In Main Fragment - - sharedViewModel.uiScope.launch { - val me = spotifyExtra?.getMe()?.display_name - sharedViewModel.userName.value = "Logged in as: $me" - Log.i("Network","Hello, " + me!!) - } - - sharedViewModel.userName.observe(this, Observer { - binding.message.text = it - }) - } - - - AuthenticationResponse.Type.ERROR -> { - Log.i("Network",response.error.toString()) - } - else -> { - } - } - } + handleIntentFromExternalActivity() } /** * Adding my own new Spotify Web Api Requests! * */ - private fun implementSpotifyExtra() { - + private fun implementSpotifyService(token:String) { val httpClient: OkHttpClient.Builder = OkHttpClient.Builder() - httpClient.addInterceptor(object : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { val request: Request = chain.request().newBuilder().addHeader( @@ -146,17 +108,89 @@ class MainActivity : AppCompatActivity() ,DownloadHelper{ .add(KotlinJsonAdapterFactory()) .build() - val retrofit: Retrofit = - Retrofit.Builder() + val retrofit = Retrofit.Builder() .baseUrl("https://api.spotify.com/v1/") .client(httpClient.build()) .addConverterFactory(MoshiConverterFactory.create(moshi)) .build() - spotifyExtra = retrofit.create(SpotifyNewService::class.java) - sharedViewModel.spotifyExtra = spotifyExtra + spotifyService = retrofit.create(SpotifyService::class.java) + sharedViewModel.spotifyService = spotifyService } + private fun getSpotifyToken(){ + val httpClient2: OkHttpClient.Builder = OkHttpClient.Builder() + httpClient2.addInterceptor(object : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val request: Request = + chain.request().newBuilder().addHeader( + "Authorization", + "Basic ${android.util.Base64.encodeToString("$clientId:$clientSecret".toByteArray(),android.util.Base64.NO_WRAP)}" + ).build() + return chain.proceed(request) + } + }) + + val moshi = Moshi.Builder() + .add(KotlinJsonAdapterFactory()) + .build() + + val retrofit2 = Retrofit.Builder() + .baseUrl("https://accounts.spotify.com/") + .client(httpClient2.build()) + .addConverterFactory(MoshiConverterFactory.create(moshi)) + .build() + + spotifyServiceToken = retrofit2.create(SpotifyServiceToken::class.java) + + } + + private fun authenticateSpotify() { + if (spotifyServiceToken == null) { + getSpotifyToken() + } + sharedViewModel.uiScope.launch { + if (isConnected) { + Log.i("Post Request", "Made") + token = spotifyServiceToken!!.getToken()!!.access_token + implementSpotifyService(token) + Log.i("Post Request", token) + sharedViewModel.accessToken.value = token + saveToken(token) + }else{ + Log.i("network", "unavailable") +// sharedViewModel.showAlertDialog(resources,this@MainActivity) + } + } + } + + private fun saveToken(token:String) { + with (sharedPref?.edit()) { + this?.let { + putString("token", token) + putLong("time",(System.currentTimeMillis()/1000/60/60)) + commit() + } + } + } + + private fun handleIntentFromExternalActivity() { + if (intent?.action == Intent.ACTION_SEND) { + if ("text/plain" == intent.type) { + intent.getStringExtra(Intent.EXTRA_TEXT)?.let { + Log.i("Intent Received",it) + sharedViewModel.intentString = it + } + } + } + } + + private fun isOnline(): Boolean { + val cm = + getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val netInfo = cm.activeNetworkInfo + return netInfo != null && netInfo.isConnectedOrConnecting + } private fun requestPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -167,13 +201,66 @@ class MainActivity : AppCompatActivity() ,DownloadHelper{ } } + override fun onSaveInstanceState(savedInstanceState:Bundle) { + savedInstanceState.putString("token",token) + super.onSaveInstanceState(savedInstanceState) + } + override fun onRestoreInstanceState(savedInstanceState: Bundle) { + if (savedInstanceState.getString("token") ==""){ + super.onRestoreInstanceState(savedInstanceState) + }else{ + implementSpotifyService(savedInstanceState.getString("token")!!) + super.onRestoreInstanceState(savedInstanceState) + } + } + + /* private fun authenticateSpotify() { - val builder = AuthenticationRequest.Builder(CLIENT_ID,AuthenticationResponse.Type.TOKEN,REDIRECT_URI) - .setShowDialog(false) - .setScopes(arrayOf("user-read-private","streaming","user-read-email","user-modify-playback-state","user-top-read","user-library-modify","user-read-currently-playing","user-library-read","user-read-recently-played")) + val builder = AuthenticationRequest.Builder(clientId,AuthenticationResponse.Type.TOKEN,redirectUri) + .setScopes(arrayOf("user-read-private")) +// .setScopes(arrayOf("user-read-private","streaming","user-read-email","user-modify-playback-state","user-top-read","user-library-modify","user-read-currently-playing","user-library-read","user-read-recently-played")) val request: AuthenticationRequest = builder.build() AuthenticationClient.openLoginActivity(this, LoginActivity.REQUEST_CODE, request) - } + }*/ + + /*override fun onActivityResult( + requestCode: Int, + resultCode: Int, + intent: Intent? + ) { + super.onActivityResult(requestCode, resultCode, intent) + // Check if result comes from the correct activity + if (requestCode == LoginActivity.REQUEST_CODE) { + val response = AuthenticationClient.getResponse(resultCode, intent) + when (response.type) { + AuthenticationResponse.Type.TOKEN -> { + Log.i("Network",response.accessToken.toString()) + token = response.accessToken + sharedViewModel.accessToken = response.accessToken + + //Implementing My Own Spotify Requests + implementSpotifyService(token) + + sharedViewModel.uiScope.launch { + val me = spotifyService?.getMe()?.display_name + sharedViewModel.userName.value = "Logged in as: $me" + Log.i("Network","Hello, " + me!!) + } + + sharedViewModel.userName.observe(this, Observer { + binding.message.text = it + }) + } + AuthenticationResponse.Type.ERROR -> { + Log.i("Network",response.error.toString()) + } + else -> { + Log.i("Network","Something Weird Happened While Authenticating") + } + } + } + } +*/ } \ No newline at end of file diff --git a/app/src/main/java/com/shabinder/musicForEveryone/SharedViewModel.kt b/app/src/main/java/com/shabinder/musicForEveryone/SharedViewModel.kt index a25b9dbb..031ed597 100644 --- a/app/src/main/java/com/shabinder/musicForEveryone/SharedViewModel.kt +++ b/app/src/main/java/com/shabinder/musicForEveryone/SharedViewModel.kt @@ -1,39 +1,40 @@ package com.shabinder.musicForEveryone import android.app.DownloadManager +import android.content.Context +import android.content.res.Resources import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.github.kiulian.downloader.YoutubeDownloader -import com.shabinder.musicForEveryone.utils.SpotifyNewService -import kaaes.spotify.webapi.android.SpotifyService -import kaaes.spotify.webapi.android.models.Album -import kaaes.spotify.webapi.android.models.Playlist -import kaaes.spotify.webapi.android.models.Track +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.shabinder.musicForEveryone.models.Album +import com.shabinder.musicForEveryone.models.Playlist +import com.shabinder.musicForEveryone.models.Track +import com.shabinder.musicForEveryone.utils.SpotifyService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job class SharedViewModel : ViewModel() { var intentString = "" - var accessToken:String = "" - var userName = MutableLiveData().apply { value = "Placeholder" } - var spotify :SpotifyService? = null - var spotifyExtra : SpotifyNewService? = null + var accessToken = MutableLiveData().apply { value = "" } + var spotifyService : SpotifyService? = null var ytDownloader : YoutubeDownloader? = null var downloadManager : DownloadManager? = null + var isConnected = MutableLiveData().apply { value = false } - var viewModelJob = Job() + private var viewModelJob = Job() val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob) suspend fun getTrackDetails(trackLink:String): Track?{ - return spotifyExtra?.getTrack(trackLink) + return spotifyService?.getTrack(trackLink) } suspend fun getAlbumDetails(albumLink:String): Album?{ - return spotifyExtra?.getAlbum(albumLink) + return spotifyService?.getAlbum(albumLink) } suspend fun getPlaylistDetails(link:String): Playlist?{ - return spotifyExtra?.getPlaylist(link) + return spotifyService?.getPlaylist(link) } @@ -41,4 +42,15 @@ class SharedViewModel : ViewModel() { super.onCleared() viewModelJob.cancel() } + + fun showAlertDialog(resources:Resources,context: Context){ + val dialog = MaterialAlertDialogBuilder(context,R.style.AlertDialogTheme) + .setTitle(resources.getString(R.string.title)) + .setMessage(resources.getString(R.string.supporting_text)) + .setPositiveButton(resources.getString(R.string.cancel)) { _, _ -> + // Respond to neutral button press + } + .setBackground(resources.getDrawable(R.drawable.gradient)) + .show() + } } \ No newline at end of file diff --git a/app/src/main/java/com/shabinder/musicForEveryone/downloadHelper/DownloadHelper.kt b/app/src/main/java/com/shabinder/musicForEveryone/downloadHelper/DownloadHelper.kt index 13126423..9fb04cdc 100644 --- a/app/src/main/java/com/shabinder/musicForEveryone/downloadHelper/DownloadHelper.kt +++ b/app/src/main/java/com/shabinder/musicForEveryone/downloadHelper/DownloadHelper.kt @@ -8,18 +8,29 @@ import android.util.Log import com.github.kiulian.downloader.YoutubeDownloader import com.github.kiulian.downloader.model.formats.Format import com.github.kiulian.downloader.model.quality.AudioQuality +import com.shabinder.musicForEveryone.fragments.MainFragment +import com.shabinder.musicForEveryone.models.Track import com.shabinder.musicForEveryone.utils.YoutubeInterface import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.File interface DownloadHelper { + + /** + * Function To Download All Tracks Available in a List + **/ + suspend fun downloadAllTracks(trackList : List, ytDownloader: YoutubeDownloader?, downloadManager: DownloadManager?) { + trackList.forEach { downloadTrack(null,ytDownloader,downloadManager,"${it.name} ${it.artists?.get(0)?.name ?:""}") } + } + + suspend fun downloadTrack( + mainFragment: MainFragment?, ytDownloader: YoutubeDownloader?, downloadManager: DownloadManager?, searchQuery: String ) { - withContext(Dispatchers.IO) { val data = YoutubeInterface.search(searchQuery)?.get(0) if (data == null) { @@ -36,11 +47,44 @@ interface DownloadHelper { Log.i("DHelper Link Found", audioUrl) if (audioUrl != null) { downloadFile(audioUrl, downloadManager, details!!.title()) + withContext(Dispatchers.Main){ + mainFragment?.showToast("Download Started") + } } else { Log.i("YT audio url is null", format.toString()) } }catch (e:ArrayIndexOutOfBoundsException){ - Log.i("Catch",e.toString()) + try{ + val format: Format = + video?.findAudioWithQuality(AudioQuality.high)?.get(0) as Format + val audioUrl = format.url() + Log.i("DHelper Link Found", audioUrl) + if (audioUrl != null) { + downloadFile(audioUrl, downloadManager, details!!.title()) + withContext(Dispatchers.Main){ + mainFragment?.showToast("Download Started") + } + } else { + Log.i("YT audio url is null", format.toString()) + } + }catch (e:ArrayIndexOutOfBoundsException){ + try{ + val format: Format = + video?.findAudioWithQuality(AudioQuality.high)?.get(0) as Format + val audioUrl = format.url() + Log.i("DHelper Link Found", audioUrl) + if (audioUrl != null) { + downloadFile(audioUrl, downloadManager, details!!.title()) + withContext(Dispatchers.Main){ + mainFragment?.showToast("Download Started") + } + } else { + Log.i("YT audio url is null", format.toString()) + } + }catch(e:ArrayIndexOutOfBoundsException){ + Log.i("Catch",e.toString()) + } + } } @@ -70,6 +114,7 @@ interface DownloadHelper { .setNotificationVisibility(VISIBILITY_VISIBLE_NOTIFY_COMPLETED) downloadManager?.enqueue(request) Log.i("DownloadManager", "Download Request Sent") + } } diff --git a/app/src/main/java/com/shabinder/musicForEveryone/fragments/MainFragment.kt b/app/src/main/java/com/shabinder/musicForEveryone/fragments/MainFragment.kt index 3fc56281..f59a1c3a 100644 --- a/app/src/main/java/com/shabinder/musicForEveryone/fragments/MainFragment.kt +++ b/app/src/main/java/com/shabinder/musicForEveryone/fragments/MainFragment.kt @@ -1,6 +1,12 @@ package com.shabinder.musicForEveryone.fragments +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.net.ConnectivityManager +import android.net.Uri import android.os.Bundle +import android.text.SpannableStringBuilder import android.util.Log import android.view.LayoutInflater import android.view.View @@ -14,19 +20,25 @@ import com.shabinder.musicForEveryone.R import com.shabinder.musicForEveryone.SharedViewModel import com.shabinder.musicForEveryone.databinding.MainFragmentBinding import com.shabinder.musicForEveryone.downloadHelper.DownloadHelper +import com.shabinder.musicForEveryone.models.Track import com.shabinder.musicForEveryone.recyclerView.TrackListAdapter +import com.shabinder.musicForEveryone.utils.SpotifyService import com.shabinder.musicForEveryone.utils.bindImage -import kaaes.spotify.webapi.android.SpotifyService -import kaaes.spotify.webapi.android.models.Track +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +@Suppress("DEPRECATION") class MainFragment : Fragment(),DownloadHelper { - lateinit var binding:MainFragmentBinding + private lateinit var binding:MainFragmentBinding + private lateinit var mainViewModel: MainViewModel private lateinit var sharedViewModel: SharedViewModel - var spotify : SpotifyService? = null - var type:String = "" - var spotifyLink = "" + private lateinit var adapter:TrackListAdapter + private var spotifyService : SpotifyService? = null + private var type:String = "" + private var spotifyLink = "" + private var i: Intent? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -34,111 +46,211 @@ class MainFragment : Fragment(),DownloadHelper { binding = DataBindingUtil.inflate(inflater,R.layout.main_fragment,container,false) sharedViewModel = ViewModelProvider(this.requireActivity()).get(SharedViewModel::class.java) - spotify = sharedViewModel.spotify + mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java) + spotifyService = sharedViewModel.spotifyService + + val spanStringBuilder = SpannableStringBuilder() + spanStringBuilder.append(getText(R.string.d_one)).append("\n") + spanStringBuilder.append(getText(R.string.d_two)).append("\n") + spanStringBuilder.append(getText(R.string.d_three)).append("\n") + + binding.usage.text = spanStringBuilder + openSpotifyButton() binding.btnSearch.setOnClickListener { - spotifyLink = binding.spotifyLink.text.toString() + sharedViewModel.isConnected.value = isOnline() + spotifyLink = binding.linkSearch.text.toString() - val link = spotifyLink.substringAfterLast('/' , "Error").substringBefore('?') - type = spotifyLink.substringBeforeLast('/' , "Error").substringAfterLast('/') + val link = spotifyLink.substringAfterLast('/', "Error").substringBefore('?') + type = spotifyLink.substringBeforeLast('/', "Error").substringAfterLast('/') Log.i("Fragment", "$type : $link") - val adapter = TrackListAdapter() - binding.trackList.adapter = adapter - adapter.sharedViewModel = sharedViewModel - when(type){ - "track" -> { - sharedViewModel.uiScope.launch{ - val trackObject = sharedViewModel.getTrackDetails(link) + if (type == "Error" || link == "Error") { + showToast("Please Check Your Link!") + } else if(sharedViewModel.isConnected.value == false){ + sharedViewModel.showAlertDialog(resources,requireContext()) + } + else { + adapter = TrackListAdapter() + binding.trackList.adapter = adapter + adapter.sharedViewModel = sharedViewModel + adapter.mainFragment = this + setUiVisibility() - binding.imageView.visibility =View.VISIBLE + if(mainViewModel.searchLink == spotifyLink){ + //it's a Device Configuration Change + adapterConfig(mainViewModel.trackList) + bindImage(binding.imageView,mainViewModel.coverUrl) + }else{ + when (type) { + "track" -> { + mainViewModel.searchLink = spotifyLink + sharedViewModel.uiScope.launch { + val trackObject = sharedViewModel.getTrackDetails(link) + val trackList = mutableListOf() + trackList.add(trackObject!!) + mainViewModel.trackList = trackList + mainViewModel.coverUrl = trackObject.album!!.images?.get(0)!!.url!! + bindImage(binding.imageView,mainViewModel.coverUrl) + adapterConfig(trackList) - val trackList = mutableListOf() - trackList.add(trackObject!!) - bindImage(binding.imageView, trackObject.album.images[0].url) - adapter.totalItems = 1 - adapter.trackList = trackList - adapter.notifyDataSetChanged() - Log.i("Adapter",trackList.size.toString()) - binding.btnDownloadAll.setOnClickListener { downloadAllTracks(trackList) } + binding.btnDownloadAll.setOnClickListener { + sharedViewModel.uiScope.launch { + withContext(Dispatchers.IO) { + downloadAllTracks( + trackList, + sharedViewModel.ytDownloader, + sharedViewModel.downloadManager + ) + } + } + } + + } + } + + "album" -> { + mainViewModel.searchLink = spotifyLink + sharedViewModel.uiScope.launch { + val albumObject = sharedViewModel.getAlbumDetails(link) + val trackList = mutableListOf() + albumObject!!.tracks?.items?.forEach { trackList.add(it!!) } + mainViewModel.trackList = trackList + mainViewModel.coverUrl = albumObject.images?.get(0)!!.url!! + bindImage(binding.imageView,mainViewModel.coverUrl) + adapter.isAlbum = true + adapterConfig(trackList) + binding.btnDownloadAll.setOnClickListener { + sharedViewModel.uiScope.launch { + withContext(Dispatchers.IO) { + downloadAllTracks( + trackList, + sharedViewModel.ytDownloader, + sharedViewModel.downloadManager + ) + } + } + } + } + + + } + + "playlist" -> { + mainViewModel.searchLink = spotifyLink + sharedViewModel.uiScope.launch { + val playlistObject = sharedViewModel.getPlaylistDetails(link) + val trackList = mutableListOf() + playlistObject!!.tracks?.items!!.forEach { trackList.add(it?.track!!) } + mainViewModel.trackList = trackList + mainViewModel.coverUrl = playlistObject.images?.get(0)!!.url!! + bindImage(binding.imageView,mainViewModel.coverUrl) + adapterConfig(trackList) + binding.btnDownloadAll.setOnClickListener { + sharedViewModel.uiScope.launch { + withContext(Dispatchers.IO) { + downloadAllTracks( + trackList, + sharedViewModel.ytDownloader, + sharedViewModel.downloadManager + ) + } + } + } + } + + } + + "episode" -> { + showToast("Implementation Pending") + } + "show" -> { + showToast("Implementation Pending ") + } } } - - "album" -> { - sharedViewModel.uiScope.launch{ - - val albumObject = sharedViewModel.getAlbumDetails(link) -// binding.titleView.text = albumObject!!.name -// binding.titleView.visibility =View.VISIBLE - binding.imageView.visibility =View.VISIBLE - binding.btnDownloadAll.visibility =View.VISIBLE - val trackList = mutableListOf() - albumObject!!.tracks?.items?.forEach { trackList.add(it as Track) } - adapter.totalItems = trackList.size - adapter.trackList = trackList - adapter.notifyDataSetChanged() - - Log.i("Adapter",trackList.size.toString()) - - bindImage(binding.imageView, albumObject.images[0].url) - binding.btnDownloadAll.setOnClickListener { downloadAllTracks(trackList) } - - } - - - } - - "playlist" -> { - sharedViewModel.uiScope.launch{ - val playlistObject = sharedViewModel.getPlaylistDetails(link) - binding.btnDownloadAll.visibility =View.VISIBLE - - - binding.imageView.visibility =View.VISIBLE -// binding.titleView.text = "${if(playlistObject!!.name.length > 18){"${playlistObject.name.subSequence(0,17)}..."}else{playlistObject.name}}" -// binding.titleView.visibility =View.VISIBLE -// binding.playlistOwner.visibility =View.VISIBLE -// binding.playlistOwner.text = "by: ${playlistObject.owner.display_name}" - val trackList = mutableListOf() - playlistObject!!.tracks?.items!!.forEach { trackList.add(it.track) } - adapter.trackList = trackList.toList() - adapter.totalItems = trackList.size - adapter.notifyDataSetChanged() - - Log.i("Adapter",trackList.size.toString()) - - bindImage(binding.imageView, playlistObject.images[0].url) - - binding.btnDownloadAll.setOnClickListener { downloadAllTracks(trackList) } - - } - - } - - - "episode" -> {showToast("Implementation Pending")} - "show" -> {showToast("Implementation Pending ")} } } - binding.spotifyLink.setText(sharedViewModel.intentString) - sharedViewModel.userName.observe(viewLifecycleOwner, Observer { - //Waiting for Authentication to Finish with Spotify - if (it != "Placeholder"){ - if(sharedViewModel.intentString != ""){binding.btnSearch.performClick()} - } - }) - + handleIntent() + if(savedInstanceState != null && binding.linkSearch.text.toString() != ""){ + binding.linkSearch.setText(savedInstanceState["searchLink"].toString()) + binding.btnSearch.performClick() + setUiVisibility() + } return binding.root } - private fun downloadAllTracks(trackList : List) { - sharedViewModel.uiScope.launch { - trackList.forEach { downloadTrack(sharedViewModel.ytDownloader,sharedViewModel.downloadManager,"${it.name} ${it.artists[0].name?:""}") } + private fun openSpotifyButton() { + val manager: PackageManager = requireActivity().packageManager + try { + i = manager.getLaunchIntentForPackage("com.spotify.music") + if (i == null) throw PackageManager.NameNotFoundException() + i?.addCategory(Intent.CATEGORY_LAUNCHER) + binding.btnOpenSpotify.setOnClickListener { startActivity(i) } + } catch (e: PackageManager.NameNotFoundException) { + binding.textView.text = getString(R.string.spotify_not_installed) + binding.btnOpenSpotify.text = getString(R.string.spotify_web_link) + val uri: Uri = + Uri.parse("http://open.spotify.com") + val intent = Intent(Intent.ACTION_VIEW, uri) + binding.btnOpenSpotify.setOnClickListener { + startActivity(intent) + } } } - private fun showToast(message:String){ + /** + * Configure Recycler View Adapter + **/ + private fun adapterConfig(trackList: List){ + adapter.trackList = trackList.toList() + adapter.totalItems = trackList.size + adapter.notifyDataSetChanged() + + } + + /** + * Make Ui elements Visible + **/ + private fun setUiVisibility() { + binding.btnDownloadAll.visibility =View.VISIBLE + binding.titleView.visibility = View.GONE + binding.openSpotify.visibility = View.GONE + binding.trackList.visibility = View.VISIBLE + } + + /** + * Handle Intent If there is any! + **/ + private fun handleIntent() { + binding.linkSearch.setText(sharedViewModel.intentString) + sharedViewModel.accessToken.observe(viewLifecycleOwner, Observer { + //Waiting for Authentication to Finish with Spotify + if (it != ""){ + if(sharedViewModel.intentString != ""){ + binding.btnSearch.performClick() + setUiVisibility() + } + } + }) + } + + /** + * Util. Function to create toasts! + **/ + fun showToast(message:String){ Toast.makeText(context,message,Toast.LENGTH_SHORT).show() } + private fun isOnline(): Boolean { + val cm = + requireActivity().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val netInfo = cm.activeNetworkInfo + return netInfo != null && netInfo.isConnectedOrConnecting + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putCharSequence("searchLink",mainViewModel.searchLink) + } } \ No newline at end of file diff --git a/app/src/main/java/com/shabinder/musicForEveryone/fragments/MainViewModel.kt b/app/src/main/java/com/shabinder/musicForEveryone/fragments/MainViewModel.kt new file mode 100644 index 00000000..0974b9d9 --- /dev/null +++ b/app/src/main/java/com/shabinder/musicForEveryone/fragments/MainViewModel.kt @@ -0,0 +1,11 @@ +package com.shabinder.musicForEveryone.fragments + +import androidx.lifecycle.ViewModel +import com.shabinder.musicForEveryone.models.Track + +class MainViewModel: ViewModel() { + var searchLink:String = "" + var trackList = mutableListOf() + var coverUrl:String = "" + +} \ No newline at end of file diff --git a/app/src/main/java/com/shabinder/musicForEveryone/recyclerView/TrackListAdapter.kt b/app/src/main/java/com/shabinder/musicForEveryone/recyclerView/TrackListAdapter.kt index e89b4f58..65a0cb58 100644 --- a/app/src/main/java/com/shabinder/musicForEveryone/recyclerView/TrackListAdapter.kt +++ b/app/src/main/java/com/shabinder/musicForEveryone/recyclerView/TrackListAdapter.kt @@ -10,8 +10,9 @@ import androidx.recyclerview.widget.RecyclerView import com.shabinder.musicForEveryone.R import com.shabinder.musicForEveryone.SharedViewModel import com.shabinder.musicForEveryone.downloadHelper.DownloadHelper +import com.shabinder.musicForEveryone.fragments.MainFragment +import com.shabinder.musicForEveryone.models.Track import com.shabinder.musicForEveryone.utils.bindImage -import kaaes.spotify.webapi.android.models.Track import kotlinx.coroutines.launch class TrackListAdapter:RecyclerView.Adapter(),DownloadHelper { @@ -19,6 +20,8 @@ class TrackListAdapter:RecyclerView.Adapter(),Downl var trackList = listOf() var totalItems:Int = 0 var sharedViewModel = SharedViewModel() + var isAlbum:Boolean = false + var mainFragment:MainFragment? = null override fun getItemCount():Int = totalItems @@ -31,16 +34,16 @@ class TrackListAdapter:RecyclerView.Adapter(),Downl override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = trackList[position] - if(totalItems == 1){holder.coverImage.visibility = View.GONE}else{ - bindImage(holder.coverImage,item.album.images[0].url) + if(totalItems == 1 || isAlbum){holder.coverImage.visibility = View.GONE}else{ + bindImage(holder.coverImage, item.album!!.images?.get(0)?.url) } - holder.trackName.text = "${if(item.name.length > 17){"${item.name.subSequence(0,16)}..."}else{item.name}}" - holder.artistName.text = "${item.artists[0]?.name?:""}..." + holder.trackName.text = "${if(item.name!!.length > 17){"${item.name!!.subSequence(0,16)}..."}else{item.name}}" + holder.artistName.text = "${item.artists?.get(0)?.name?:""}..." holder.duration.text = "${item.duration_ms/1000/60} minutes, ${(item.duration_ms/1000)%60} sec" holder.downloadBtn.setOnClickListener{ sharedViewModel.uiScope.launch { - downloadTrack(sharedViewModel.ytDownloader,sharedViewModel.downloadManager,"${item.name} ${item.artists[0].name?:""}") + downloadTrack(mainFragment,sharedViewModel.ytDownloader,sharedViewModel.downloadManager,"${item.name} ${item.artists?.get(0)!!.name?:""}") } } diff --git a/app/src/main/java/com/shabinder/musicForEveryone/utils/BindingAdapter.kt b/app/src/main/java/com/shabinder/musicForEveryone/utils/BindingAdapter.kt index 072b990c..04b7d209 100644 --- a/app/src/main/java/com/shabinder/musicForEveryone/utils/BindingAdapter.kt +++ b/app/src/main/java/com/shabinder/musicForEveryone/utils/BindingAdapter.kt @@ -7,17 +7,15 @@ import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.shabinder.musicForEveryone.R - @BindingAdapter("imageUrl") fun bindImage(imgView: ImageView, imgUrl: String?) { - - imgUrl?.let { - val imgUri = imgUrl.toUri().buildUpon().scheme("https").build() - Glide.with(imgView.context) - .load(imgUri) - .apply(RequestOptions() - .error(R.drawable.ic_musicplaceholder)) - .into(imgView) - } - + imgUrl?.let { + val imgUri = imgUrl.toUri().buildUpon().scheme("https").build() + Glide.with(imgView.context) + .load(imgUri) + .apply(RequestOptions() + .placeholder(R.drawable.ic_song_placeholder) + .error(R.drawable.ic_musicplaceholder)) + .into(imgView) + } } \ No newline at end of file diff --git a/app/src/main/java/com/shabinder/musicForEveryone/utils/SpotifyNewService.kt b/app/src/main/java/com/shabinder/musicForEveryone/utils/SpotifyNewService.kt deleted file mode 100644 index 05214aee..00000000 --- a/app/src/main/java/com/shabinder/musicForEveryone/utils/SpotifyNewService.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.shabinder.musicForEveryone.utils - -import kaaes.spotify.webapi.android.models.* -import retrofit2.http.GET -import retrofit2.http.Path - - -interface SpotifyNewService { - - @GET("playlists/{playlist_id}") - suspend fun getPlaylist(@Path("playlist_id") playlistId: String?): Playlist? - - @GET("tracks/{id}") - suspend fun getTrack(@Path("id") var1: String?): Track? - - @GET("albums/{id}") - suspend fun getAlbum(@Path("id") var1: String?): Album? - - @GET("me") - suspend fun getMe(): com.shabinder.musicForEveryone.utils.UserPrivate? - - -} - -data class UserPrivate( - val country:String, - var display_name: String, - val email:String, - var external_urls: Map? = null, - var followers: Followers? = null, - var href: String? = null, - var id: String? = null, - var images: List? = null, - var product:String, - var type: String? = null, - var uri: String? = null) \ No newline at end of file diff --git a/app/src/main/java/com/shabinder/musicForEveryone/utils/SpotifyService.kt b/app/src/main/java/com/shabinder/musicForEveryone/utils/SpotifyService.kt new file mode 100644 index 00000000..bbe572cd --- /dev/null +++ b/app/src/main/java/com/shabinder/musicForEveryone/utils/SpotifyService.kt @@ -0,0 +1,35 @@ +package com.shabinder.musicForEveryone.utils + +import com.shabinder.musicForEveryone.models.* +import retrofit2.http.* + + +interface SpotifyService { + + @GET("playlists/{playlist_id}") + suspend fun getPlaylist(@Path("playlist_id") playlistId: String?): Playlist? + + @GET("tracks/{id}") + suspend fun getTrack(@Path("id") var1: String?): Track? + + @GET("episodes/{id}") + suspend fun getEpisode(@Path("id") var1: String?): Track? + + @GET("shows/{id}") + suspend fun getShow(@Path("id") var1: String?): Track? + + @GET("albums/{id}") + suspend fun getAlbum(@Path("id") var1: String?): Album? + + @GET("me") + suspend fun getMe(): UserPrivate? + +} + +interface SpotifyServiceToken{ + + @POST("api/token") + @FormUrlEncoded + suspend fun getToken(@Field("grant_type") grant_type:String = "client_credentials"):Token? + +} diff --git a/app/src/main/java/com/shabinder/musicForEveryone/utils/YoutubeInterface.kt b/app/src/main/java/com/shabinder/musicForEveryone/utils/YoutubeInterface.kt index 6fccea55..ba1e9955 100644 --- a/app/src/main/java/com/shabinder/musicForEveryone/utils/YoutubeInterface.kt +++ b/app/src/main/java/com/shabinder/musicForEveryone/utils/YoutubeInterface.kt @@ -10,10 +10,8 @@ import java.io.IOException object YoutubeInterface { private var youtube: YouTube? = null private var query:YouTube.Search.List? = null - var apiKey:String = "AIzaSyDuRmMA_2mF56BjlhhNpa0SIbjMgjjFaEI" - var apiKey2:String = "AIzaSyCotyqgqmz5qw4-IH0tiezIrIIDHLI2yNs" - - var clientID : String = "1040727735015-er2mvvljt45cabkuqimsh3iabqvfpvms.apps.googleusercontent.com" + private var apiKey:String = "AIzaSyDuRmMA_2mF56BjlhhNpa0SIbjMgjjFaEI" + private var apiKey2:String = "AIzaSyCotyqgqmz5qw4-IH0tiezIrIIDHLI2yNs" fun youtubeConnector() { youtube =