diff --git a/app/src/acad/res/values/colors.xml b/app/src/acad/res/values/colors.xml index 0db596c..41d179b 100644 --- a/app/src/acad/res/values/colors.xml +++ b/app/src/acad/res/values/colors.xml @@ -10,4 +10,5 @@ #F44336 #DD000000 #F44336 + #80808080 \ No newline at end of file diff --git a/app/src/acad/res/values/strings.xml b/app/src/acad/res/values/strings.xml index 897dc22..f8578df 100644 --- a/app/src/acad/res/values/strings.xml +++ b/app/src/acad/res/values/strings.xml @@ -304,6 +304,12 @@ Moyenne Faible + + Illimité + Mo + Go + Total du quota vidéo + Quota vidéo journalier Contenu explicite ou sensible Cette vidéo contient du contenu sensible. Êtes-vous sûr·e de vouloir la regarder ? Lecture automatique diff --git a/app/src/full/res/values/colors.xml b/app/src/full/res/values/colors.xml index 0cf97a5..8d944f0 100644 --- a/app/src/full/res/values/colors.xml +++ b/app/src/full/res/values/colors.xml @@ -9,4 +9,5 @@ #F44336 #DD000000 #F44336 + #80808080 \ No newline at end of file diff --git a/app/src/full/res/values/strings.xml b/app/src/full/res/values/strings.xml index 1fa8b3d..b190628 100644 --- a/app/src/full/res/values/strings.xml +++ b/app/src/full/res/values/strings.xml @@ -160,6 +160,11 @@ Mute + Unlimited + MB + GB + Total video quota + Daily video quota Mature or explicit content This video contains mature or explicit content. Are you sure you want to watch it? diff --git a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java index 32e11fd..8c477ac 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/MainActivity.java @@ -85,6 +85,7 @@ public class MainActivity extends AppCompatActivity { public static int PICK_INSTANCE = 5641; public static int PICK_INSTANCE_SURF = 5642; public static UserMe userMe; + public static InstanceData.InstanceConfig instanceConfig; public static TypeOfConnection typeOfConnection; final FragmentManager fm = getSupportFragmentManager(); Fragment active; @@ -337,6 +338,7 @@ public class MainActivity extends AppCompatActivity { editor.apply(); } } + instanceConfig = new RetrofitPeertubeAPI(MainActivity.this).getConfigInstance(); } catch (Error error) { runOnUiThread(() -> Helper.logoutCurrentUser(MainActivity.this, finalAccount)); error.printStackTrace(); diff --git a/app/src/main/java/app/fedilab/fedilabtube/PeertubeUploadActivity.java b/app/src/main/java/app/fedilab/fedilabtube/PeertubeUploadActivity.java index 9b6c3dd..1af05cd 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/PeertubeUploadActivity.java +++ b/app/src/main/java/app/fedilab/fedilabtube/PeertubeUploadActivity.java @@ -23,6 +23,7 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Color; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.view.MenuItem; import android.view.View; @@ -49,15 +50,19 @@ import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import app.fedilab.fedilabtube.client.APIResponse; +import app.fedilab.fedilabtube.client.RetrofitPeertubeAPI; import app.fedilab.fedilabtube.client.data.ChannelData; +import app.fedilab.fedilabtube.client.entities.UserMe; import app.fedilab.fedilabtube.databinding.ActivityPeertubeUploadBinding; import app.fedilab.fedilabtube.helper.Helper; import app.fedilab.fedilabtube.viewmodel.ChannelsVM; import es.dmoral.toasty.Toasty; +import static app.fedilab.fedilabtube.MainActivity.userMe; import static app.fedilab.fedilabtube.client.RetrofitPeertubeAPI.DataType.MY_CHANNELS; import static app.fedilab.fedilabtube.helper.Helper.peertubeInformation; @@ -86,6 +91,56 @@ public class PeertubeUploadActivity extends AppCompatActivity { setContentView(view); + new Thread(() -> { + UserMe.VideoQuota videoQuotaReply = new RetrofitPeertubeAPI(PeertubeUploadActivity.this).getVideoQuota(); + runOnUiThread(() -> { + if (videoQuotaReply != null) { + long videoQuota = videoQuotaReply.getVideoQuotaUsed(); + long dailyQuota = videoQuotaReply.getVideoQuotaUsedDaily(); + long instanceVideoQuota = userMe.getVideoQuota(); + long instanceDailyQuota = userMe.getVideoQuotaDaily(); + + if (instanceVideoQuota != -1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + binding.totalQuota.setProgress((int) (videoQuota * 100 / instanceVideoQuota), true); + } else { + binding.totalQuota.setProgress((int) (videoQuota * 100 / instanceVideoQuota)); + } + } else { + int progress = videoQuota > 0 ? 30 : 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + binding.totalQuota.setProgress(progress, true); + } else { + binding.totalQuota.setProgress(progress); + } + } + if (instanceDailyQuota != -1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + binding.dailyQuota.setProgress((int) (dailyQuota * 100 / instanceDailyQuota), true); + } else { + binding.dailyQuota.setProgress((int) (dailyQuota * 100 / instanceDailyQuota)); + } + } else { + int progress = dailyQuota > 0 ? 30 : 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + binding.dailyQuota.setProgress(progress, true); + } else { + binding.dailyQuota.setProgress(progress); + } + } + binding.totalQuotaValue.setText( + String.format(Locale.getDefault(), "%s/%s", + Helper.returnRoundedSize(PeertubeUploadActivity.this, videoQuota), + Helper.returnRoundedSize(PeertubeUploadActivity.this, instanceVideoQuota))); + binding.dailyQuotaValue.setText( + String.format(Locale.getDefault(), "%s/%s", + Helper.returnRoundedSize(PeertubeUploadActivity.this, dailyQuota), + Helper.returnRoundedSize(PeertubeUploadActivity.this, instanceDailyQuota))); + } + }); + }).start(); + + ChannelsVM viewModelC = new ViewModelProvider(PeertubeUploadActivity.this).get(ChannelsVM.class); viewModelC.get(MY_CHANNELS, null).observe(PeertubeUploadActivity.this, this::manageVIewChannels); channels = new HashMap<>(); diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeService.java b/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeService.java index e2a3221..b240da3 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeService.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/PeertubeService.java @@ -70,6 +70,10 @@ public interface PeertubeService { @GET("config/about") Call configAbout(); + //Instance config + @GET("config") + Call config(); + @GET("{nodeInfoPath}") Call getNodeinfo(@Path(value = "nodeInfoPath", encoded = true) String nodeInfoPath); @@ -120,6 +124,9 @@ public interface PeertubeService { Call verifyCredentials(@Header("Authorization") String credentials); + @GET("users/me/video-quota-used") + Call getVideoQuota(@Header("Authorization") String credentials); + @FormUrlEncoded @PUT("videos/{id}/watching") Call addToHistory( diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java b/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java index 2aaca53..ee4ecbb 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/RetrofitPeertubeAPI.java @@ -677,6 +677,47 @@ public class RetrofitPeertubeAPI { return null; } + /** + * Config of the instance + * + * @return InstanceConfig + */ + public InstanceData.InstanceConfig getConfigInstance() { + + PeertubeService peertubeService = init(); + Call config = peertubeService.config(); + try { + Response response = config.execute(); + if (response.isSuccessful() && response.body() != null) { + return response.body(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + + /** + * Get video quota + * + * @return UserMe.VideoQuota + */ + public UserMe.VideoQuota getVideoQuota() { + + PeertubeService peertubeService = init(); + Call videoQuotaCall = peertubeService.getVideoQuota(getToken()); + try { + Response response = videoQuotaCall.execute(); + if (response.isSuccessful() && response.body() != null) { + return response.body(); + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + /** * Returns informations about Peertube such privacies, licenses, etc. * diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/data/InstanceData.java b/app/src/main/java/app/fedilab/fedilabtube/client/data/InstanceData.java index 59eff4c..e864958 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/data/InstanceData.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/data/InstanceData.java @@ -343,5 +343,42 @@ public class InstanceData { parcel.writeString(host); } } + + + public static class InstanceConfig { + @SerializedName("user") + private User user; + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + } + + public static class User { + @SerializedName("videoQuota") + private long videoQuota; + @SerializedName("videoQuotaDaily") + private long videoQuotaDaily; + + public long getVideoQuota() { + return videoQuota; + } + + public void setVideoQuota(long videoQuota) { + this.videoQuota = videoQuota; + } + + public long getVideoQuotaDaily() { + return videoQuotaDaily; + } + + public void setVideoQuotaDaily(long videoQuotaDaily) { + this.videoQuotaDaily = videoQuotaDaily; + } + } } diff --git a/app/src/main/java/app/fedilab/fedilabtube/client/entities/UserMe.java b/app/src/main/java/app/fedilab/fedilabtube/client/entities/UserMe.java index 7e2656d..5d0d034 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/client/entities/UserMe.java +++ b/app/src/main/java/app/fedilab/fedilabtube/client/entities/UserMe.java @@ -66,9 +66,9 @@ public class UserMe { @SerializedName("videoLanguages") private List videoLanguages; @SerializedName("videoQuota") - private String videoQuota; + private long videoQuota; @SerializedName("videoQuotaDaily") - private String videoQuotaDaily; + private long videoQuotaDaily; @SerializedName("videosHistoryEnabled") private boolean videosHistoryEnabled; @SerializedName("webTorrentEnabled") @@ -226,19 +226,19 @@ public class UserMe { this.videoLanguages = videoLanguages; } - public String getVideoQuota() { + public long getVideoQuota() { return videoQuota; } - public void setVideoQuota(String videoQuota) { + public void setVideoQuota(long videoQuota) { this.videoQuota = videoQuota; } - public String getVideoQuotaDaily() { + public long getVideoQuotaDaily() { return videoQuotaDaily; } - public void setVideoQuotaDaily(String videoQuotaDaily) { + public void setVideoQuotaDaily(long videoQuotaDaily) { this.videoQuotaDaily = videoQuotaDaily; } @@ -279,4 +279,27 @@ public class UserMe { this.avatar = avatar; } } + + public static class VideoQuota { + @SerializedName("videoQuotaUsed") + private long videoQuotaUsed; + @SerializedName("videoQuotaUsedDaily") + private long videoQuotaUsedDaily; + + public long getVideoQuotaUsed() { + return videoQuotaUsed; + } + + public void setVideoQuotaUsed(long videoQuotaUsed) { + this.videoQuotaUsed = videoQuotaUsed; + } + + public long getVideoQuotaUsedDaily() { + return videoQuotaUsedDaily; + } + + public void setVideoQuotaUsedDaily(long videoQuotaUsedDaily) { + this.videoQuotaUsedDaily = videoQuotaUsedDaily; + } + } } diff --git a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java index da057bb..01e0b03 100644 --- a/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java +++ b/app/src/main/java/app/fedilab/fedilabtube/helper/Helper.java @@ -53,6 +53,7 @@ import com.bumptech.glide.request.RequestOptions; import java.net.InetAddress; import java.text.DateFormat; +import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -123,7 +124,6 @@ public class Helper { public static final String PREF_KEY_ID = "userID"; public static final String PREF_KEY_NAME = "my_user_name"; public static final String PREF_INSTANCE = "instance"; - public static final String PREF_INSTANCE_SURF = "instance_surf"; public static final int EXTERNAL_STORAGE_REQUEST_CODE = 84; public static final String SET_VIDEOS_PER_PAGE = "set_videos_per_page"; public static final String VIDEO_ID = "video_id_update"; @@ -794,4 +794,18 @@ public class Helper { return false; } } + + public static String returnRoundedSize(Context context, long size) { + if (size == -1) { + return context.getString(R.string.unlimited); + } else if (size > 1000000000) { + float rounded = (float) size / 1000000000; + DecimalFormat df = new DecimalFormat("#.#"); + return String.format(Locale.getDefault(), "%s%s", df.format(rounded), context.getString(R.string.gb)); + } else { + float rounded = (float) size / 1000000; + DecimalFormat df = new DecimalFormat("#.#"); + return String.format(Locale.getDefault(), "%s%s", df.format(rounded), context.getString(R.string.mb)); + } + } } diff --git a/app/src/main/res/drawable/progress_bar.xml b/app/src/main/res/drawable/progress_bar.xml new file mode 100644 index 0000000..0449550 --- /dev/null +++ b/app/src/main/res/drawable/progress_bar.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_peertube_upload.xml b/app/src/main/res/layout/activity_peertube_upload.xml index 29d023e..d7f1269 100644 --- a/app/src/main/res/layout/activity_peertube_upload.xml +++ b/app/src/main/res/layout/activity_peertube_upload.xml @@ -26,7 +26,70 @@ android:layout_marginTop="50dp" android:orientation="vertical"> + + + + + + + + + + + + + + + + + + +