Skip to content

Commit

Permalink
Merge pull request #29 from batshalregmi/playback
Browse files Browse the repository at this point in the history
Playback
  • Loading branch information
batshalregmi authored Apr 12, 2024
2 parents 5bf9a83 + 8d02d13 commit 422400f
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 4 deletions.
6 changes: 6 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ dependencies {
implementation libs.navigation.fragment
implementation libs.navigation.ui
implementation libs.activity
implementation libs.androidx.media3.common
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
Expand All @@ -51,6 +52,11 @@ dependencies {
implementation 'com.google.firebase:firebase-analytics'
implementation "com.google.firebase:firebase-auth"

implementation libs.media3.exoplayer
implementation libs.androidx.media3.exoplayer.dash
implementation libs.androidx.media3.ui


def room_version = "2.6.1"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.media3.exoplayer.ExoPlayer;

import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.group3.spotifywrapped.R;
import com.group3.spotifywrapped.utils.Playback;

public class MainPageActivity extends AppCompatActivity {

Expand All @@ -21,6 +23,25 @@ protected void onCreate(Bundle savedInstanceState) {
String message = (String) welcomeMessage.getText();
//welcomeMessage.setText(message.replace("{{USER}}", username));

Playback playback = new Playback(this);
playback.startMedia();

BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigation);
bottomNavigationView.setOnNavigationItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.bottom_wrapped:

break;

case R.id.bottom_settings:
Intent intent1 = new Intent(MainPageActivity.this, SettingsActivity.class);
startActivity(intent1);
break;
}


return false;
});

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.View;

import com.group3.spotifywrapped.utils.SpotifyApiHelper;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ public static Track parseFromJSON(JSONObject src) {
try {
temp.spotifyId = src.getString("id");
temp.name = src.getString("name");
temp.setImageUrl(src.getJSONObject("album").getJSONArray("images").getJSONObject(0).getString("url"));
return temp;
} catch (JSONException e) {
Log.e(TAG, "Failed to parse Track from JSON: " + e.toString());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.group3.spotifywrapped.summary;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.media.Image;
import android.os.Bundle;
import android.text.Layout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
Expand All @@ -13,6 +17,7 @@

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
Expand All @@ -26,17 +31,20 @@
import com.group3.spotifywrapped.database.Artist;
import com.group3.spotifywrapped.database.FirebaseHelper;
import com.group3.spotifywrapped.database.SpotifyItem;
import com.group3.spotifywrapped.database.Track;
import com.group3.spotifywrapped.utils.Playback;

import java.util.HashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

public class SummaryActivity extends AppCompatActivity {
public static AtomicBoolean foundArtists = new AtomicBoolean(false);
public static AtomicBoolean foundTracks = new AtomicBoolean(false);

private static final String TAG = "SummaryActivity";
private SpotifyItemAdapter artistAdapter;
private SpotifyItemAdapter trackAdapter;
private Playback player;

private class MyViewHolder extends RecyclerView.ViewHolder {
private TextView songNameView;
Expand Down Expand Up @@ -66,10 +74,25 @@ public SummaryActivity.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent
}

@Override
public void onBindViewHolder(@NonNull SummaryActivity.MyViewHolder holder, int position) {
public void onBindViewHolder(@NonNull SummaryActivity.MyViewHolder holder, @SuppressLint("RecyclerView") int position) {
holder.songNameView.setText(items.get(position).name);
holder.songNumberView.setText(Integer.toString(position + 1));
holder.albumCoverView.setImageDrawable(items.get(position).getImage());

try {
holder.albumCoverView.setOnClickListener(new View.OnClickListener() {
Track track = (Track) items.get(position);
String previewUrl = player.getTrackURL(track.spotifyId);

@Override
public void onClick(View v) {
Log.d("TEST", "MSG: " + previewUrl);
player.playSong(previewUrl);
}
});
} catch (Exception e) {
Log.d("Exception", e.getMessage());
}
}

@Override
Expand All @@ -83,11 +106,12 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summary);

player = new Playback(this);

Button backButton = findViewById(R.id.backButton);
backButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SummarySelectorActivity.setSelectedSummaryEntry(null);
Intent i = new Intent(SummaryActivity.this, SummarySelectorActivity.class);
startActivity(i);
}
Expand Down
57 changes: 57 additions & 0 deletions app/src/main/java/com/group3/spotifywrapped/utils/Playback.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.group3.spotifywrapped.utils;

import android.content.Context;

import androidx.media3.common.MediaItem;
import androidx.media3.exoplayer.ExoPlayer;

import com.group3.spotifywrapped.CoreAppViews.LoginActivity;

import org.json.JSONObject;

import java.util.List;

public class Playback {
UserTrackHistory uth;
ExoPlayer player;

public Playback(Context context) {
player = new ExoPlayer.Builder(context).build();
uth = new UserTrackHistory();
}

public void playSong(String url) {
player.stop();
player.clearMediaItems();
player.addMediaItem(MediaItem.fromUri(url));
player.prepare();
player.play();
}

private void initQueue() {
uth.retrieveHistory();
List<String> trackIDs = uth.getTrackIDs();

// Makes a ton of API calls might need to limit this
for (String trackID : trackIDs) {
if (trackID != null) {
player.addMediaItem(MediaItem.fromUri(getTrackURL(trackID)));
}
}
}

public String getTrackURL(String trackID) {
try {
JSONObject response = SpotifyApiHelper.callSpotifyApi("/tracks/" + trackID, LoginActivity.token, "GET");
return response.getString("preview_url");
} catch (Exception e) {
return null;
}
}

public void startMedia() {
initQueue();
player.prepare();
player.play();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,12 @@ public int size() {
public String toString() {
return trackHistory.toString();
}

public List<String> getTrackIDs() {
ArrayList<String> trackIDs = new ArrayList<>();
for (TrackHistoryItem item : trackHistory) {
trackIDs.add(item.id);
}
return trackIDs;
}
}
2 changes: 2 additions & 0 deletions app/src/main/res/layout/item_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/view_card"
android:layout_width="match_parent"
android:layout_height="wrap_content">

Expand Down Expand Up @@ -33,4 +34,5 @@
app:layout_constraintStart_toEndOf="@+id/song_number_text_view"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/avatars" />

</androidx.constraintlayout.widget.ConstraintLayout>
6 changes: 6 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,30 @@ espressoCore = "3.5.1"
appcompat = "1.6.1"
material = "1.10.0"
constraintlayout = "2.1.4"
media3Exoplayer = "1.3.1"
navigationFragment = "2.6.0"
navigationUi = "2.6.0"
activity = "1.8.0"
roomRuntime = "2.6.1"
roomCompiler = "2.6.1"
media3Common = "1.3.1"

[libraries]
androidx-media3-exoplayer-dash = { module = "androidx.media3:media3-exoplayer-dash", version.ref = "media3Exoplayer" }
androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3Exoplayer" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3Exoplayer" }
navigation-fragment = { group = "androidx.navigation", name = "navigation-fragment", version.ref = "navigationFragment" }
navigation-ui = { group = "androidx.navigation", name = "navigation-ui", version.ref = "navigationUi" }
activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "roomRuntime" }
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "roomCompiler" }
androidx-media3-common = { group = "androidx.media3", name = "media3-common", version.ref = "media3Common" }

[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
Expand Down

0 comments on commit 422400f

Please sign in to comment.