From c714e6a6250261e8e128288b7dc1dd5f7d828cb4 Mon Sep 17 00:00:00 2001 From: Thomas Date: Fri, 11 Sep 2020 19:10:54 +0200 Subject: [PATCH] Allow to edit channel and playlists --- .../fedilabtube/client/PeertubeAPI.java | 23 +++ .../client/entities/ChannelCreation.java | 9 + .../drawer/AccountsListAdapter.java | 85 ++++++++- .../fragment/DisplayAccountsFragment.java | 172 ++++++++++-------- .../fragment/DisplayPlaylistsFragment.java | 13 +- app/src/main/res/layout/drawer_account.xml | 9 + 6 files changed, 218 insertions(+), 93 deletions(-) diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeAPI.java b/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeAPI.java index f1d543c..5090952 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeAPI.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeAPI.java @@ -31,6 +31,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; +import java.text.Format; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; @@ -874,6 +875,28 @@ public class PeertubeAPI { } } + /** + * Update a channel fot the authenticated user + * + * @param acct String + * @param channelCreation ChannelCreation + */ + public void updateChannel(String acct, ChannelCreation channelCreation) throws HttpsConnection.HttpsConnectionException { + actionCode = -1; + try { + HashMap params = new HashMap<>(); + params.put("displayName", channelCreation.getDisplayName()); + params.put("name", channelCreation.getName()); + params.put("description", channelCreation.getDescription()); + params.put("support", channelCreation.getSupport()); + HttpsConnection httpsConnection = new HttpsConnection(context); + httpsConnection.put(getAbsoluteUrl(String.format("/video-channels/%s", acct)), 30, params, prefKeyOauthTokenT); + actionCode = httpsConnection.getActionCode(); + } catch (NoSuchAlgorithmException | IOException | KeyManagementException e) { + e.printStackTrace(); + } + } + /** * Delete a Channel * diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/entities/ChannelCreation.java b/app/src/main/java/app/fedilab/fedilabtube/client/entities/ChannelCreation.java index 68b8cb6..bac244a 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/entities/ChannelCreation.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/entities/ChannelCreation.java @@ -16,11 +16,20 @@ package app.fedilab.fedilabtube.client.entities; * see . */ public class ChannelCreation { + private String id; private String displayName; private String name; private String description; private String support; + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + public String getDisplayName() { return displayName; } diff --git a/app/src/main/java/app/fedilab/fedilabtube/drawer/AccountsListAdapter.java b/app/src/main/java/app/fedilab/fedilabtube/drawer/AccountsListAdapter.java index a3d9061..567e209 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/drawer/AccountsListAdapter.java +++ b/app/src/main/java/app/fedilab/fedilabtube/drawer/AccountsListAdapter.java @@ -26,6 +26,7 @@ import android.text.util.Linkify; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -33,6 +34,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.PopupMenu; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ViewModelProvider; @@ -43,6 +45,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.List; +import app.fedilab.fedilabtube.AccountActivity; import app.fedilab.fedilabtube.R; import app.fedilab.fedilabtube.ShowAccountActivity; import app.fedilab.fedilabtube.client.APIResponse; @@ -59,6 +62,7 @@ import es.dmoral.toasty.Toasty; public class AccountsListAdapter extends RecyclerView.Adapter { public AllAccountsRemoved allAccountsRemoved; + public EditAlertDialog editAlertDialog; private List accounts; private Context context; private AccountsListAdapter accountsListAdapter; @@ -83,7 +87,8 @@ public class AccountsListAdapter extends RecyclerView.Adapter { @@ -99,15 +104,10 @@ public class AccountsListAdapter extends RecyclerView.Adapter { - DisplayPlaylistsFragment displayPlaylistsFragment; - if (context == null) - return; - displayPlaylistsFragment = (DisplayPlaylistsFragment) ((AppCompatActivity) context).getSupportFragmentManager().findFragmentByTag("CHANNELS"); - final FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction(); - if (displayPlaylistsFragment != null) { - ft.detach(displayPlaylistsFragment); - ft.attach(displayPlaylistsFragment); - ft.commit(); + accounts.remove(account); + notifyDataSetChanged(); + if (accounts.size() == 0) { + allAccountsRemoved.onAllAccountsRemoved(); } }; mainHandler.post(myRunnable); @@ -169,6 +169,65 @@ public class AccountsListAdapter extends RecyclerView.Adapter { + PopupMenu popup = new PopupMenu(context, holder.more_actions); + popup.getMenuInflater() + .inflate(R.menu.playlist_menu, popup.getMenu()); + popup.setOnMenuItemClickListener(item -> { + switch (item.getItemId()) { + case R.id.action_delete: + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(context.getString(R.string.action_channel_delete) + ": " + account.getAcct()); + builder.setMessage(context.getString(R.string.action_channel_confirm_delete)); + builder.setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton(R.string.yes, (dialog, which) -> { + accounts.remove(account); + notifyDataSetChanged(); + new Thread(() -> { + try { + new PeertubeAPI(context).deleteChannel(account.getAcct()); + Handler mainHandler = new Handler(Looper.getMainLooper()); + Runnable myRunnable = () -> { + DisplayPlaylistsFragment displayPlaylistsFragment; + if (context == null) + return; + displayPlaylistsFragment = (DisplayPlaylistsFragment) ((AppCompatActivity) context).getSupportFragmentManager().findFragmentByTag("CHANNELS"); + final FragmentTransaction ft = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction(); + if (displayPlaylistsFragment != null) { + ft.detach(displayPlaylistsFragment); + ft.attach(displayPlaylistsFragment); + ft.commit(); + } + }; + mainHandler.post(myRunnable); + } catch (HttpsConnection.HttpsConnectionException e) { + e.printStackTrace(); + Handler mainHandler = new Handler(Looper.getMainLooper()); + Runnable myRunnable = () -> { + if (e.getMessage() != null) { + Toasty.error(context, e.getMessage(), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); + } + }; + mainHandler.post(myRunnable); + } + }).start(); + dialog.dismiss(); + }) + .setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss()) + .show(); + break; + case R.id.action_edit: + if (context instanceof AccountActivity) { + editAlertDialog.show(account); + } + break; + } + return true; + }); + popup.show(); + }); holder.account_pp.setOnClickListener(v -> { Intent intent = new Intent(context, ShowAccountActivity.class); @@ -243,6 +302,10 @@ public class AccountsListAdapter extends RecyclerView.Adapter { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context); - LayoutInflater inflater1 = ((Activity) context).getLayoutInflater(); - View dialogView = inflater1.inflate(R.layout.add_channel, new LinearLayout(context), false); - dialogBuilder.setView(dialogView); - EditText display_name = dialogView.findViewById(R.id.display_name); - EditText name = dialogView.findViewById(R.id.name); - EditText description = dialogView.findViewById(R.id.description); - dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> { - if (display_name.getText() != null && display_name.getText().toString().trim().length() > 0 && name.getText() != null && name.getText().toString().trim().length() > 0) { - - ChannelCreation channelCreation = new ChannelCreation(); - channelCreation.setDisplayName(display_name.getText().toString().trim()); - channelCreation.setName(name.getText().toString().trim()); - if (description.getText() != null && description.getText().toString().trim().length() > 0) { - channelCreation.setDescription(description.getText().toString().trim()); - } - new Thread(() -> { - try { - new PeertubeAPI(context).createChannel(channelCreation); - Handler mainHandler = new Handler(Looper.getMainLooper()); - Runnable myRunnable = () -> { - DisplayPlaylistsFragment displayPlaylistsFragment; - if (getActivity() == null) - return; - displayPlaylistsFragment = (DisplayPlaylistsFragment) getActivity().getSupportFragmentManager().findFragmentByTag("CHANNELS"); - final FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); - if (displayPlaylistsFragment != null) { - ft.detach(displayPlaylistsFragment); - ft.attach(displayPlaylistsFragment); - ft.commit(); - } - action_button.setEnabled(true); - }; - mainHandler.post(myRunnable); - } catch (HttpsConnection.HttpsConnectionException e) { - action_button.setEnabled(true); - e.printStackTrace(); - Handler mainHandler = new Handler(Looper.getMainLooper()); - Runnable myRunnable = () -> { - if (e.getMessage() != null) { - Toasty.error(context, e.getMessage(), Toast.LENGTH_LONG).show(); - } else { - Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); - } - }; - mainHandler.post(myRunnable); - } - }).start(); - - dialog.dismiss(); - action_button.setEnabled(false); - } else { - Toasty.error(context, context.getString(R.string.error_display_name_channel), Toast.LENGTH_LONG).show(); - } - - }); - dialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss()); - - - AlertDialog alertDialog = dialogBuilder.create(); - alertDialog.setTitle(getString(R.string.action_channel_create)); - alertDialog.setOnDismissListener(dialogInterface -> { - //Hide keyboard - InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); - assert imm != null; - imm.hideSoftInputFromWindow(display_name.getWindowToken(), 0); - }); - if (alertDialog.getWindow() != null) - alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); - alertDialog.show(); - }); + action_button.setOnClickListener(view -> manageAlert(null)); } lv_accounts = rootView.findViewById(R.id.lv_elements); lv_accounts.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.VERTICAL)); @@ -179,6 +108,7 @@ public class DisplayAccountsFragment extends Fragment implements AccountsListAda nextElementLoader.setVisibility(View.GONE); accountsListAdapter = new AccountsListAdapter(accountFetch, this.accounts); accountsListAdapter.allAccountsRemoved = this; + accountsListAdapter.editAlertDialog = this; lv_accounts.setAdapter(accountsListAdapter); TextView no_action_text = rootView.findViewById(R.id.no_action_text); if (accountFetch == AccountsVM.accountFetch.MUTED) { @@ -312,4 +242,98 @@ public class DisplayAccountsFragment extends Fragment implements AccountsListAda public void onAllAccountsRemoved() { textviewNoAction.setVisibility(View.VISIBLE); } + + + public void manageAlert(ChannelCreation oldChannelValues) { + + AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context); + LayoutInflater inflater1 = ((Activity) context).getLayoutInflater(); + View dialogView = inflater1.inflate(R.layout.add_channel, new LinearLayout(context), false); + dialogBuilder.setView(dialogView); + EditText display_name = dialogView.findViewById(R.id.display_name); + EditText name = dialogView.findViewById(R.id.name); + EditText description = dialogView.findViewById(R.id.description); + if (oldChannelValues != null) { + display_name.setText(oldChannelValues.getDisplayName()); + name.setText(oldChannelValues.getName()); + description.setText(oldChannelValues.getDescription()); + } + dialogBuilder.setPositiveButton(R.string.validate, (dialog, id) -> { + if (display_name.getText() != null && display_name.getText().toString().trim().length() > 0 && name.getText() != null && name.getText().toString().trim().length() > 0) { + + ChannelCreation channelCreation = new ChannelCreation(); + channelCreation.setDisplayName(display_name.getText().toString().trim()); + channelCreation.setName(name.getText().toString().trim()); + if (description.getText() != null && description.getText().toString().trim().length() > 0) { + channelCreation.setDescription(description.getText().toString().trim()); + } + new Thread(() -> { + try { + if (oldChannelValues == null) { + new PeertubeAPI(context).createChannel(channelCreation); + } else { + new PeertubeAPI(context).updateChannel(name + "@" + Helper.getLiveInstance(context), channelCreation); + } + Handler mainHandler = new Handler(Looper.getMainLooper()); + Runnable myRunnable = () -> { + + if (getActivity() == null) + return; + Account channel = new Account(); + channel.setAcct(channelCreation.getName() + "@" + Helper.getLiveInstance(context)); + channel.setUsername(channelCreation.getName()); + channel.setDisplay_name(channelCreation.getDisplayName()); + channel.setNote(channelCreation.getDescription()); + accounts.add(0, channel); + accountsListAdapter.notifyItemInserted(0); + action_button.setEnabled(true); + }; + mainHandler.post(myRunnable); + } catch (HttpsConnection.HttpsConnectionException e) { + + e.printStackTrace(); + Handler mainHandler = new Handler(Looper.getMainLooper()); + Runnable myRunnable = () -> { + action_button.setEnabled(true); + if (e.getMessage() != null) { + Toasty.error(context, e.getMessage(), Toast.LENGTH_LONG).show(); + } else { + Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show(); + } + }; + mainHandler.post(myRunnable); + } + }).start(); + + dialog.dismiss(); + action_button.setEnabled(false); + } else { + Toasty.error(context, context.getString(R.string.error_display_name_channel), Toast.LENGTH_LONG).show(); + } + + }); + dialogBuilder.setNegativeButton(R.string.cancel, (dialog, id) -> dialog.dismiss()); + + AlertDialog alertDialog = dialogBuilder.create(); + alertDialog.setTitle(getString(R.string.action_channel_create)); + alertDialog.setOnDismissListener(dialogInterface -> { + //Hide keyboard + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + assert imm != null; + imm.hideSoftInputFromWindow(display_name.getWindowToken(), 0); + }); + if (alertDialog.getWindow() != null) + alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + alertDialog.show(); + } + + @Override + public void show(Account account) { + ChannelCreation oldChannelValues = new ChannelCreation(); + oldChannelValues.setName(account.getUsername()); + oldChannelValues.setDescription(account.getNote()); + oldChannelValues.setDisplayName(account.getDisplay_name()); + oldChannelValues.setId(account.getId()); + manageAlert(oldChannelValues); + } } diff --git a/app/src/main/java/app/fedilab/fedilabtube/fragment/DisplayPlaylistsFragment.java b/app/src/main/java/app/fedilab/fedilabtube/fragment/DisplayPlaylistsFragment.java index 58a1e87..ac2fe3b 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/fragment/DisplayPlaylistsFragment.java +++ b/app/src/main/java/app/fedilab/fedilabtube/fragment/DisplayPlaylistsFragment.java @@ -168,19 +168,14 @@ public class DisplayPlaylistsFragment extends Fragment { playlistElement.setDescription(playlist.getDescription()); new Thread(() -> { try { - new PeertubeAPI(context).createPlaylist(playlistElement); + String returnedId = new PeertubeAPI(context).createPlaylist(playlistElement); Handler mainHandler = new Handler(Looper.getMainLooper()); Runnable myRunnable = () -> { - DisplayPlaylistsFragment displayPlaylistsFragment; if (getActivity() == null) return; - displayPlaylistsFragment = (DisplayPlaylistsFragment) getActivity().getSupportFragmentManager().findFragmentByTag("PLAYLISTS"); - final FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); - if (displayPlaylistsFragment != null) { - ft.detach(displayPlaylistsFragment); - ft.attach(displayPlaylistsFragment); - ft.commit(); - } + playlist.setId(returnedId); + playlists.add(0, playlist); + playlistAdapter.notifyDataSetChanged(); }; mainHandler.post(myRunnable); add_new.setEnabled(true); diff --git a/app/src/main/res/layout/drawer_account.xml b/app/src/main/res/layout/drawer_account.xml index 659ff31..b3a5cf3 100644 --- a/app/src/main/res/layout/drawer_account.xml +++ b/app/src/main/res/layout/drawer_account.xml @@ -147,6 +147,15 @@ +