This commit is contained in:
Thomas 2020-09-08 12:08:49 +02:00
parent 7588a48cb5
commit 8c7d1c692b
11 changed files with 211 additions and 302 deletions

View File

@ -16,7 +16,6 @@ package app.fedilab.fedilabtube;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.Spanned; import android.text.Spanned;
@ -31,6 +30,7 @@ import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.lifecycle.ViewModelProvider;
import com.google.android.material.textfield.TextInputLayout; import com.google.android.material.textfield.TextInputLayout;
@ -42,9 +42,9 @@ import java.net.URLEncoder;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import app.fedilab.fedilabtube.asynctasks.UpdateAccountInfoAsyncTask;
import app.fedilab.fedilabtube.client.HttpsConnection; import app.fedilab.fedilabtube.client.HttpsConnection;
import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.viewmodel.OwnAccountVM;
import es.dmoral.toasty.Toasty; import es.dmoral.toasty.Toasty;
@ -292,7 +292,8 @@ public class LoginActivity extends AppCompatActivity {
editor.putString(Helper.PREF_INSTANCE, host); editor.putString(Helper.PREF_INSTANCE, host);
editor.apply(); editor.apply();
//Update the account with the token; //Update the account with the token;
new UpdateAccountInfoAsyncTask(LoginActivity.this, token, client_id, client_secret, refresh_token, host).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); OwnAccountVM viewModelC = new ViewModelProvider(LoginActivity.this).get(OwnAccountVM.class);
viewModelC.updateCredential(token, client_id, client_secret, refresh_token, host);
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
runOnUiThread(() -> connectionButton.setEnabled(true)); runOnUiThread(() -> connectionButton.setEnabled(true));

View File

@ -17,7 +17,6 @@ package app.fedilab.fedilabtube;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html; import android.text.Html;
@ -51,20 +50,17 @@ import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import app.fedilab.fedilabtube.asynctasks.RetrieveRelationshipAsyncTask;
import app.fedilab.fedilabtube.asynctasks.RetrieveSingleAccountAsyncTask;
import app.fedilab.fedilabtube.client.APIResponse; import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.PeertubeAPI; import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.client.entities.Account; import app.fedilab.fedilabtube.client.entities.Account;
import app.fedilab.fedilabtube.client.entities.Error;
import app.fedilab.fedilabtube.client.entities.Relationship; import app.fedilab.fedilabtube.client.entities.Relationship;
import app.fedilab.fedilabtube.fragment.DisplayAccountsFragment; import app.fedilab.fedilabtube.fragment.DisplayAccountsFragment;
import app.fedilab.fedilabtube.fragment.DisplayStatusFragment; import app.fedilab.fedilabtube.fragment.DisplayStatusFragment;
import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.interfaces.OnRetrieveAccountsInterface; import app.fedilab.fedilabtube.viewmodel.AccountsVM;
import app.fedilab.fedilabtube.interfaces.OnRetrieveRelationshipInterface;
import app.fedilab.fedilabtube.viewmodel.FeedsVM; import app.fedilab.fedilabtube.viewmodel.FeedsVM;
import app.fedilab.fedilabtube.viewmodel.PostActionsVM; import app.fedilab.fedilabtube.viewmodel.PostActionsVM;
import app.fedilab.fedilabtube.viewmodel.RelationshipVM;
import es.dmoral.toasty.Toasty; import es.dmoral.toasty.Toasty;
import static androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY; import static androidx.core.text.HtmlCompat.FROM_HTML_MODE_LEGACY;
@ -72,7 +68,7 @@ import static app.fedilab.fedilabtube.helper.Helper.getLiveInstance;
import static app.fedilab.fedilabtube.helper.Helper.isLoggedIn; import static app.fedilab.fedilabtube.helper.Helper.isLoggedIn;
public class ShowAccountActivity extends AppCompatActivity implements OnRetrieveRelationshipInterface, OnRetrieveAccountsInterface { public class ShowAccountActivity extends AppCompatActivity {
private Button account_follow; private Button account_follow;
@ -85,7 +81,6 @@ public class ShowAccountActivity extends AppCompatActivity implements OnRetrieve
private Account account; private Account account;
private String accountId; private String accountId;
private boolean ischannel; private boolean ischannel;
private AsyncTask<Void, Void, List<Relationship>> retrieveRelationship;
private action doAction; private action doAction;
@Override @Override
@ -120,11 +115,12 @@ public class ShowAccountActivity extends AppCompatActivity implements OnRetrieve
account_note = findViewById(R.id.account_note); account_note = findViewById(R.id.account_note);
AccountsVM viewModel = new ViewModelProvider(ShowAccountActivity.this).get(AccountsVM.class);
if (account != null) { if (account != null) {
manageAccount(); manageAccount();
new RetrieveSingleAccountAsyncTask(ShowAccountActivity.this, account.getAcct(), RetrieveSingleAccountAsyncTask.actionType.CHANNEL, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); viewModel.getAccounts(null, account.getAcct(), AccountsVM.accountFetch.SINGLE_ACCOUNT).observe(ShowAccountActivity.this, this::manageViewAccounts);
} else { } else {
new RetrieveSingleAccountAsyncTask(ShowAccountActivity.this, accountId, RetrieveSingleAccountAsyncTask.actionType.CHANNEL, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); viewModel.getAccounts(null, accountId, AccountsVM.accountFetch.SINGLE_CHANNEL).observe(ShowAccountActivity.this, this::manageViewAccounts);
} }
} }
@ -172,7 +168,8 @@ public class ShowAccountActivity extends AppCompatActivity implements OnRetrieve
String accountIdRelation = account.getAcct(); String accountIdRelation = account.getAcct();
if (isLoggedIn(ShowAccountActivity.this)) { if (isLoggedIn(ShowAccountActivity.this)) {
retrieveRelationship = new RetrieveRelationshipAsyncTask(ShowAccountActivity.this, accountIdRelation, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); RelationshipVM viewModel = new ViewModelProvider(ShowAccountActivity.this).get(RelationshipVM.class);
viewModel.get(accountIdRelation).observe(ShowAccountActivity.this, this::manageVIewRelationship);
} }
setTitle(account.getAcct()); setTitle(account.getAcct());
@ -288,13 +285,13 @@ public class ShowAccountActivity extends AppCompatActivity implements OnRetrieve
} }
@Override public void manageVIewRelationship(APIResponse apiResponse) {
public void onRetrieveRelationship(List<Relationship> relationships, Error error) {
if (error != null) { if (apiResponse.getError() != null) {
Toasty.error(ShowAccountActivity.this, error.getError(), Toast.LENGTH_LONG).show(); Toasty.error(ShowAccountActivity.this, apiResponse.getError().getError(), Toast.LENGTH_LONG).show();
return; return;
} }
List<Relationship> relationships = apiResponse.getRelationships();
this.relationship = relationships.get(0); this.relationship = relationships.get(0);
manageButtonVisibility(); manageButtonVisibility();
@ -358,9 +355,6 @@ public class ShowAccountActivity extends AppCompatActivity implements OnRetrieve
@Override @Override
public void onStop() { public void onStop() {
super.onStop(); super.onStop();
if (retrieveRelationship != null && !retrieveRelationship.isCancelled()) {
retrieveRelationship.cancel(true);
}
} }
@ -379,14 +373,14 @@ public class ShowAccountActivity extends AppCompatActivity implements OnRetrieve
intentBC.putExtras(b); intentBC.putExtras(b);
} }
if (statusAction == PeertubeAPI.StatusAction.UNFOLLOW || statusAction == PeertubeAPI.StatusAction.FOLLOW) { if (statusAction == PeertubeAPI.StatusAction.UNFOLLOW || statusAction == PeertubeAPI.StatusAction.FOLLOW) {
retrieveRelationship = new RetrieveRelationshipAsyncTask(ShowAccountActivity.this, target, ShowAccountActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); RelationshipVM viewModel = new ViewModelProvider(ShowAccountActivity.this).get(RelationshipVM.class);
viewModel.get(target).observe(ShowAccountActivity.this, this::manageVIewRelationship);
} else if (statusAction == PeertubeAPI.StatusAction.MUTE) { } else if (statusAction == PeertubeAPI.StatusAction.MUTE) {
Toasty.info(ShowAccountActivity.this, getString(R.string.muted_done), Toast.LENGTH_LONG).show(); Toasty.info(ShowAccountActivity.this, getString(R.string.muted_done), Toast.LENGTH_LONG).show();
} }
} }
@Override public void manageViewAccounts(APIResponse apiResponse) {
public void onRetrieveAccounts(APIResponse apiResponse) {
if (apiResponse.getAccounts() != null && apiResponse.getAccounts().size() == 1) { if (apiResponse.getAccounts() != null && apiResponse.getAccounts().size() == 1) {
Account account = apiResponse.getAccounts().get(0); Account account = apiResponse.getAccounts().get(0);
if (this.account == null) { if (this.account == null) {

View File

@ -17,7 +17,6 @@ package app.fedilab.fedilabtube;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.webkit.CookieManager; import android.webkit.CookieManager;
@ -29,6 +28,7 @@ import android.widget.ProgressBar;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import org.json.JSONObject; import org.json.JSONObject;
@ -36,9 +36,9 @@ import java.net.URL;
import java.util.HashMap; import java.util.HashMap;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import app.fedilab.fedilabtube.asynctasks.UpdateAccountInfoAsyncTask;
import app.fedilab.fedilabtube.client.HttpsConnection; import app.fedilab.fedilabtube.client.HttpsConnection;
import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.viewmodel.OwnAccountVM;
import app.fedilab.fedilabtube.webview.CustomWebview; import app.fedilab.fedilabtube.webview.CustomWebview;
@ -135,7 +135,8 @@ public class WebviewConnectActivity extends AppCompatActivity {
editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token); editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, token);
editor.putString(Helper.PREF_INSTANCE, new URL(url).getHost()); editor.putString(Helper.PREF_INSTANCE, new URL(url).getHost());
editor.apply(); editor.apply();
new UpdateAccountInfoAsyncTask(WebviewConnectActivity.this, token, clientId, clientSecret, refresh_token, new URL(url).getHost()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); OwnAccountVM viewModelC = new ViewModelProvider(WebviewConnectActivity.this).get(OwnAccountVM.class);
viewModelC.updateCredential(token, clientId, clientSecret, refresh_token, new URL(url).getHost());
finish(); finish();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();

View File

@ -1,57 +0,0 @@
package app.fedilab.fedilabtube.asynctasks;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.content.Context;
import android.os.AsyncTask;
import java.lang.ref.WeakReference;
import java.util.List;
import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.client.entities.Error;
import app.fedilab.fedilabtube.client.entities.Relationship;
import app.fedilab.fedilabtube.interfaces.OnRetrieveRelationshipInterface;
public class RetrieveRelationshipAsyncTask extends AsyncTask<Void, Void, List<Relationship>> {
private String accountId;
private OnRetrieveRelationshipInterface listener;
private Error error;
private WeakReference<Context> contextReference;
public RetrieveRelationshipAsyncTask(Context context, String accountId, OnRetrieveRelationshipInterface onRetrieveRelationshipInterface) {
this.contextReference = new WeakReference<>(context);
this.listener = onRetrieveRelationshipInterface;
this.accountId = accountId;
}
@Override
protected List<Relationship> doInBackground(Void... params) {
PeertubeAPI api = new PeertubeAPI(this.contextReference.get());
List<Relationship> relationships = api.isFollowing(accountId);
error = api.getError();
return relationships;
}
@Override
protected void onPostExecute(List<Relationship> relationships) {
listener.onRetrieveRelationship(relationships, error);
}
}

View File

@ -1,63 +0,0 @@
package app.fedilab.fedilabtube.asynctasks;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.content.Context;
import android.os.AsyncTask;
import java.lang.ref.WeakReference;
import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.interfaces.OnRetrieveAccountsInterface;
public class RetrieveSingleAccountAsyncTask extends AsyncTask<Void, Void, APIResponse> {
private OnRetrieveAccountsInterface listener;
private WeakReference<Context> contextReference;
private String name;
private actionType type;
public RetrieveSingleAccountAsyncTask(Context context, String name, actionType type, OnRetrieveAccountsInterface onRetrieveAccountsInterface) {
this.contextReference = new WeakReference<>(context);
this.name = name;
this.listener = onRetrieveAccountsInterface;
this.type = type;
}
@Override
protected APIResponse doInBackground(Void... params) {
PeertubeAPI peertubeAPI = new PeertubeAPI(this.contextReference.get());
if (type == actionType.ACCOUNT) {
return peertubeAPI.getPeertubeChannel(name);
} else if (type == actionType.CHANNEL) {
return peertubeAPI.getPeertubeChannelInfo(name);
} else {
return null;
}
}
@Override
protected void onPostExecute(APIResponse apiResponse) {
listener.onRetrieveAccounts(apiResponse);
}
public enum actionType {
ACCOUNT,
CHANNEL
}
}

View File

@ -1,110 +0,0 @@
package app.fedilab.fedilabtube.asynctasks;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import java.io.UnsupportedEncodingException;
import java.lang.ref.WeakReference;
import java.net.URLDecoder;
import app.fedilab.fedilabtube.MainActivity;
import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.client.entities.Account;
import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.sqlite.AccountDAO;
import app.fedilab.fedilabtube.sqlite.Sqlite;
public class UpdateAccountInfoAsyncTask extends AsyncTask<Void, Void, Void> {
private String token, client_id, client_secret, refresh_token;
private String host;
private WeakReference<Context> contextReference;
public UpdateAccountInfoAsyncTask(Context context, String token, String client_id, String client_secret, String refresh_token, String host) {
this.contextReference = new WeakReference<>(context);
this.token = token;
this.host = host;
this.client_id = client_id;
this.client_secret = client_secret;
this.refresh_token = refresh_token;
}
@Override
protected Void doInBackground(Void... params) {
Account account;
if (this.contextReference == null) {
return null;
}
String instance;
if (host.startsWith("tube")) {
instance = host;
} else {
instance = Helper.getPeertubeUrl(host);
}
account = new PeertubeAPI(this.contextReference.get()).verifyCredentials(token, instance);
if (account == null)
return null;
try {
//At the state the instance can be encoded
instance = URLDecoder.decode(instance, "utf-8");
} catch (UnsupportedEncodingException ignored) {
}
SharedPreferences sharedpreferences = this.contextReference.get().getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
account.setToken(token);
account.setClient_id(client_id);
account.setClient_secret(client_secret);
account.setRefresh_token(refresh_token);
account.setInstance(instance);
SQLiteDatabase db = Sqlite.getInstance(this.contextReference.get().getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
boolean userExists = new AccountDAO(this.contextReference.get(), db).userExist(account);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_KEY_ID, account.getId());
editor.putBoolean(Helper.PREF_IS_MODERATOR, account.isModerator());
editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, account.isAdmin());
if (!host.startsWith("tube")) {
editor.putString(Helper.PREF_INSTANCE, host);
}
editor.apply();
if (userExists)
new AccountDAO(this.contextReference.get(), db).updateAccountCredential(account);
else {
if (account.getUsername() != null && account.getCreated_at() != null)
new AccountDAO(this.contextReference.get(), db).insertAccount(account);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
if (this.contextReference.get() != null) {
Intent mainActivity = new Intent(this.contextReference.get(), MainActivity.class);
mainActivity.putExtra(Helper.INTENT_ACTION, Helper.ADD_USER_INTENT);
this.contextReference.get().startActivity(mainActivity);
((Activity) this.contextReference.get()).finish();
}
}
}

View File

@ -23,6 +23,7 @@ import app.fedilab.fedilabtube.client.entities.Peertube;
import app.fedilab.fedilabtube.client.entities.PeertubeNotification; import app.fedilab.fedilabtube.client.entities.PeertubeNotification;
import app.fedilab.fedilabtube.client.entities.Playlist; import app.fedilab.fedilabtube.client.entities.Playlist;
import app.fedilab.fedilabtube.client.entities.PlaylistElement; import app.fedilab.fedilabtube.client.entities.PlaylistElement;
import app.fedilab.fedilabtube.client.entities.Relationship;
import app.fedilab.fedilabtube.client.entities.Status; import app.fedilab.fedilabtube.client.entities.Status;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@ -35,6 +36,7 @@ public class APIResponse {
private List<PeertubeNotification> peertubeNotifications = null; private List<PeertubeNotification> peertubeNotifications = null;
private List<Playlist> playlists = null; private List<Playlist> playlists = null;
private List<String> domains = null; private List<String> domains = null;
private List<Relationship> relationships = null;
private Error error = null; private Error error = null;
private String since_id, max_id; private String since_id, max_id;
private List<PlaylistElement> playlistForVideos; private List<PlaylistElement> playlistForVideos;
@ -159,4 +161,12 @@ public class APIResponse {
public void setStatusCode(int statusCode) { public void setStatusCode(int statusCode) {
this.statusCode = statusCode; this.statusCode = statusCode;
} }
public List<Relationship> getRelationships() {
return relationships;
}
public void setRelationships(List<Relationship> relationships) {
this.relationships = relationships;
}
} }

View File

@ -1,21 +0,0 @@
package app.fedilab.fedilabtube.interfaces;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import app.fedilab.fedilabtube.client.APIResponse;
public interface OnRetrieveAccountsInterface {
void onRetrieveAccounts(APIResponse apiResponse);
}

View File

@ -1,24 +0,0 @@
package app.fedilab.fedilabtube.interfaces;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import java.util.List;
import app.fedilab.fedilabtube.client.entities.Error;
import app.fedilab.fedilabtube.client.entities.Relationship;
public interface OnRetrieveRelationshipInterface {
void onRetrieveRelationship(List<Relationship> relationships, Error error);
}

View File

@ -0,0 +1,107 @@
package app.fedilab.fedilabtube.viewmodel;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import app.fedilab.fedilabtube.MainActivity;
import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.client.entities.Account;
import app.fedilab.fedilabtube.helper.Helper;
import app.fedilab.fedilabtube.sqlite.AccountDAO;
import app.fedilab.fedilabtube.sqlite.Sqlite;
public class OwnAccountVM extends AndroidViewModel {
private MutableLiveData<APIResponse> apiResponseMutableLiveData;
private Application application;
public OwnAccountVM(@NonNull Application application) {
super(application);
this.application = application;
}
public LiveData<APIResponse> updateCredential(String token, String client_id, String client_secret, String refresh_token, String host) {
if (apiResponseMutableLiveData == null) {
apiResponseMutableLiveData = new MutableLiveData<>();
Context _mContext = this.application.getApplicationContext();
new Thread(() -> {
Account account;
String instance;
if (host.startsWith("tube")) {
instance = host;
} else {
instance = Helper.getPeertubeUrl(host);
}
account = new PeertubeAPI(_mContext).verifyCredentials(token, instance);
if (account == null)
return;
try {
//At the state the instance can be encoded
instance = URLDecoder.decode(instance, "utf-8");
} catch (UnsupportedEncodingException ignored) {
}
SharedPreferences sharedpreferences = _mContext.getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
account.setToken(token);
account.setClient_id(client_id);
account.setClient_secret(client_secret);
account.setRefresh_token(refresh_token);
account.setInstance(instance);
SQLiteDatabase db = Sqlite.getInstance(_mContext.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
boolean userExists = new AccountDAO(_mContext, db).userExist(account);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_KEY_ID, account.getId());
editor.putBoolean(Helper.PREF_IS_MODERATOR, account.isModerator());
editor.putBoolean(Helper.PREF_IS_ADMINISTRATOR, account.isAdmin());
if (!host.startsWith("tube")) {
editor.putString(Helper.PREF_INSTANCE, host);
}
editor.apply();
if (userExists)
new AccountDAO(_mContext, db).updateAccountCredential(account);
else {
if (account.getUsername() != null && account.getCreated_at() != null)
new AccountDAO(_mContext, db).insertAccount(account);
}
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> {
Intent mainActivity = new Intent(_mContext, MainActivity.class);
mainActivity.putExtra(Helper.INTENT_ACTION, Helper.ADD_USER_INTENT);
_mContext.startActivity(mainActivity);
((Activity) _mContext).finish();
};
mainHandler.post(myRunnable);
}).start();
}
return apiResponseMutableLiveData;
}
}

View File

@ -0,0 +1,71 @@
package app.fedilab.fedilabtube.viewmodel;
/* Copyright 2020 Thomas Schneider
*
* This file is a part of TubeLab
*
* 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.
*
* TubeLab 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 TubeLab; if not,
* see <http://www.gnu.org/licenses>. */
import android.app.Application;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import java.util.List;
import app.fedilab.fedilabtube.client.APIResponse;
import app.fedilab.fedilabtube.client.PeertubeAPI;
import app.fedilab.fedilabtube.client.entities.Error;
import app.fedilab.fedilabtube.client.entities.Relationship;
public class RelationshipVM extends AndroidViewModel {
private MutableLiveData<APIResponse> apiResponseMutableLiveData;
private Application application;
public RelationshipVM(@NonNull Application application) {
super(application);
this.application = application;
}
public LiveData<APIResponse> get(String targetedId) {
if (apiResponseMutableLiveData == null) {
apiResponseMutableLiveData = new MutableLiveData<>();
getRelationShip(targetedId);
}
return apiResponseMutableLiveData;
}
private void getRelationShip(String targetedId) {
Context _mContext = this.application.getApplicationContext();
new Thread(() -> {
try {
PeertubeAPI api = new PeertubeAPI(_mContext);
List<Relationship> relationships = api.isFollowing(targetedId);
Error error = api.getError();
APIResponse apiResponse = new APIResponse();
apiResponse.setRelationships(relationships);
apiResponse.setError(error);
Handler mainHandler = new Handler(Looper.getMainLooper());
Runnable myRunnable = () -> apiResponseMutableLiveData.setValue(apiResponse);
mainHandler.post(myRunnable);
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}