Favorites for peertube
This commit is contained in:
parent
c33ddd3952
commit
be917d6b24
|
@ -106,6 +106,7 @@ import fr.gouv.etalab.mastodon.client.HttpsConnection;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayAccountsFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayAccountsFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayBookmarksFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayBookmarksFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayDraftsFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayDraftsFragment;
|
||||||
|
import fr.gouv.etalab.mastodon.fragments.DisplayFavoritesPeertubeFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayFiltersFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayFiltersFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayFollowRequestSentFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayFollowRequestSentFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayHowToFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayHowToFragment;
|
||||||
|
@ -1830,7 +1831,7 @@ public abstract class BaseMainActivity extends BaseActivity
|
||||||
toolbarTitle.setVisibility(View.VISIBLE);
|
toolbarTitle.setVisibility(View.VISIBLE);
|
||||||
delete_instance.setVisibility(View.GONE);
|
delete_instance.setVisibility(View.GONE);
|
||||||
appBar.setExpanded(true);
|
appBar.setExpanded(true);
|
||||||
if (id != R.id.nav_drafts && id != R.id.nav_bookmarks ) {
|
if (id != R.id.nav_drafts && id != R.id.nav_bookmarks && id != R.id.nav_peertube ) {
|
||||||
delete_all.hide();
|
delete_all.hide();
|
||||||
}else{
|
}else{
|
||||||
delete_all.show();
|
delete_all.show();
|
||||||
|
@ -1901,6 +1902,12 @@ public abstract class BaseMainActivity extends BaseActivity
|
||||||
fragmentManager.beginTransaction()
|
fragmentManager.beginTransaction()
|
||||||
.replace(R.id.main_app_container, displayBookmarksFragment, fragmentTag).commit();
|
.replace(R.id.main_app_container, displayBookmarksFragment, fragmentTag).commit();
|
||||||
toot.hide();
|
toot.hide();
|
||||||
|
}else if (id == R.id.nav_peertube) {
|
||||||
|
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){
|
}else if( id == R.id.nav_follow_request){
|
||||||
toot.hide();
|
toot.hide();
|
||||||
DisplayFollowRequestSentFragment followRequestSentFragment = new DisplayFollowRequestSentFragment();
|
DisplayFollowRequestSentFragment followRequestSentFragment = new DisplayFollowRequestSentFragment();
|
||||||
|
|
|
@ -21,6 +21,8 @@ import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.media.MediaPlayer;
|
import android.media.MediaPlayer;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
|
@ -66,6 +68,8 @@ import fr.gouv.etalab.mastodon.drawers.StatusListAdapter;
|
||||||
import fr.gouv.etalab.mastodon.helper.FullScreenMediaController;
|
import fr.gouv.etalab.mastodon.helper.FullScreenMediaController;
|
||||||
import fr.gouv.etalab.mastodon.helper.Helper;
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrievePeertubeInterface;
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrievePeertubeInterface;
|
||||||
|
import fr.gouv.etalab.mastodon.sqlite.PeertubeFavoritesDAO;
|
||||||
|
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
||||||
|
|
||||||
import static fr.gouv.etalab.mastodon.helper.Helper.EXTERNAL_STORAGE_REQUEST_CODE;
|
import static fr.gouv.etalab.mastodon.helper.Helper.EXTERNAL_STORAGE_REQUEST_CODE;
|
||||||
import static fr.gouv.etalab.mastodon.helper.Helper.manageDownloads;
|
import static fr.gouv.etalab.mastodon.helper.Helper.manageDownloads;
|
||||||
|
@ -82,7 +86,7 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube
|
||||||
private FullScreenMediaController.fullscreen fullscreen;
|
private FullScreenMediaController.fullscreen fullscreen;
|
||||||
private VideoView videoView;
|
private VideoView videoView;
|
||||||
private RelativeLayout loader;
|
private RelativeLayout loader;
|
||||||
private TextView peertube_view_count, peertube_like_count, peertube_dislike_count, peertube_share, peertube_download, peertube_description, peertube_title;
|
private TextView peertube_view_count, peertube_bookmark, peertube_like_count, peertube_dislike_count, peertube_share, peertube_download, peertube_description, peertube_title;
|
||||||
private ScrollView peertube_information_container;
|
private ScrollView peertube_information_container;
|
||||||
private MediaPlayer mediaPlayer;
|
private MediaPlayer mediaPlayer;
|
||||||
private FullScreenMediaController fullScreenMediaController;
|
private FullScreenMediaController fullScreenMediaController;
|
||||||
|
@ -112,6 +116,7 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube
|
||||||
setContentView(R.layout.activity_peertube);
|
setContentView(R.layout.activity_peertube);
|
||||||
loader = findViewById(R.id.loader);
|
loader = findViewById(R.id.loader);
|
||||||
peertube_view_count = findViewById(R.id.peertube_view_count);
|
peertube_view_count = findViewById(R.id.peertube_view_count);
|
||||||
|
peertube_bookmark = findViewById(R.id.peertube_bookmark);
|
||||||
peertube_like_count = findViewById(R.id.peertube_like_count);
|
peertube_like_count = findViewById(R.id.peertube_like_count);
|
||||||
peertube_dislike_count = findViewById(R.id.peertube_dislike_count);
|
peertube_dislike_count = findViewById(R.id.peertube_dislike_count);
|
||||||
peertube_share = findViewById(R.id.peertube_share);
|
peertube_share = findViewById(R.id.peertube_share);
|
||||||
|
@ -283,6 +288,34 @@ public class PeertubeActivity extends BaseActivity implements OnRetrievePeertube
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
SQLiteDatabase db = Sqlite.getInstance(PeertubeActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||||
|
List<Peertube> peertubes = new PeertubeFavoritesDAO(PeertubeActivity.this, db).getSinglePeertube(peertube);
|
||||||
|
|
||||||
|
Drawable img;
|
||||||
|
|
||||||
|
if( peertubes == null || peertubes.size() == 0)
|
||||||
|
img = ContextCompat.getDrawable(PeertubeActivity.this, R.drawable.ic_bookmark_peertube_border);
|
||||||
|
else
|
||||||
|
img = ContextCompat.getDrawable(PeertubeActivity.this, R.drawable.ic_bookmark_peertube);
|
||||||
|
peertube_bookmark.setCompoundDrawablesWithIntrinsicBounds(null, img, null, null);
|
||||||
|
|
||||||
|
peertube_bookmark.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
List<Peertube> peertubes = new PeertubeFavoritesDAO(PeertubeActivity.this, db).getSinglePeertube(peertube);
|
||||||
|
if( peertubes == null || peertubes.size() == 0){
|
||||||
|
new PeertubeFavoritesDAO(PeertubeActivity.this, db).insert(peertube);
|
||||||
|
Toast.makeText(PeertubeActivity.this,R.string.bookmark_add_peertube, Toast.LENGTH_SHORT).show();
|
||||||
|
}else{
|
||||||
|
new PeertubeFavoritesDAO(PeertubeActivity.this, db).remove(peertube);
|
||||||
|
Toast.makeText(PeertubeActivity.this,R.string.bookmark_remove_peertube, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
if( peertubes != null && peertubes.size() > 0) //Was initially in cache
|
||||||
|
peertube_bookmark.setCompoundDrawablesWithIntrinsicBounds( null, ContextCompat.getDrawable(PeertubeActivity.this, R.drawable.ic_bookmark_peertube_border), null ,null);
|
||||||
|
else
|
||||||
|
peertube_bookmark.setCompoundDrawablesWithIntrinsicBounds( null, ContextCompat.getDrawable(PeertubeActivity.this, R.drawable.ic_bookmark_peertube), null ,null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
peertube_share.setOnClickListener(new View.OnClickListener() {
|
peertube_share.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -30,6 +30,7 @@ import fr.gouv.etalab.mastodon.helper.FilterToots;
|
||||||
import fr.gouv.etalab.mastodon.helper.Helper;
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveFeedsInterface;
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveFeedsInterface;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.InstancesDAO;
|
import fr.gouv.etalab.mastodon.sqlite.InstancesDAO;
|
||||||
|
import fr.gouv.etalab.mastodon.sqlite.PeertubeFavoritesDAO;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.StatusCacheDAO;
|
import fr.gouv.etalab.mastodon.sqlite.StatusCacheDAO;
|
||||||
|
|
||||||
|
@ -68,6 +69,7 @@ public class RetrieveFeedsAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
CONTEXT,
|
CONTEXT,
|
||||||
TAG,
|
TAG,
|
||||||
CACHE_BOOKMARKS,
|
CACHE_BOOKMARKS,
|
||||||
|
CACHE_BOOKMARKS_PEERTUBE,
|
||||||
CACHE_STATUS,
|
CACHE_STATUS,
|
||||||
REMOTE_INSTANCE
|
REMOTE_INSTANCE
|
||||||
}
|
}
|
||||||
|
@ -179,6 +181,12 @@ public class RetrieveFeedsAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
List<fr.gouv.etalab.mastodon.client.Entities.Status> statuses = new StatusCacheDAO(contextReference.get(), db).getAllStatus(StatusCacheDAO.BOOKMARK_CACHE);
|
List<fr.gouv.etalab.mastodon.client.Entities.Status> statuses = new StatusCacheDAO(contextReference.get(), db).getAllStatus(StatusCacheDAO.BOOKMARK_CACHE);
|
||||||
apiResponse.setStatuses(statuses);
|
apiResponse.setStatuses(statuses);
|
||||||
break;
|
break;
|
||||||
|
case CACHE_BOOKMARKS_PEERTUBE:
|
||||||
|
apiResponse = new APIResponse();
|
||||||
|
db = Sqlite.getInstance(contextReference.get(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||||
|
List<Peertube> peertubes = new PeertubeFavoritesDAO(contextReference.get(), db).getAllPeertube();
|
||||||
|
apiResponse.setPeertubes(peertubes);
|
||||||
|
break;
|
||||||
case CACHE_STATUS:
|
case CACHE_STATUS:
|
||||||
apiResponse = new APIResponse();
|
apiResponse = new APIResponse();
|
||||||
db = Sqlite.getInstance(contextReference.get(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
db = Sqlite.getInstance(contextReference.get(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||||
|
|
|
@ -616,7 +616,6 @@ public class API {
|
||||||
try {
|
try {
|
||||||
HttpsConnection httpsConnection = new HttpsConnection(context);
|
HttpsConnection httpsConnection = new HttpsConnection(context);
|
||||||
String response = httpsConnection.get("https://"+instance+"/api/v1/videos", 60, params, null);
|
String response = httpsConnection.get("https://"+instance+"/api/v1/videos", 60, params, null);
|
||||||
Helper.largeLog(response);
|
|
||||||
JSONArray jsonArray = new JSONObject(response).getJSONArray("data");
|
JSONArray jsonArray = new JSONObject(response).getJSONArray("data");
|
||||||
peertubes = parsePeertube(instance, jsonArray);
|
peertubes = parsePeertube(instance, jsonArray);
|
||||||
} catch (HttpsConnection.HttpsConnectionException e) {
|
} catch (HttpsConnection.HttpsConnectionException e) {
|
||||||
|
@ -2386,10 +2385,11 @@ public class API {
|
||||||
* @param resobj JSONObject
|
* @param resobj JSONObject
|
||||||
* @return Peertube
|
* @return Peertube
|
||||||
*/
|
*/
|
||||||
private static Peertube parsePeertube(Context context, String instance, JSONObject resobj){
|
public static Peertube parsePeertube(Context context, String instance, JSONObject resobj){
|
||||||
Peertube peertube = new Peertube();
|
Peertube peertube = new Peertube();
|
||||||
try {
|
try {
|
||||||
peertube.setId(resobj.get("id").toString());
|
peertube.setId(resobj.get("id").toString());
|
||||||
|
peertube.setCache(resobj);
|
||||||
peertube.setUuid(resobj.get("uuid").toString());
|
peertube.setUuid(resobj.get("uuid").toString());
|
||||||
peertube.setName(resobj.get("name").toString());
|
peertube.setName(resobj.get("name").toString());
|
||||||
peertube.setDescription(resobj.get("description").toString());
|
peertube.setDescription(resobj.get("description").toString());
|
||||||
|
@ -2425,6 +2425,7 @@ public class API {
|
||||||
peertube.setId(resobj.get("id").toString());
|
peertube.setId(resobj.get("id").toString());
|
||||||
peertube.setUuid(resobj.get("uuid").toString());
|
peertube.setUuid(resobj.get("uuid").toString());
|
||||||
peertube.setName(resobj.get("name").toString());
|
peertube.setName(resobj.get("name").toString());
|
||||||
|
peertube.setCache(resobj);
|
||||||
peertube.setInstance(instance);
|
peertube.setInstance(instance);
|
||||||
peertube.setHost(resobj.getJSONObject("account").get("host").toString());
|
peertube.setHost(resobj.getJSONObject("account").get("host").toString());
|
||||||
peertube.setDescription(resobj.get("description").toString());
|
peertube.setDescription(resobj.get("description").toString());
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
* see <http://www.gnu.org/licenses>. */
|
* see <http://www.gnu.org/licenses>. */
|
||||||
package fr.gouv.etalab.mastodon.client.Entities;
|
package fr.gouv.etalab.mastodon.client.Entities;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -40,7 +42,7 @@ public class Peertube {
|
||||||
private Account account;
|
private Account account;
|
||||||
private List<String> resolution;
|
private List<String> resolution;
|
||||||
private boolean commentsEnabled;
|
private boolean commentsEnabled;
|
||||||
|
private JSONObject cache;
|
||||||
|
|
||||||
public Peertube() {
|
public Peertube() {
|
||||||
}
|
}
|
||||||
|
@ -207,4 +209,12 @@ public class Peertube {
|
||||||
public void setCommentsEnabled(boolean commentsEnabled) {
|
public void setCommentsEnabled(boolean commentsEnabled) {
|
||||||
this.commentsEnabled = commentsEnabled;
|
this.commentsEnabled = commentsEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JSONObject getCache() {
|
||||||
|
return cache;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCache(JSONObject cache) {
|
||||||
|
this.cache = cache;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
package fr.gouv.etalab.mastodon.fragments;
|
||||||
|
/* Copyright 2017 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 <http://www.gnu.org/licenses>. */
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.design.widget.FloatingActionButton;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
|
import android.support.v7.widget.LinearLayoutManager;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.RelativeLayout;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import fr.gouv.etalab.mastodon.R;
|
||||||
|
import fr.gouv.etalab.mastodon.activities.MainActivity;
|
||||||
|
import fr.gouv.etalab.mastodon.asynctasks.RetrieveFeedsAsyncTask;
|
||||||
|
import fr.gouv.etalab.mastodon.client.APIResponse;
|
||||||
|
import fr.gouv.etalab.mastodon.client.Entities.Peertube;
|
||||||
|
import fr.gouv.etalab.mastodon.drawers.PeertubeAdapter;
|
||||||
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveFeedsInterface;
|
||||||
|
import fr.gouv.etalab.mastodon.sqlite.PeertubeFavoritesDAO;
|
||||||
|
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
||||||
|
import fr.gouv.etalab.mastodon.sqlite.StatusCacheDAO;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Thomas on 21/10/2018.
|
||||||
|
* Fragment to display bookmarks for Peertube
|
||||||
|
*/
|
||||||
|
public class DisplayFavoritesPeertubeFragment extends Fragment implements OnRetrieveFeedsInterface {
|
||||||
|
|
||||||
|
|
||||||
|
private Context context;
|
||||||
|
private List<Peertube> peertubes;
|
||||||
|
private PeertubeAdapter peertubeAdapter;
|
||||||
|
private RelativeLayout textviewNoAction;
|
||||||
|
private RelativeLayout mainLoader;
|
||||||
|
private RecyclerView lv_status;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
View rootView = inflater.inflate(R.layout.fragment_peertube_favourites, container, false);
|
||||||
|
context = getContext();
|
||||||
|
|
||||||
|
lv_status = rootView.findViewById(R.id.lv_status);
|
||||||
|
|
||||||
|
mainLoader = rootView.findViewById(R.id.loader);
|
||||||
|
textviewNoAction = rootView.findViewById(R.id.no_action);
|
||||||
|
mainLoader.setVisibility(View.VISIBLE);
|
||||||
|
return rootView;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle saveInstance)
|
||||||
|
{
|
||||||
|
super.onCreate(saveInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttach(Context context) {
|
||||||
|
super.onAttach(context);
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
new RetrieveFeedsAsyncTask(context, RetrieveFeedsAsyncTask.Type.CACHE_BOOKMARKS_PEERTUBE, null, DisplayFavoritesPeertubeFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRetrieveFeeds(APIResponse apiResponse) {
|
||||||
|
|
||||||
|
final SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
|
||||||
|
mainLoader.setVisibility(View.GONE);
|
||||||
|
FloatingActionButton delete_all = null;
|
||||||
|
try {
|
||||||
|
delete_all = ((MainActivity) context).findViewById(R.id.delete_all);
|
||||||
|
}catch (Exception ignored){}
|
||||||
|
peertubes = apiResponse.getPeertubes();
|
||||||
|
if( peertubes != null && peertubes.size() > 0) {
|
||||||
|
LinearLayoutManager mLayoutManager = new LinearLayoutManager(context);
|
||||||
|
peertubeAdapter = new PeertubeAdapter(context, peertubes.get(0).getInstance(), this.peertubes);
|
||||||
|
lv_status.setAdapter(peertubeAdapter);
|
||||||
|
lv_status.setLayoutManager(mLayoutManager);
|
||||||
|
textviewNoAction.setVisibility(View.GONE);
|
||||||
|
lv_status.setVisibility(View.VISIBLE);
|
||||||
|
}else {
|
||||||
|
textviewNoAction.setVisibility(View.VISIBLE);
|
||||||
|
lv_status.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( delete_all != null)
|
||||||
|
delete_all.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(context);
|
||||||
|
builder.setTitle(R.string.delete_all);
|
||||||
|
builder.setIcon(android.R.drawable.ic_dialog_alert)
|
||||||
|
.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogConfirm, int which) {
|
||||||
|
new PeertubeFavoritesDAO(context, db).removeAll();
|
||||||
|
peertubes = new ArrayList<>();
|
||||||
|
peertubes.clear();
|
||||||
|
peertubeAdapter = new PeertubeAdapter(context,null, peertubes);
|
||||||
|
lv_status.setAdapter(peertubeAdapter);
|
||||||
|
peertubeAdapter.notifyDataSetChanged();
|
||||||
|
textviewNoAction.setVisibility(View.VISIBLE);
|
||||||
|
dialogConfirm.dismiss();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialogConfirm, int which) {
|
||||||
|
dialogConfirm.dismiss();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,146 @@
|
||||||
|
package fr.gouv.etalab.mastodon.sqlite;
|
||||||
|
/* 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 <http://www.gnu.org/licenses>. */
|
||||||
|
|
||||||
|
import android.content.ContentValues;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
|
||||||
|
import org.json.JSONException;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import fr.gouv.etalab.mastodon.client.API;
|
||||||
|
import fr.gouv.etalab.mastodon.client.Entities.Peertube;
|
||||||
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Thomas on 21/10/2018.
|
||||||
|
* Manage Peertube favorites
|
||||||
|
*/
|
||||||
|
public class PeertubeFavoritesDAO {
|
||||||
|
|
||||||
|
private SQLiteDatabase db;
|
||||||
|
public Context context;
|
||||||
|
|
||||||
|
public PeertubeFavoritesDAO(Context context, SQLiteDatabase db) {
|
||||||
|
//Creation of the DB with tables
|
||||||
|
this.context = context;
|
||||||
|
this.db = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//------- INSERTIONS -------
|
||||||
|
/**
|
||||||
|
* Insert a status in database
|
||||||
|
* @param peertube Peertube
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public long insert(Peertube peertube) {
|
||||||
|
ContentValues values = new ContentValues();
|
||||||
|
values.put(Sqlite.COL_UUID, peertube.getUuid());
|
||||||
|
values.put(Sqlite.COL_INSTANCE, peertube.getInstance());
|
||||||
|
values.put(Sqlite.COL_DATE, Helper.dateToString(new Date()));
|
||||||
|
values.put(Sqlite.COL_CACHE, peertube.getCache().toString());
|
||||||
|
//Inserts cached peertube
|
||||||
|
long last_id;
|
||||||
|
try{
|
||||||
|
last_id = db.insert(Sqlite.TABLE_PEERTUBE_FAVOURITES, null, values);
|
||||||
|
}catch (Exception e) {
|
||||||
|
last_id = -1;
|
||||||
|
}
|
||||||
|
return last_id;
|
||||||
|
}
|
||||||
|
//------- REMOVE -------
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Remove stored status
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public int remove(Peertube peertube){
|
||||||
|
return db.delete(Sqlite.TABLE_PEERTUBE_FAVOURITES, Sqlite.COL_UUID + " = \""+ peertube.getUuid() +"\" AND " + Sqlite.COL_INSTANCE + " = \"" + peertube.getInstance() + "\"", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Remove stored status
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public int removeAll(){
|
||||||
|
return db.delete(Sqlite.TABLE_PEERTUBE_FAVOURITES, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//------- GETTERS -------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all cached Peertube
|
||||||
|
* @return stored peertube List<Peertube>
|
||||||
|
*/
|
||||||
|
public List<Peertube> getAllPeertube(){
|
||||||
|
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||||
|
try {
|
||||||
|
Cursor c = db.query(Sqlite.TABLE_PEERTUBE_FAVOURITES, null, null, null, null, null, Sqlite.COL_DATE+ " DESC");
|
||||||
|
return cursorToListPeertube(c);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a cached Peertube
|
||||||
|
* @return stored peertube List<Peertube>
|
||||||
|
*/
|
||||||
|
public List<Peertube> getSinglePeertube(Peertube peertube){
|
||||||
|
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
||||||
|
try {
|
||||||
|
Cursor c = db.query(Sqlite.TABLE_PEERTUBE_FAVOURITES, null, Sqlite.COL_UUID + " = \""+ peertube.getUuid() +"\" AND " + Sqlite.COL_INSTANCE + " = \"" + peertube.getInstance() + "\"", null, null, null, Sqlite.COL_DATE+ " DESC");
|
||||||
|
return cursorToListPeertube(c);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Method to hydrate cached statuses from database
|
||||||
|
* @param c Cursor
|
||||||
|
* @return List<Peertube>
|
||||||
|
*/
|
||||||
|
private List<Peertube> cursorToListPeertube(Cursor c){
|
||||||
|
//No element found
|
||||||
|
if (c.getCount() == 0)
|
||||||
|
return null;
|
||||||
|
List<Peertube> peertubes = new ArrayList<>();
|
||||||
|
while (c.moveToNext() ) {
|
||||||
|
//Restore cached status
|
||||||
|
try {
|
||||||
|
Peertube peertube = API.parsePeertube(context, c.getString(c.getColumnIndex(Sqlite.COL_INSTANCE)), new JSONObject(c.getString(c.getColumnIndex(Sqlite.COL_CACHE))));
|
||||||
|
peertubes.add(peertube);
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Close the cursor
|
||||||
|
c.close();
|
||||||
|
//Peertubes list is returned
|
||||||
|
return peertubes;
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,7 +26,7 @@ import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
|
||||||
public class Sqlite extends SQLiteOpenHelper {
|
public class Sqlite extends SQLiteOpenHelper {
|
||||||
|
|
||||||
public static final int DB_VERSION = 14;
|
public static final int DB_VERSION = 15;
|
||||||
public static final String DB_NAME = "mastodon_etalab_db";
|
public static final String DB_NAME = "mastodon_etalab_db";
|
||||||
public static SQLiteDatabase db;
|
public static SQLiteDatabase db;
|
||||||
private static Sqlite sInstance;
|
private static Sqlite sInstance;
|
||||||
|
@ -52,6 +52,9 @@ public class Sqlite extends SQLiteOpenHelper {
|
||||||
//Table for instance names
|
//Table for instance names
|
||||||
static final String TABLE_INSTANCES = "INSTANCES";
|
static final String TABLE_INSTANCES = "INSTANCES";
|
||||||
|
|
||||||
|
//Table for peertube favorites
|
||||||
|
static final String TABLE_PEERTUBE_FAVOURITES = "PEERTUBE_FAVOURITES";
|
||||||
|
|
||||||
static final String COL_USER_ID = "USER_ID";
|
static final String COL_USER_ID = "USER_ID";
|
||||||
static final String COL_USERNAME = "USERNAME";
|
static final String COL_USERNAME = "USERNAME";
|
||||||
static final String COL_ACCT = "ACCT";
|
static final String COL_ACCT = "ACCT";
|
||||||
|
@ -166,6 +169,18 @@ public class Sqlite extends SQLiteOpenHelper {
|
||||||
+ COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE_TYPE + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL)";
|
+ COL_INSTANCE + " TEXT NOT NULL, " + COL_USER_ID + " TEXT NOT NULL, " + COL_INSTANCE_TYPE + " TEXT, " + COL_DATE_CREATION + " TEXT NOT NULL)";
|
||||||
|
|
||||||
|
|
||||||
|
static final String COL_UUID = "UUID";
|
||||||
|
static final String COL_CACHE = "CACHE";
|
||||||
|
static final String COL_DATE = "DATE";
|
||||||
|
|
||||||
|
private final String CREATE_TABLE_PEERTUBE_FAVOURITES = "CREATE TABLE "
|
||||||
|
+ TABLE_PEERTUBE_FAVOURITES + "("
|
||||||
|
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
|
+ COL_UUID + " TEXT NOT NULL, "
|
||||||
|
+ COL_INSTANCE + " TEXT NOT NULL, "
|
||||||
|
+ COL_CACHE + " TEXT NOT NULL, "
|
||||||
|
+ COL_DATE + " TEXT NOT NULL)";
|
||||||
|
|
||||||
public Sqlite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
|
public Sqlite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
|
||||||
super(context, name, factory, version);
|
super(context, name, factory, version);
|
||||||
}
|
}
|
||||||
|
@ -189,6 +204,7 @@ public class Sqlite extends SQLiteOpenHelper {
|
||||||
db.execSQL(CREATE_TABLE_STATUSES_CACHE);
|
db.execSQL(CREATE_TABLE_STATUSES_CACHE);
|
||||||
db.execSQL(CREATE_UNIQUE_CACHE_INDEX);
|
db.execSQL(CREATE_UNIQUE_CACHE_INDEX);
|
||||||
db.execSQL(CREATE_TABLE_INSTANCES);
|
db.execSQL(CREATE_TABLE_INSTANCES);
|
||||||
|
db.execSQL(CREATE_TABLE_PEERTUBE_FAVOURITES);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -228,6 +244,8 @@ public class Sqlite extends SQLiteOpenHelper {
|
||||||
db.execSQL("ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN "+ COL_EMOJIS + " TEXT");
|
db.execSQL("ALTER TABLE " + TABLE_USER_ACCOUNT + " ADD COLUMN "+ COL_EMOJIS + " TEXT");
|
||||||
case 13:
|
case 13:
|
||||||
db.execSQL("ALTER TABLE " + TABLE_INSTANCES + " ADD COLUMN "+ COL_INSTANCE_TYPE + " TEXT");
|
db.execSQL("ALTER TABLE " + TABLE_INSTANCES + " ADD COLUMN "+ COL_INSTANCE_TYPE + " TEXT");
|
||||||
|
case 14:
|
||||||
|
db.execSQL(CREATE_TABLE_PEERTUBE_FAVOURITES);
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#606984"
|
||||||
|
android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
|
||||||
|
</vector>
|
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="#606984"
|
||||||
|
android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/>
|
||||||
|
</vector>
|
Binary file not shown.
After Width: | Height: | Size: 292 B |
Binary file not shown.
After Width: | Height: | Size: 246 B |
Binary file not shown.
After Width: | Height: | Size: 218 B |
Binary file not shown.
After Width: | Height: | Size: 398 B |
Binary file not shown.
After Width: | Height: | Size: 549 B |
Binary file not shown.
After Width: | Height: | Size: 717 B |
|
@ -121,6 +121,20 @@
|
||||||
android:text="0"
|
android:text="0"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
tools:ignore="HardcodedText" />
|
tools:ignore="HardcodedText" />
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/peertube_bookmark"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:drawableTop="@drawable/ic_bookmark_peertube_border"
|
||||||
|
android:drawablePadding="5dp"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:layout_marginEnd="10dp"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginStart="10dp"
|
||||||
|
android:text=""
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
/>
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_weight="1"
|
android:layout_weight="1"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
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 <http://www.gnu.org/licenses>.
|
||||||
|
-->
|
||||||
|
<RelativeLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:paddingLeft="@dimen/fab_margin"
|
||||||
|
android:paddingRight="@dimen/fab_margin"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
<!-- Listview Peertube bookmark -->
|
||||||
|
<android.support.v7.widget.RecyclerView
|
||||||
|
android:id="@+id/lv_status"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:scrollbars="none"
|
||||||
|
/>
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/no_action"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
<TextView
|
||||||
|
android:padding="10dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textSize="25sp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:textStyle="italic|bold"
|
||||||
|
android:typeface="serif"
|
||||||
|
android:text="@string/bookmark_peertube_empty"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
</RelativeLayout>
|
||||||
|
<!-- Main Loader -->
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/loader"
|
||||||
|
android:visibility="gone"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:gravity="center"
|
||||||
|
>
|
||||||
|
<ProgressBar
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:indeterminate="true" />
|
||||||
|
</RelativeLayout>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
|
@ -31,6 +31,10 @@
|
||||||
android:id="@+id/nav_bookmarks"
|
android:id="@+id/nav_bookmarks"
|
||||||
android:icon="@drawable/ic_bookmark"
|
android:icon="@drawable/ic_bookmark"
|
||||||
android:title="@string/bookmarks" />
|
android:title="@string/bookmarks" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/nav_peertube"
|
||||||
|
android:icon="@drawable/ic_favorite_peertube_full"
|
||||||
|
android:title="@string/peertube_favorites" />
|
||||||
<item
|
<item
|
||||||
android:id="@+id/nav_filters"
|
android:id="@+id/nav_filters"
|
||||||
android:icon="@drawable/ic_filter"
|
android:icon="@drawable/ic_filter"
|
||||||
|
|
|
@ -642,6 +642,10 @@
|
||||||
<string name="add_remote_instance">Add an instance</string>
|
<string name="add_remote_instance">Add an instance</string>
|
||||||
<string name="comment_no_allowed_peertube">Comments are not enabled on this video!</string>
|
<string name="comment_no_allowed_peertube">Comments are not enabled on this video!</string>
|
||||||
<string name="pickup_resolution">Pick up a resolution</string>
|
<string name="pickup_resolution">Pick up a resolution</string>
|
||||||
|
<string name="peertube_favorites">Peertube favourites</string>
|
||||||
|
<string name="bookmark_add_peertube">The video has been added to bookmarks!</string>
|
||||||
|
<string name="bookmark_remove_peertube">The video has been removed from bookmarks!</string>
|
||||||
|
<string name="bookmark_peertube_empty">There is no Peertube videos in your favourites!</string>
|
||||||
|
|
||||||
<string-array name="filter_expire">
|
<string-array name="filter_expire">
|
||||||
<item>Never</item>
|
<item>Never</item>
|
||||||
|
|
Loading…
Reference in New Issue