From 923e89984f8ed9cee9e5e18ecd8b3a8d2102b624 Mon Sep 17 00:00:00 2001 From: stom79 Date: Sat, 6 Oct 2018 15:59:00 +0200 Subject: [PATCH] Add peertube drawer --- .../mastodon/client/Entities/Peertube.java | 87 ++++++++++ .../mastodon/drawers/PeertubeAdapter.java | 159 ++++++++++++++++++ .../fragments/DisplayStatusFragment.java | 29 +++- 3 files changed, 268 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Peertube.java create mode 100644 app/src/main/java/fr/gouv/etalab/mastodon/drawers/PeertubeAdapter.java diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Peertube.java b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Peertube.java new file mode 100644 index 000000000..013f559ec --- /dev/null +++ b/app/src/main/java/fr/gouv/etalab/mastodon/client/Entities/Peertube.java @@ -0,0 +1,87 @@ +/* Copyright 2018 Thomas Schneider + * + * This file is a part of Mastalab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Mastalab; if not, + * see . */ +package fr.gouv.etalab.mastodon.client.Entities; + +/** + * Created by Thomas on 29/09/2018. + * Manage how to videos + */ +public class Peertube { + + private String id; + private String uuid; + private String name; + private String description; + private String thumbnailPath; + private String previewPath; + private String embedPath; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getThumbnailPath() { + return thumbnailPath; + } + + public void setThumbnailPath(String thumbnailPath) { + this.thumbnailPath = thumbnailPath; + } + + public String getPreviewPath() { + return previewPath; + } + + public void setPreviewPath(String previewPath) { + this.previewPath = previewPath; + } + + public String getEmbedPath() { + return embedPath; + } + + public void setEmbedPath(String embedPath) { + this.embedPath = embedPath; + } + +} diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/drawers/PeertubeAdapter.java b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/PeertubeAdapter.java new file mode 100644 index 000000000..8a01c6b57 --- /dev/null +++ b/app/src/main/java/fr/gouv/etalab/mastodon/drawers/PeertubeAdapter.java @@ -0,0 +1,159 @@ +package fr.gouv.etalab.mastodon.drawers; +/* Copyright 2018 Thomas Schneider + * + * This file is a part of Mastalab + * + * This program is free software; you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation; either version 3 of the + * License, or (at your option) any later version. + * + * Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Mastalab; if not, + * see . */ + + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.bumptech.glide.Glide; + +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import fr.gouv.etalab.mastodon.R; +import fr.gouv.etalab.mastodon.activities.WebviewActivity; +import fr.gouv.etalab.mastodon.asynctasks.ManageListsAsyncTask; +import fr.gouv.etalab.mastodon.client.APIResponse; +import fr.gouv.etalab.mastodon.client.Entities.Peertube; +import fr.gouv.etalab.mastodon.helper.Helper; +import fr.gouv.etalab.mastodon.interfaces.OnListActionInterface; + +import static fr.gouv.etalab.mastodon.helper.Helper.changeDrawableColor; + + +/** + * Created by Thomas on 06/10/2018. + * Adapter for peertube + */ +public class PeertubeAdapter extends RecyclerView.Adapter implements OnListActionInterface { + + private List peertubes; + private LayoutInflater layoutInflater; + private Context context; + + public PeertubeAdapter(Context context, List peertubes){ + this.peertubes = peertubes; + layoutInflater = LayoutInflater.from(context); + this.context = context; + + } + + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new PeertubeAdapter.ViewHolder(layoutInflater.inflate(R.layout.drawer_how_to_videos, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { + + + final PeertubeAdapter.ViewHolder holder = (PeertubeAdapter.ViewHolder) viewHolder; + final Peertube peertube = peertubes.get(position); + + + SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE); + int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK); + + if( theme == Helper.THEME_LIGHT){ + holder.how_to_container.setBackgroundResource(R.color.mastodonC3__); + changeDrawableColor(context, R.drawable.ic_keyboard_arrow_right,R.color.black); + }else if(theme == Helper.THEME_DARK){ + holder.how_to_container.setBackgroundResource(R.color.mastodonC1_); + changeDrawableColor(context, R.drawable.ic_keyboard_arrow_right,R.color.dark_text); + }else if(theme == Helper.THEME_BLACK) { + holder.how_to_container.setBackgroundResource(R.color.black_2); + changeDrawableColor(context, R.drawable.ic_keyboard_arrow_right,R.color.dark_text); + } + Drawable next = ContextCompat.getDrawable(context, R.drawable.ic_keyboard_arrow_right); + holder.how_to_description.setText(peertube.getDescription()); + holder.how_to_title.setText(peertube.getName()); + assert next != null; + final float scale = context.getResources().getDisplayMetrics().density; + next.setBounds(0,0,(int) (30 * scale + 0.5f),(int) (30 * scale + 0.5f)); + holder.how_to_description.setCompoundDrawables(null, null, next, null); + Glide.with(holder.how_to_image.getContext()) + .load("https://peertube.social" + peertube.getThumbnailPath()) + .into(holder.how_to_image); + holder.how_to_container.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(context, WebviewActivity.class); + Bundle b = new Bundle(); + String finalUrl = "https://peertube.social" + peertube.getEmbedPath(); + b.putString("url", finalUrl); + b.putBoolean("peertubeLink", true); + Pattern link = Pattern.compile("(https?:\\/\\/[\\da-z\\.-]+\\.[a-z\\.]{2,10})\\/videos\\/embed\\/(\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12})$"); + Matcher matcherLink = link.matcher(finalUrl); + if( matcherLink.find()) { + String url = matcherLink.group(1) + "/videos/watch/" + matcherLink.group(2); + b.putString("peertubeLinkToFetch", url); + } + intent.putExtras(b); + context.startActivity(intent); + } + }); + + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public int getItemCount() { + return 0; + } + + + @Override + public void onActionDone(ManageListsAsyncTask.action actionType, APIResponse apiResponse, int statusCode) { + + } + + class ViewHolder extends RecyclerView.ViewHolder{ + LinearLayout how_to_container; + ImageView how_to_image; + TextView how_to_description; + TextView how_to_title; + public ViewHolder(@NonNull View itemView) { + super(itemView); + how_to_description = itemView.findViewById(R.id.how_to_description); + how_to_title = itemView.findViewById(R.id.how_to_title); + how_to_image = itemView.findViewById(R.id.how_to_image); + how_to_container = itemView.findViewById(R.id.how_to_container); + } + } + + + + +} \ No newline at end of file diff --git a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java index ecd50addb..2a19ded91 100644 --- a/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java +++ b/app/src/main/java/fr/gouv/etalab/mastodon/fragments/DisplayStatusFragment.java @@ -41,6 +41,9 @@ import fr.gouv.etalab.mastodon.activities.MainActivity; import fr.gouv.etalab.mastodon.asynctasks.RetrieveMissingFeedsAsyncTask; import fr.gouv.etalab.mastodon.client.APIResponse; import fr.gouv.etalab.mastodon.client.Entities.Account; +import fr.gouv.etalab.mastodon.client.Entities.Peertube; +import fr.gouv.etalab.mastodon.client.Entities.RemoteInstance; +import fr.gouv.etalab.mastodon.drawers.PeertubeAdapter; import fr.gouv.etalab.mastodon.drawers.StatusListAdapter; import fr.gouv.etalab.mastodon.helper.Helper; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveMissingFeedsInterface; @@ -50,6 +53,7 @@ import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask; import fr.gouv.etalab.mastodon.client.Entities.Status; import fr.gouv.etalab.mastodon.interfaces.OnRetrieveFeedsInterface; import fr.gouv.etalab.mastodon.sqlite.AccountDAO; +import fr.gouv.etalab.mastodon.sqlite.InstancesDAO; import fr.gouv.etalab.mastodon.sqlite.Sqlite; import fr.gouv.etalab.mastodon.sqlite.TempMuteDAO; @@ -65,8 +69,10 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn private Context context; private AsyncTask asyncTask; private StatusListAdapter statusListAdapter; + private PeertubeAdapter peertubeAdapater; private String max_id; private List statuses; + private List peertubes; private RetrieveFeedsAsyncTask.Type type; private RelativeLayout mainLoader, nextElementLoader, textviewNoAction; private boolean firstLoad; @@ -83,7 +89,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn private boolean isSwipped; private String remoteInstance; private List mutedAccount; - + private String instanceType; public DisplayStatusFragment(){ } @@ -91,6 +97,7 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_status, container, false); statuses = new ArrayList<>(); + peertubes = new ArrayList<>(); context = getContext(); Bundle bundle = this.getArguments(); showMediaOnly = false; @@ -107,6 +114,12 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn showReply = bundle.getBoolean("showReply",false); remoteInstance = bundle.getString("remote_instance", ""); } + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + if( !remoteInstance.equals("")){ + List remoteInstanceObj = new InstancesDAO(context, db).getInstanceByName(remoteInstance); + if( remoteInstanceObj != null && remoteInstanceObj.size() > 0) + instanceType = remoteInstanceObj.get(0).getType(); + } isSwipped = false; max_id = null; flag_loading = true; @@ -124,16 +137,18 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn mainLoader.setVisibility(View.VISIBLE); nextElementLoader.setVisibility(View.GONE); - SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + Account account = new AccountDAO(context, db).getAccountByID(userId); mutedAccount = new TempMuteDAO(context, db).getAllTimeMuted(account); userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null); - statusListAdapter = new StatusListAdapter(context, type, targetedId, isOnWifi, behaviorWithAttachments, positionSpinnerTrans, this.statuses); - - - - lv_status.setAdapter(statusListAdapter); + if( instanceType == null) { + statusListAdapter = new StatusListAdapter(context, type, targetedId, isOnWifi, behaviorWithAttachments, positionSpinnerTrans, this.statuses); + lv_status.setAdapter(statusListAdapter); + }else { + peertubeAdapater = new PeertubeAdapter(context, this.peertubes); + lv_status.setAdapter(peertubeAdapater); + } mLayoutManager = new LinearLayoutManager(context); lv_status.setLayoutManager(mLayoutManager);