diff --git a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAccountsService.java b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAccountsService.java index 50abe4f2..0f742360 100644 --- a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAccountsService.java +++ b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonAccountsService.java @@ -153,6 +153,7 @@ public interface MastodonAccountsService { @Path("id") String id ); + //Get Identity proofs @GET("accounts/{id}/identity_proofs") Call> getIdentityProofs( diff --git a/app/src/main/java/app/fedilab/android/client/endpoints/MastodonTagService.java b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonTagService.java new file mode 100644 index 00000000..351e379a --- /dev/null +++ b/app/src/main/java/app/fedilab/android/client/endpoints/MastodonTagService.java @@ -0,0 +1,53 @@ +package app.fedilab.android.client.endpoints; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * 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. + * + * Fedilab 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 Fedilab; if not, + * see . */ + + +import java.util.List; + +import app.fedilab.android.client.entities.api.Tag; +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Header; +import retrofit2.http.POST; +import retrofit2.http.Path; +import retrofit2.http.Query; + +public interface MastodonTagService { + + //Get followed tags + @GET("followed_tags") + Call> getFollowedTags( + @Header("Authorization") String token, + @Query("max_id") String max_id, + @Query("since_id") String since_id, + @Query("min_id") String min_id, + @Query("limit") int limit + ); + + //Follow tag + @POST("tags/{name}/follow") + Call follow( + @Header("Authorization") String app_token, + @Path("name") String name + ); + + //Unfollow tag + @POST("tags/{name}/unfollow") + Call unfollow( + @Header("Authorization") String app_token, + @Path("name") String name + ); +} diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Tag.java b/app/src/main/java/app/fedilab/android/client/entities/api/Tag.java index 7c29dc45..d579dc43 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Tag.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Tag.java @@ -27,7 +27,8 @@ public class Tag implements Serializable { public String url; @SerializedName("history") public List history; - + @SerializedName("following") + public boolean following = false; public int getWeight() { int weight = 0; diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Tags.java b/app/src/main/java/app/fedilab/android/client/entities/api/Tags.java new file mode 100644 index 00000000..963bfae1 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Tags.java @@ -0,0 +1,22 @@ +package app.fedilab.android.client.entities.api; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * 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. + * + * Fedilab 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 Fedilab; if not, + * see . */ + +import java.util.List; + +public class Tags { + public Pagination pagination = new Pagination(); + public List tags; +} diff --git a/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TagVM.java b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TagVM.java new file mode 100644 index 00000000..8f9b5af3 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/viewmodel/mastodon/TagVM.java @@ -0,0 +1,172 @@ +package app.fedilab.android.viewmodel.mastodon; +/* Copyright 2022 Thomas Schneider + * + * This file is a part of Fedilab + * + * 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. + * + * Fedilab 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 Fedilab; if not, + * see . */ + +import android.app.Application; +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 java.util.concurrent.TimeUnit; + +import app.fedilab.android.client.endpoints.MastodonTagService; +import app.fedilab.android.client.entities.api.Pagination; +import app.fedilab.android.client.entities.api.Status; +import app.fedilab.android.client.entities.api.Statuses; +import app.fedilab.android.client.entities.api.Tag; +import app.fedilab.android.client.entities.api.Tags; +import app.fedilab.android.helper.Helper; +import app.fedilab.android.helper.MastodonHelper; +import okhttp3.OkHttpClient; +import retrofit2.Call; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + + +public class TagVM extends AndroidViewModel { + + final OkHttpClient okHttpClient = new OkHttpClient.Builder() + .readTimeout(60, TimeUnit.SECONDS) + .connectTimeout(60, TimeUnit.SECONDS) + .callTimeout(60, TimeUnit.SECONDS) + .proxy(Helper.getProxy(getApplication().getApplicationContext())) + .build(); + + private MutableLiveData tagsMutableLiveData; + private MutableLiveData tagMutableLiveData; + + + /** + * Constructor - String token can be for the app or the account + * + * @param application Application + */ + public TagVM(@NonNull Application application) { + super(application); + } + + private MastodonTagService init(String instance) { + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("https://" + instance + "/api/v1/") + .addConverterFactory(GsonConverterFactory.create(Helper.getDateBuilder())) + .client(okHttpClient) + .build(); + return retrofit.create(MastodonTagService.class); + } + + + /** + * Return followed tags with pagination + * + * @return {@link LiveData} containing a {@link Statuses}. Note: Not to be confused with {@link Status} + */ + public LiveData followedTags(@NonNull String instance, String token, + String maxId, + String sinceId, + String minId, + int count) { + tagsMutableLiveData = new MutableLiveData<>(); + MastodonTagService mastodonTagService = init(instance); + new Thread(() -> { + List tagList = null; + Pagination pagination = null; + Call> followedTagsListCall = mastodonTagService.getFollowedTags(token, maxId, sinceId, minId, count); + if (followedTagsListCall != null) { + try { + Response> tagsResponse = followedTagsListCall.execute(); + if (tagsResponse.isSuccessful()) { + tagList = tagsResponse.body(); + pagination = MastodonHelper.getPagination(tagsResponse.headers()); + + } + } catch (Exception e) { + e.printStackTrace(); + } + } + Tags tags = new Tags(); + tags.pagination = pagination; + tags.tags = tagList; + Handler mainHandler = new Handler(Looper.getMainLooper()); + Runnable myRunnable = () -> tagsMutableLiveData.setValue(tags); + mainHandler.post(myRunnable); + }).start(); + return tagsMutableLiveData; + } + + /** + * Follow a tag + * + * @return {@link LiveData} containing an {@link Tag} + */ + public LiveData follow(@NonNull String instance, String token, String name) { + MastodonTagService mastodonTagService = init(instance); + tagMutableLiveData = new MutableLiveData<>(); + new Thread(() -> { + Tag tag = null; + Call tagCall = mastodonTagService.follow(token, name); + if (tagCall != null) { + try { + Response appResponse = tagCall.execute(); + if (appResponse.isSuccessful()) { + tag = appResponse.body(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + Handler mainHandler = new Handler(Looper.getMainLooper()); + Tag finalTag = tag; + Runnable myRunnable = () -> tagMutableLiveData.setValue(finalTag); + mainHandler.post(myRunnable); + }).start(); + return tagMutableLiveData; + } + + /** + * Unfollow a tag + * + * @return {@link LiveData} containing an {@link Tag} + */ + public LiveData unfollow(@NonNull String instance, String token, String name) { + MastodonTagService mastodonTagService = init(instance); + tagMutableLiveData = new MutableLiveData<>(); + new Thread(() -> { + Tag tag = null; + Call tagCall = mastodonTagService.unfollow(token, name); + if (tagCall != null) { + try { + Response appResponse = tagCall.execute(); + if (appResponse.isSuccessful()) { + tag = appResponse.body(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + Handler mainHandler = new Handler(Looper.getMainLooper()); + Tag finalTag = tag; + Runnable myRunnable = () -> tagMutableLiveData.setValue(finalTag); + mainHandler.post(myRunnable); + }).start(); + return tagMutableLiveData; + } + +}