diff --git a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java index a1b5622d9..5093bc2be 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java @@ -1658,12 +1658,6 @@ public abstract class BaseMainActivity extends BaseActivity fragmentManager.beginTransaction() .replace(R.id.main_app_container, displayFavoritesPeertubeFragment, fragmentTag).commit(); toot.hide(); - }else if (id == R.id.nav_peertube_fav) { - DisplayFavoritesPeertubeFragment displayFavoritesPeertubeFragment = new DisplayFavoritesPeertubeFragment(); - fragmentTag = "BOOKMARKS_PEERTUBE"; - fragmentManager.beginTransaction() - .replace(R.id.main_app_container, displayFavoritesPeertubeFragment, fragmentTag).commit(); - toot.hide(); }else if( id == R.id.nav_follow_request){ toot.hide(); DisplayFollowRequestSentFragment followRequestSentFragment = new DisplayFollowRequestSentFragment(); diff --git a/app/src/main/java/app/fedilab/android/activities/PeertubeActivity.java b/app/src/main/java/app/fedilab/android/activities/PeertubeActivity.java index ce2221468..91652c25d 100644 --- a/app/src/main/java/app/fedilab/android/activities/PeertubeActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/PeertubeActivity.java @@ -32,10 +32,12 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; +import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.widget.AppCompatImageView; import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.Html; @@ -72,25 +74,32 @@ import com.google.android.exoplayer2.util.Util; import java.lang.ref.WeakReference; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import javax.net.ssl.HttpsURLConnection; +import app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask; import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Peertube; +import app.fedilab.android.client.Entities.Playlist; import app.fedilab.android.client.Entities.Status; import app.fedilab.android.client.TLSSocketFactory; import app.fedilab.android.drawers.StatusListAdapter; +import app.fedilab.android.fragments.DisplayStatusFragment; import app.fedilab.android.helper.CrossActions; import app.fedilab.android.helper.FullScreenMediaController; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnPlaylistActionInterface; import app.fedilab.android.sqlite.AccountDAO; +import app.fedilab.android.sqlite.InstancesDAO; import app.fedilab.android.sqlite.PeertubeFavoritesDAO; import app.fedilab.android.sqlite.Sqlite; +import app.fedilab.android.sqlite.TimelinesDAO; import app.fedilab.android.webview.MastalabWebChromeClient; import app.fedilab.android.webview.MastalabWebViewClient; import es.dmoral.toasty.Toasty; @@ -103,6 +112,10 @@ import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnRetrievePeertubeInterface; +import static app.fedilab.android.activities.BaseMainActivity.mPageReferenceMap; +import static app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask.action.GET_LIST_VIDEOS; +import static app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask.action.GET_PLAYLIST; +import static app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask.action.GET_PLAYLIST_FOR_VIDEO; import static app.fedilab.android.helper.Helper.changeDrawableColor; @@ -111,12 +124,12 @@ import static app.fedilab.android.helper.Helper.changeDrawableColor; * Peertube activity */ -public class PeertubeActivity extends BaseActivity implements OnRetrievePeertubeInterface, OnPostActionInterface { +public class PeertubeActivity extends BaseActivity implements OnRetrievePeertubeInterface, OnPostActionInterface, OnPlaylistActionInterface { private String peertubeInstance, videoId; private FullScreenMediaController.fullscreen fullscreen; private RelativeLayout loader; - private TextView peertube_view_count, peertube_bookmark, peertube_like_count, peertube_dislike_count, peertube_share, peertube_download, peertube_description, peertube_title; + private TextView peertube_view_count, peertube_playlist, peertube_bookmark, peertube_like_count, peertube_dislike_count, peertube_share, peertube_download, peertube_description, peertube_title; private ScrollView peertube_information_container; private int stopPosition; private Peertube peertube; @@ -135,7 +148,8 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube private TextView add_comment_read; private EditText add_comment_write; private String instance; - + private List playlistForVideo; + private List playlists; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -156,6 +170,7 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube setTheme(R.style.AppThemeDark); } fullScreenMode = false; + playlistForVideo = new ArrayList<>(); setContentView(R.layout.activity_peertube); loader = findViewById(R.id.loader); peertube_view_count = findViewById(R.id.peertube_view_count); @@ -173,6 +188,7 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube my_pp = findViewById(R.id.my_pp); add_comment_read = findViewById(R.id.add_comment_read); add_comment_write = findViewById(R.id.add_comment_write); + peertube_playlist = findViewById(R.id.peertube_playlist); send = findViewById(R.id.send); add_comment_read.setOnClickListener(new View.OnClickListener() { @Override @@ -189,6 +205,10 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube if( MainActivity.social != UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE){ write_comment_container.setVisibility(View.GONE); } + if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE){ + peertube_playlist.setVisibility(View.VISIBLE); + peertube_bookmark.setVisibility(View.GONE); + } send.setOnClickListener(new View.OnClickListener() { @Override @@ -204,6 +224,7 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube } } }); + SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); instance = sharedpreferences.getString(Helper.PREF_INSTANCE, Helper.getLiveInstance(getApplicationContext())); @@ -296,7 +317,9 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube initFullscreenButton(); } - + if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE){ + new ManagePlaylistsAsyncTask(PeertubeActivity.this,GET_PLAYLIST, null, null, null , PeertubeActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } new RetrievePeertubeSingleAsyncTask(PeertubeActivity.this, peertubeInstance, videoId, PeertubeActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -475,6 +498,66 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube } peertube = apiResponse.getPeertubes().get(0); + + if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE){ + new ManagePlaylistsAsyncTask(PeertubeActivity.this,GET_PLAYLIST_FOR_VIDEO, null, peertube.getId(), null , PeertubeActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + + + peertube_playlist.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if( playlists != null && peertube.getId() != null) { + PopupMenu popup = new PopupMenu(PeertubeActivity.this, peertube_playlist); + + for(Playlist playlist: playlists){ + String title = null; + for (String id : playlistForVideo) { + if (playlist.getId().equals(id)) { + title = "✔ " + playlist.getDisplayName(); + break; + } + } + if( title == null){ + title = playlist.getDisplayName(); + } + MenuItem item = popup.getMenu().add(0, 0, Menu.NONE, title); + item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); + item.setActionView(new View(getApplicationContext())); + item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() { + @Override + public boolean onMenuItemActionExpand(MenuItem item) { + return false; + } + + @Override + public boolean onMenuItemActionCollapse(MenuItem item) { + return false; + } + }); + if(playlistForVideo.contains(playlist.getId())){ + item.setTitle(playlist.getDisplayName()); + new ManagePlaylistsAsyncTask(PeertubeActivity.this,ManagePlaylistsAsyncTask.action.DELETE_VIDEOS, playlist, peertube.getId(), null , PeertubeActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + playlistForVideo.remove(playlist.getId()); + }else{ + item.setTitle( "✔ " + playlist.getDisplayName()); + new ManagePlaylistsAsyncTask(PeertubeActivity.this,ManagePlaylistsAsyncTask.action.ADD_VIDEOS, playlist, peertube.getId(), null , PeertubeActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + playlistForVideo.add(playlist.getId()); + } + return false; + } + }); + popup.show(); + } + } + } + }); + + + if( peertube.isCommentsEnabled()) { new RetrievePeertubeSingleCommentsAsyncTask(PeertubeActivity.this, peertubeInstance, videoId, PeertubeActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); if( MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE) @@ -870,4 +953,14 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube peertube_like_count.setCompoundDrawablesWithIntrinsicBounds( null, thumbUp, null, null); peertube_dislike_count.setCompoundDrawablesWithIntrinsicBounds( null, thumbDown, null, null); } + + @Override + public void onActionDone(ManagePlaylistsAsyncTask.action actionType, APIResponse apiResponse, int statusCode) { + + if( actionType == GET_PLAYLIST_FOR_VIDEO && apiResponse != null) { + playlistForVideo = apiResponse.getPlaylistForVideos(); + }else if( actionType == GET_PLAYLIST && apiResponse != null){ + playlists = apiResponse.getPlaylists(); + } + } } diff --git a/app/src/main/java/app/fedilab/android/asynctasks/ManagePlaylistsAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/ManagePlaylistsAsyncTask.java index 7fdf05cff..da23e5dc5 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/ManagePlaylistsAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/ManagePlaylistsAsyncTask.java @@ -20,6 +20,7 @@ import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import java.lang.ref.WeakReference; +import java.util.List; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; @@ -45,7 +46,8 @@ public class ManagePlaylistsAsyncTask extends AsyncTask { DELETE_PLAYLIST, UPDATE_PLAYLIST, ADD_VIDEOS, - DELETE_VIDEOS + DELETE_VIDEOS, + GET_PLAYLIST_FOR_VIDEO, } private OnPlaylistActionInterface listener; @@ -84,6 +86,8 @@ public class ManagePlaylistsAsyncTask extends AsyncTask { statusCode = new PeertubeAPI(contextReference.get()).addVideoPlaylist(playlist.getId(),videoId); }else if(apiAction == action.DELETE_VIDEOS){ statusCode = new PeertubeAPI(contextReference.get()).deleteVideoPlaylist(playlist.getId(),videoId); + }else if(apiAction == action.GET_PLAYLIST_FOR_VIDEO){ + apiResponse = new PeertubeAPI(contextReference.get()).getPlaylistForVideo(videoId); } return null; } diff --git a/app/src/main/java/app/fedilab/android/client/APIResponse.java b/app/src/main/java/app/fedilab/android/client/APIResponse.java index 965e5bea3..228382c48 100644 --- a/app/src/main/java/app/fedilab/android/client/APIResponse.java +++ b/app/src/main/java/app/fedilab/android/client/APIResponse.java @@ -61,6 +61,7 @@ public class APIResponse { private Instance instance; private List storedStatuses; private boolean fetchmore = false; + private List playlistForVideos; public List getAccounts() { return accounts; @@ -229,4 +230,12 @@ public class APIResponse { public void setPlaylists(List playlists) { this.playlists = playlists; } + + public List getPlaylistForVideos() { + return playlistForVideos; + } + + public void setPlaylistForVideos(List playlistForVideos) { + this.playlistForVideos = playlistForVideos; + } } diff --git a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java index b819ffc8b..2dc164c09 100644 --- a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java +++ b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java @@ -17,7 +17,6 @@ package app.fedilab.android.client; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; -import android.util.Log; import org.json.JSONArray; import org.json.JSONException; @@ -1340,6 +1339,46 @@ public class PeertubeAPI { } + /** + * Video is in play lists + * @return APIResponse + */ + public APIResponse getPlaylistForVideo(String videoId){ + + HashMap params = new HashMap<>(); + params.put("videoIds",videoId); + List ids = new ArrayList<>(); + try { + String response = new HttpsConnection(context, this.instance).get(getAbsoluteUrl("/users/me/video-playlists/videos-exist"), 60, params, prefKeyOauthTokenT); + + JSONArray jsonArray = new JSONObject(response).getJSONArray(videoId); + try { + int i = 0; + while (i < jsonArray.length() ) { + JSONObject resobj = jsonArray.getJSONObject(i); + String playlistId = resobj.getString("playlistId"); + ids.add(playlistId); + i++; + } + } catch (JSONException e) { + setDefaultError(e); + } + } catch (HttpsConnection.HttpsConnectionException e) { + setError(e.getStatusCode(), e); + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (KeyManagementException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + apiResponse = new APIResponse(); + apiResponse.setPlaylistForVideos(ids); + return apiResponse; + } /** @@ -1431,6 +1470,7 @@ public class PeertubeAPI { actionCode = httpsConnection.getActionCode(); } catch (HttpsConnection.HttpsConnectionException e) { setError(e.getStatusCode(), e); + e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (IOException e) { diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayPlaylistsFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayPlaylistsFragment.java index 7d495e5a4..bbc05c0f5 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayPlaylistsFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayPlaylistsFragment.java @@ -16,7 +16,6 @@ package app.fedilab.android.fragments; import android.annotation.SuppressLint; import android.app.Activity; -import android.app.PendingIntent; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -29,7 +28,6 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AlertDialog; import android.text.InputFilter; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -46,14 +44,8 @@ import com.jaredrummler.materialspinner.MaterialSpinner; import net.gotev.uploadservice.MultipartUploadRequest; import net.gotev.uploadservice.ServerResponse; import net.gotev.uploadservice.UploadInfo; -import net.gotev.uploadservice.UploadNotificationAction; import net.gotev.uploadservice.UploadNotificationConfig; import net.gotev.uploadservice.UploadStatusDelegate; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.FileNotFoundException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.HashMap; @@ -63,11 +55,7 @@ import java.util.List; import java.util.Map; import app.fedilab.android.R; -import app.fedilab.android.activities.BaseMainActivity; -import app.fedilab.android.activities.ListActivity; import app.fedilab.android.activities.MainActivity; -import app.fedilab.android.activities.PeertubeEditUploadActivity; -import app.fedilab.android.activities.PeertubeUploadActivity; import app.fedilab.android.activities.PlaylistsActivity; import app.fedilab.android.asynctasks.ManagePlaylistsAsyncTask; import app.fedilab.android.asynctasks.RetrievePeertubeChannelsAsyncTask; diff --git a/app/src/main/res/drawable/ic_list_peertube_activity.xml b/app/src/main/res/drawable/ic_list_peertube_activity.xml new file mode 100644 index 000000000..fd7111d5d --- /dev/null +++ b/app/src/main/res/drawable/ic_list_peertube_activity.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_peertube.xml b/app/src/main/res/layout/activity_peertube.xml index 243e94311..6eed34f91 100644 --- a/app/src/main/res/layout/activity_peertube.xml +++ b/app/src/main/res/layout/activity_peertube.xml @@ -58,7 +58,7 @@ - + + android:padding="15dp"> + android:id="@+id/nav_peertube_playlists" + android:icon="@drawable/ic_list_peertube" + android:title="@string/playlists" /> - +