Compare commits
51 Commits
Author | SHA1 | Date |
---|---|---|
semantic-release-bot | 3b88b039e9 | |
Stefan Schüller | 3915cc1bbb | |
Stefan Schüller | d98bf8c9a4 | |
Stefan Schüller | cb67a09604 | |
Stefan Schüller | cef0043693 | |
semantic-release-bot | 9839ed928b | |
Stefan Schüller | fe187e546d | |
semantic-release-bot | 7881b56b77 | |
Stefan Schüller | 064ec44d53 | |
Stefan Schüller | 2401de99a1 | |
Stefan Schüller | a31cd5494f | |
Stefan Schüller | 1d59aed5e7 | |
Stefan Schüller | 21261b0d09 | |
Petter Reinholdtsen | 7aee68213d | |
Nikita Epifanov | 5f16f194ab | |
Petter Reinholdtsen | 1468d9c490 | |
Jonathan Soares | 527c38584b | |
Jonathan Soares | 78adff6779 | |
Maxime Leroy | a2f5882211 | |
Digiwizkid | dba93fa9e8 | |
SC | aee7c1e32e | |
Stefan | f1640cfaa9 | |
Dave Heineman | 0a48cb5016 | |
Besnik Bleta | faa840a30f | |
Besnik Bleta | ca6c4da6e6 | |
Besnik Bleta | e3121769b5 | |
J. Lavoie | 5e28585fea | |
J. Lavoie | 8a2782a32b | |
Jeff Huang | e1be0e8a9f | |
J. Lavoie | 797fe99831 | |
Rex_sa | 89f978e3d4 | |
Allan Nordhøy | 0c51070f37 | |
Allan Nordhøy | 90b99c2437 | |
SC | 33e6fbb827 | |
Ihor Hordiichuk | 0153ff1a90 | |
GunChleoc | 80e67eebae | |
Sebastian Wilhelm Zarejko | db39e9442d | |
Software In Interlingua | 699da52489 | |
gnu-ewm | 270da310f7 | |
semantic-release-bot | 6a6405ccdc | |
Stefan Schüller | eb3b1eb7ad | |
Stefan Schüller | 04db4ceb7f | |
digiwizkid | c23c17d2ef | |
digiwizkid | 96ec510f40 | |
digiwizkid | c7893ddd38 | |
ssantos | 530b97979e | |
ssantos | abdcb87c3e | |
Stefan Schüller | 4b1efade40 | |
semantic-release-bot | 55a9acccd8 | |
Stefan Schüller | d37c788653 | |
Stefan Schüller | 1d25be1bde |
69
CHANGELOG.md
69
CHANGELOG.md
|
@ -1,3 +1,72 @@
|
|||
## 1.12.2 (2022-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Removed videos, fastlane cant upload them d98bf8c
|
||||
* Update fastlane cef0043
|
||||
|
||||
## 1.12.1 (2022-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Too long play store update notes fe187e5
|
||||
|
||||
# 1.12.0 (2022-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **lang:** Weblate translation (Albanian) faa840a
|
||||
* **lang:** Weblate translation (Albanian) e312176
|
||||
* **lang:** Weblate translation (French) a2f5882
|
||||
* **lang:** Weblate translation (Portuguese (Brazil)) 527c385
|
||||
* **lang:** Weblate translation (Portuguese) 33e6fbb
|
||||
* **lang:** Weblate translation (Portuguese) 530b979
|
||||
* **lang:** Weblate translation (Albanian) ca6c4da
|
||||
* **lang:** Weblate translation (Arabic) 89f978e
|
||||
* **lang:** Weblate translation (Bengali) dba93fa
|
||||
* **lang:** Weblate translation (Chinese (Traditional)) e1be0e8
|
||||
* **lang:** Weblate translation (English) 90b99c2
|
||||
* **lang:** Weblate translation (French) 797fe99
|
||||
* **lang:** Weblate translation (Gaelic) 80e67ee
|
||||
* **lang:** Weblate translation (German) 8a2782a
|
||||
* **lang:** Weblate translation (Italian) 5e28585
|
||||
* **lang:** Weblate translation (Norwegian Bokmål) 7aee682
|
||||
* **lang:** Weblate translation (Norwegian Bokmål) 1468d9c
|
||||
* **lang:** Weblate translation (Norwegian Bokmål) 0c51070
|
||||
* **lang:** Weblate translation (Polish) db39e94
|
||||
* **lang:** Weblate translation (Polish) 270da31
|
||||
* **lang:** Weblate translation (Portuguese (Brazil)) 78adff6
|
||||
* **lang:** Weblate translation (Portuguese) aee7c1e
|
||||
* **lang:** Weblate translation (Portuguese) abdcb87
|
||||
* **lang:** Weblate translation (Russian) 5f16f19
|
||||
* **lang:** Weblate translation (Ukrainian) 0153ff1
|
||||
* Remove unsupported play store language pt a31cd54
|
||||
* set required (im)mutable flag when creating pending intent 0a48cb5
|
||||
* Shortened too long title fr-FR 2401de9
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **lang:** Added translation using Weblate (Interlingua) 699da52
|
||||
* weblate merge 21261b0
|
||||
|
||||
# 1.11.0 (2022-01-09)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Open playlist video in player, string update c23c17d
|
||||
|
||||
## 1.10.4 (2022-01-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Temp removal of videos in fastlane config 1d25be1
|
||||
|
||||
## 1.10.3 (2022-01-02)
|
||||
|
||||
|
||||
|
|
|
@ -4,14 +4,15 @@
|
|||
2. Locally switch to develop
|
||||
3. Pull github develop
|
||||
4. Pull weblate develop
|
||||
5. Push to develop gitlab and github
|
||||
5. Push to develop gitlab
|
||||
6. Merge develop into master and merge
|
||||
7. Wait for Release Build and release to play store
|
||||
8. Wait for gitlab -> github sync
|
||||
9. Run publishGithub
|
||||
10. Merge master into develop, push to github
|
||||
|
||||
|
||||
## fastlane update
|
||||
## fastlane update (install ruby2.7 and "gem-2.7 install bundler")
|
||||
```
|
||||
bundle update
|
||||
bundle-2.7 update
|
||||
```
|
|
@ -1,6 +1,5 @@
|
|||
FROM gradle:7-jdk16
|
||||
|
||||
|
||||
# get link at bottom of https://developer.android.com/studio
|
||||
ENV ANDROID_SDK_URL https://dl.google.com/android/repository/commandlinetools-linux-7583922_latest.zip
|
||||
ENV ANDROID_SDK_CHECKSUM 124f2d5115eee365df6cf3228ffbca6fc3911d16f8025bebd5b1c6e2fcfa7faf
|
||||
|
|
60
Gemfile.lock
60
Gemfile.lock
|
@ -8,23 +8,23 @@ GEM
|
|||
artifactory (3.0.15)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.2.0)
|
||||
aws-partitions (1.543.0)
|
||||
aws-sdk-core (3.125.0)
|
||||
aws-partitions (1.573.0)
|
||||
aws-sdk-core (3.130.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.525.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.53.0)
|
||||
aws-sdk-core (~> 3, >= 3.125.0)
|
||||
aws-sdk-kms (1.55.0)
|
||||
aws-sdk-core (~> 3, >= 3.127.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.110.0)
|
||||
aws-sdk-core (~> 3, >= 3.125.0)
|
||||
aws-sdk-s3 (1.113.0)
|
||||
aws-sdk-core (~> 3, >= 3.127.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.4)
|
||||
aws-sigv4 (1.4.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
claide (1.0.3)
|
||||
claide (1.1.0)
|
||||
colored (1.2)
|
||||
colored2 (3.1.2)
|
||||
commander (4.6.0)
|
||||
|
@ -36,17 +36,18 @@ GEM
|
|||
unf (>= 0.0.5, < 1.0.0)
|
||||
dotenv (2.7.6)
|
||||
emoji_regex (3.2.3)
|
||||
excon (0.89.0)
|
||||
faraday (1.8.0)
|
||||
excon (0.92.2)
|
||||
faraday (1.10.0)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
faraday-httpclient (~> 1.0.1)
|
||||
faraday-httpclient (~> 1.0)
|
||||
faraday-multipart (~> 1.0)
|
||||
faraday-net_http (~> 1.0)
|
||||
faraday-net_http_persistent (~> 1.1)
|
||||
faraday-net_http_persistent (~> 1.0)
|
||||
faraday-patron (~> 1.0)
|
||||
faraday-rack (~> 1.0)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
faraday-retry (~> 1.0)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-cookie_jar (0.0.7)
|
||||
faraday (>= 0.8.0)
|
||||
|
@ -55,14 +56,17 @@ GEM
|
|||
faraday-em_synchrony (1.0.0)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-multipart (1.0.3)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday-rack (1.0.0)
|
||||
faraday-retry (1.0.3)
|
||||
faraday_middleware (1.2.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.6)
|
||||
fastlane (2.199.0)
|
||||
fastlane (2.205.1)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.8, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
|
@ -102,9 +106,9 @@ GEM
|
|||
xcpretty (~> 0.3.0)
|
||||
xcpretty-travis-formatter (>= 0.0.3)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.14.0)
|
||||
google-apis-androidpublisher_v3 (0.17.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-core (0.4.1)
|
||||
google-apis-core (0.4.2)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
|
@ -113,19 +117,19 @@ GEM
|
|||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
webrick
|
||||
google-apis-iamcredentials_v1 (0.9.0)
|
||||
google-apis-iamcredentials_v1 (0.10.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.6.0)
|
||||
google-apis-playcustomapp_v1 (0.7.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-storage_v1 (0.10.0)
|
||||
google-apis-storage_v1 (0.11.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.5.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
google-cloud-env (1.6.0)
|
||||
faraday (>= 0.17.3, < 3.0)
|
||||
google-cloud-errors (1.2.0)
|
||||
google-cloud-storage (1.35.0)
|
||||
google-cloud-storage (1.36.1)
|
||||
addressable (~> 2.8)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
|
@ -133,8 +137,8 @@ GEM
|
|||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (1.1.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
googleauth (1.1.2)
|
||||
faraday (>= 0.17.3, < 3.a)
|
||||
jwt (>= 1.4, < 3.0)
|
||||
memoist (~> 0.16)
|
||||
multi_json (~> 1.11)
|
||||
|
@ -144,7 +148,7 @@ GEM
|
|||
http-cookie (1.0.4)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.4.0)
|
||||
jmespath (1.6.1)
|
||||
json (2.6.1)
|
||||
jwt (2.3.0)
|
||||
memoist (0.16.2)
|
||||
|
@ -169,9 +173,9 @@ GEM
|
|||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
security (0.1.3)
|
||||
signet (0.16.0)
|
||||
signet (0.16.1)
|
||||
addressable (~> 2.8)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
faraday (>= 0.17.5, < 3.0)
|
||||
jwt (>= 1.5, < 3.0)
|
||||
multi_json (~> 1.10)
|
||||
simctl (1.6.8)
|
||||
|
@ -188,7 +192,7 @@ GEM
|
|||
uber (0.1.0)
|
||||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.8)
|
||||
unf_ext (0.0.8.1)
|
||||
unicode-display_width (1.8.0)
|
||||
webrick (1.7.0)
|
||||
word_wrap (1.0.0)
|
||||
|
@ -211,4 +215,4 @@ DEPENDENCIES
|
|||
fastlane
|
||||
|
||||
BUNDLED WITH
|
||||
2.3.3
|
||||
2.3.10
|
||||
|
|
|
@ -1 +1 @@
|
|||
1.10.3
|
||||
1.12.2
|
||||
|
|
|
@ -46,8 +46,8 @@ android {
|
|||
applicationId "net.schueller.peertube"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 32
|
||||
versionCode 1075
|
||||
versionName "1.10.3"
|
||||
versionCode 1080
|
||||
versionName "1.12.2"
|
||||
buildConfigField "long", "BUILD_TIME", readPropertyWithDefault('buildTimestamp', System.currentTimeMillis()) + 'L'
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
|
|
|
@ -1,78 +1,83 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="net.schueller.peertube">
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="net.schueller.peertube">
|
||||
<!-- required to play video in background via notification -->
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- connect to peertube server -->
|
||||
<uses-permission android:name="android.permission.INTERNET" /> <!-- required for torrent downloading -->
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> <!-- connect to peertube server -->
|
||||
<uses-permission android:name="android.permission.INTERNET"/> <!-- required for torrent downloading -->
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||
|
||||
<application
|
||||
android:name=".application.AppApplication"
|
||||
android:allowBackup="true"
|
||||
android:fullBackupContent="@xml/backup_descriptor"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:ignore="GoogleAppIndexingWarning">
|
||||
android:name=".application.AppApplication"
|
||||
android:allowBackup="true"
|
||||
android:fullBackupContent="@xml/backup_descriptor"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="@string/app_name"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:ignore="GoogleAppIndexingWarning">
|
||||
|
||||
<!-- Server Address Book -->
|
||||
<activity
|
||||
android:name=".activity.ServerAddressBookActivity"
|
||||
android:label="@string/title_activity_server_address_book"
|
||||
android:theme="@style/AppTheme.NoActionBar" /> <!-- Video Lists -->
|
||||
android:name=".activity.ServerAddressBookActivity"
|
||||
android:label="@string/title_activity_server_address_book"
|
||||
android:theme="@style/AppTheme.NoActionBar"/> <!-- Video Lists -->
|
||||
<activity
|
||||
android:name=".activity.VideoListActivity"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/AppTheme.NoActionBar"
|
||||
android:exported="true">
|
||||
android:name=".activity.VideoListActivity"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/AppTheme.NoActionBar"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<action android:name="android.intent.action.SEARCH" />
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<action android:name="android.intent.action.SEARCH"/>
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
|
||||
<meta-data
|
||||
android:name="android.app.searchable"
|
||||
android:resource="@xml/searchable" />
|
||||
android:name="android.app.searchable"
|
||||
android:resource="@xml/searchable"/>
|
||||
</activity> <!-- Video Player -->
|
||||
<activity
|
||||
android:name=".activity.VideoPlayActivity"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
|
||||
android:label="@string/title_activity_video_play"
|
||||
android:launchMode="singleInstance"
|
||||
android:supportsPictureInPicture="true"
|
||||
android:theme="@style/AppTheme.NoActionBar" /> <!-- Settings -->
|
||||
android:name=".activity.VideoPlayActivity"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
|
||||
android:label="@string/title_activity_video_play"
|
||||
android:launchMode="singleInstance"
|
||||
android:supportsPictureInPicture="true"
|
||||
android:theme="@style/AppTheme.NoActionBar"/>
|
||||
<!-- Playlist -->
|
||||
<activity android:name=".activity.PlaylistActivity"
|
||||
android:label="Playlist"
|
||||
android:theme="@style/AppTheme.NoActionBar"/>
|
||||
<!-- Settings -->
|
||||
<activity
|
||||
android:name=".activity.SettingsActivity"
|
||||
android:label="@string/title_activity_settings"
|
||||
android:theme="@style/AppTheme.NoActionBar" /> <!-- Server Selection -->
|
||||
android:name=".activity.SettingsActivity"
|
||||
android:label="@string/title_activity_settings"
|
||||
android:theme="@style/AppTheme.NoActionBar"/> <!-- Server Selection -->
|
||||
<activity
|
||||
android:name=".activity.SearchServerActivity"
|
||||
android:label="@string/title_activity_select_server"
|
||||
android:theme="@style/AppTheme.NoActionBar" /> <!-- Me -->
|
||||
android:name=".activity.SearchServerActivity"
|
||||
android:label="@string/title_activity_select_server"
|
||||
android:theme="@style/AppTheme.NoActionBar"/> <!-- Me -->
|
||||
<activity
|
||||
android:name=".activity.MeActivity"
|
||||
android:label="@string/title_activity_me"
|
||||
android:theme="@style/AppTheme.NoActionBar" /> <!-- Account -->
|
||||
android:name=".activity.MeActivity"
|
||||
android:label="@string/title_activity_me"
|
||||
android:theme="@style/AppTheme.NoActionBar"/> <!-- Account -->
|
||||
<activity
|
||||
android:name=".activity.AccountActivity"
|
||||
android:label="@string/title_activity_account"
|
||||
android:theme="@style/AppTheme.NoActionBar" /> <!-- Content provider for search suggestions -->
|
||||
android:name=".activity.AccountActivity"
|
||||
android:label="@string/title_activity_account"
|
||||
android:theme="@style/AppTheme.NoActionBar"/> <!-- Content provider for search suggestions -->
|
||||
<provider
|
||||
android:name=".provider.SearchSuggestionsProvider"
|
||||
android:authorities="net.schueller.peertube.provider.SearchSuggestionsProvider"
|
||||
android:enabled="true"
|
||||
android:exported="false" />
|
||||
android:name=".provider.SearchSuggestionsProvider"
|
||||
android:authorities="net.schueller.peertube.provider.SearchSuggestionsProvider"
|
||||
android:enabled="true"
|
||||
android:exported="false"/>
|
||||
|
||||
<service android:name=".service.VideoPlayerService" />
|
||||
<service android:name=".service.VideoPlayerService"/>
|
||||
|
||||
<receiver android:name="androidx.media.session.MediaButtonReceiver"
|
||||
android:exported="true">
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MEDIA_BUTTON" />
|
||||
<action android:name="android.intent.action.MEDIA_BUTTON"/>
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
|
|
|
@ -27,7 +27,9 @@ import android.view.View;
|
|||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import com.squareup.picasso.Picasso;
|
||||
import net.schueller.peertube.R;
|
||||
import net.schueller.peertube.helper.APIUrlHelper;
|
||||
import net.schueller.peertube.helper.ErrorHelper;
|
||||
|
@ -36,18 +38,12 @@ import net.schueller.peertube.model.Me;
|
|||
import net.schueller.peertube.network.GetUserService;
|
||||
import net.schueller.peertube.network.RetrofitInstance;
|
||||
import net.schueller.peertube.network.Session;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
|
||||
import com.squareup.picasso.Picasso;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import static net.schueller.peertube.application.AppApplication.getContext;
|
||||
|
||||
public class MeActivity extends CommonActivity {
|
||||
|
@ -85,11 +81,16 @@ public class MeActivity extends CommonActivity {
|
|||
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_baseline_close_24);
|
||||
|
||||
LinearLayout account = findViewById(R.id.a_me_account_line);
|
||||
LinearLayout playlist = findViewById(R.id.a_me_playlist);
|
||||
LinearLayout settings = findViewById(R.id.a_me_settings);
|
||||
LinearLayout help = findViewById(R.id.a_me_helpnfeedback);
|
||||
|
||||
TextView logout = findViewById(R.id.a_me_logout);
|
||||
|
||||
playlist.setOnClickListener(view -> {
|
||||
Intent playlistActivity = new Intent(getContext(), PlaylistActivity.class);
|
||||
startActivity(playlistActivity);
|
||||
});
|
||||
|
||||
settings.setOnClickListener(view -> {
|
||||
Intent settingsActivity = new Intent(getContext(), SettingsActivity.class);
|
||||
|
@ -124,7 +125,7 @@ public class MeActivity extends CommonActivity {
|
|||
|
||||
call.enqueue(new Callback<Me>() {
|
||||
|
||||
LinearLayout account = findViewById(R.id.a_me_account_line);
|
||||
final LinearLayout account = findViewById(R.id.a_me_account_line);
|
||||
|
||||
@Override
|
||||
public void onResponse(@NonNull Call<Me> call, @NonNull Response<Me> response) {
|
||||
|
@ -162,7 +163,7 @@ public class MeActivity extends CommonActivity {
|
|||
|
||||
@Override
|
||||
public void onFailure(@NonNull Call<Me> call, @NonNull Throwable t) {
|
||||
ErrorHelper.showToastFromCommunicationError( MeActivity.this, t );
|
||||
ErrorHelper.showToastFromCommunicationError(MeActivity.this, t);
|
||||
account.setVisibility(View.GONE);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -0,0 +1,103 @@
|
|||
/*
|
||||
* Copyright (C) 2020 Stefan Schüller <sschueller@techdroid.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package net.schueller.peertube.activity
|
||||
|
||||
import android.app.AlertDialog
|
||||
import android.content.DialogInterface
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.activity.viewModels
|
||||
import androidx.recyclerview.widget.ItemTouchHelper
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import net.schueller.peertube.R
|
||||
import net.schueller.peertube.adapter.MultiViewRecyclerViewHolder
|
||||
import net.schueller.peertube.adapter.PlaylistAdapter
|
||||
import net.schueller.peertube.database.Video
|
||||
import net.schueller.peertube.database.VideoViewModel
|
||||
import net.schueller.peertube.databinding.ActivityPlaylistBinding
|
||||
|
||||
class PlaylistActivity : CommonActivity() {
|
||||
|
||||
private val TAG = "PlaylistAct"
|
||||
|
||||
private val mVideoViewModel: VideoViewModel by viewModels()
|
||||
|
||||
private lateinit var mBinding: ActivityPlaylistBinding
|
||||
|
||||
override fun onSupportNavigateUp(): Boolean {
|
||||
finish() // close this activity as oppose to navigating up
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
mBinding = ActivityPlaylistBinding.inflate(layoutInflater)
|
||||
setContentView(mBinding.root)
|
||||
|
||||
// Setting toolbar as the ActionBar with setSupportActionBar() call
|
||||
setSupportActionBar(mBinding.toolBarServerAddressBook)
|
||||
supportActionBar?.apply {
|
||||
setDisplayHomeAsUpEnabled(true)
|
||||
setHomeAsUpIndicator(R.drawable.ic_baseline_close_24)
|
||||
}
|
||||
|
||||
showServers()
|
||||
}
|
||||
|
||||
private fun onVideoClick(video: Video) {
|
||||
val intent = Intent(this, VideoPlayActivity::class.java)
|
||||
intent.putExtra(MultiViewRecyclerViewHolder.EXTRA_VIDEOID, video.videoUUID)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
private fun showServers() {
|
||||
val adapter = PlaylistAdapter(mutableListOf(), { onVideoClick(it) }).also {
|
||||
mBinding.serverListRecyclerview.adapter = it
|
||||
}
|
||||
|
||||
// Delete items on swipe
|
||||
val helper = ItemTouchHelper(
|
||||
object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
|
||||
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
|
||||
AlertDialog.Builder(this@PlaylistActivity)
|
||||
.setTitle(getString(R.string.remove_video))
|
||||
.setMessage(getString(R.string.remove_video_warning_message))
|
||||
.setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->
|
||||
val position = viewHolder.bindingAdapterPosition
|
||||
val video = adapter.getVideoAtPosition(position)
|
||||
// Delete the video
|
||||
mVideoViewModel.delete(video)
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _: DialogInterface?, _: Int -> adapter.notifyItemChanged(viewHolder.bindingAdapterPosition) }
|
||||
.setIcon(android.R.drawable.ic_dialog_alert)
|
||||
.show()
|
||||
}
|
||||
})
|
||||
helper.attachToRecyclerView(mBinding.serverListRecyclerview)
|
||||
|
||||
// Update the cached copy of the words in the adapter.
|
||||
mVideoViewModel.allVideos.observe(this, { videos: List<Video> ->
|
||||
adapter.setVideos(videos)
|
||||
})
|
||||
}
|
||||
|
||||
companion object
|
||||
}
|
|
@ -54,9 +54,10 @@ class VideoPlayActivity : CommonActivity() {
|
|||
val videoPlayerFragment =
|
||||
fragmentManager.findFragmentById(R.id.video_player_fragment) as VideoPlayerFragment?
|
||||
val actions = ArrayList<RemoteAction>()
|
||||
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE else 0
|
||||
var actionIntent = Intent(getString(R.string.app_background_audio))
|
||||
var pendingIntent =
|
||||
PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, 0)
|
||||
PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, flags)
|
||||
@SuppressLint("NewApi", "LocalSuppress") var icon = Icon.createWithResource(
|
||||
applicationContext, android.R.drawable.stat_sys_speakerphone
|
||||
)
|
||||
|
@ -65,7 +66,7 @@ class VideoPlayActivity : CommonActivity() {
|
|||
actions.add(remoteAction)
|
||||
actionIntent = Intent(PlayerNotificationManager.ACTION_STOP)
|
||||
pendingIntent =
|
||||
PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, 0)
|
||||
PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, flags)
|
||||
icon = Icon.createWithResource(
|
||||
applicationContext,
|
||||
com.google.android.exoplayer2.ui.R.drawable.exo_notification_stop
|
||||
|
@ -77,7 +78,7 @@ class VideoPlayActivity : CommonActivity() {
|
|||
Log.e(TAG, "setting actions with play button")
|
||||
actionIntent = Intent(PlayerNotificationManager.ACTION_PLAY)
|
||||
pendingIntent =
|
||||
PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, 0)
|
||||
PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, flags)
|
||||
icon = Icon.createWithResource(
|
||||
applicationContext,
|
||||
com.google.android.exoplayer2.ui.R.drawable.exo_notification_play
|
||||
|
@ -87,7 +88,7 @@ class VideoPlayActivity : CommonActivity() {
|
|||
Log.e(TAG, "setting actions with pause button")
|
||||
actionIntent = Intent(PlayerNotificationManager.ACTION_PAUSE)
|
||||
pendingIntent =
|
||||
PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, 0)
|
||||
PendingIntent.getBroadcast(applicationContext, REQUEST_CODE, actionIntent, flags)
|
||||
icon = Icon.createWithResource(
|
||||
applicationContext,
|
||||
com.google.android.exoplayer2.ui.R.drawable.exo_notification_pause
|
||||
|
|
|
@ -30,28 +30,26 @@ import androidx.core.content.ContextCompat
|
|||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import com.google.gson.JsonObject
|
||||
import com.mikepenz.iconics.Iconics.Builder
|
||||
import com.squareup.picasso.Picasso
|
||||
import net.schueller.peertube.R.color
|
||||
import net.schueller.peertube.R.string
|
||||
import net.schueller.peertube.R
|
||||
import net.schueller.peertube.R.*
|
||||
import net.schueller.peertube.activity.AccountActivity
|
||||
import net.schueller.peertube.activity.VideoListActivity
|
||||
import net.schueller.peertube.activity.VideoPlayActivity
|
||||
import net.schueller.peertube.databinding.*
|
||||
import net.schueller.peertube.fragment.VideoMetaDataFragment
|
||||
import net.schueller.peertube.helper.APIUrlHelper
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getCreatorAvatar
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getCreatorString
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getDuration
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getMetaString
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getOwnerString
|
||||
import com.mikepenz.iconics.Iconics.Builder
|
||||
import net.schueller.peertube.R
|
||||
import net.schueller.peertube.R.id
|
||||
import net.schueller.peertube.R.menu
|
||||
import net.schueller.peertube.databinding.*
|
||||
import net.schueller.peertube.fragment.VideoMetaDataFragment
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getCreatorAvatar
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getCreatorString
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getTagsString
|
||||
import net.schueller.peertube.helper.MetaDataHelper.isChannel
|
||||
import net.schueller.peertube.intents.Intents
|
||||
import net.schueller.peertube.model.*
|
||||
import net.schueller.peertube.model.ui.VideoMetaViewItem
|
||||
import net.schueller.peertube.network.GetUserService
|
||||
import net.schueller.peertube.network.GetVideoDataService
|
||||
import net.schueller.peertube.network.RetrofitInstance
|
||||
import net.schueller.peertube.network.Session
|
||||
|
@ -61,8 +59,6 @@ import okhttp3.ResponseBody
|
|||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import net.schueller.peertube.helper.MetaDataHelper.isChannel
|
||||
import net.schueller.peertube.network.GetUserService
|
||||
|
||||
|
||||
sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||
|
@ -70,13 +66,13 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
var videoRating: Rating? = null
|
||||
var isLeaveAppExpected = false
|
||||
|
||||
class CategoryViewHolder(private val binding: ItemCategoryTitleBinding): MultiViewRecyclerViewHolder(binding) {
|
||||
class CategoryViewHolder(private val binding: ItemCategoryTitleBinding) : MultiViewRecyclerViewHolder(binding) {
|
||||
fun bind(category: Category) {
|
||||
binding.textViewTitle.text = category.label
|
||||
}
|
||||
}
|
||||
|
||||
class VideoCommentsViewHolder(private val binding: ItemVideoCommentsOverviewBinding): MultiViewRecyclerViewHolder(binding) {
|
||||
class VideoCommentsViewHolder(private val binding: ItemVideoCommentsOverviewBinding) : MultiViewRecyclerViewHolder(binding) {
|
||||
fun bind(commentThread: CommentThread) {
|
||||
|
||||
binding.videoCommentsTotalCount.text = commentThread.total.toString()
|
||||
|
@ -90,8 +86,8 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
val baseUrl = APIUrlHelper.getUrl(binding.videoHighlightedAvatar.context)
|
||||
val avatarPath = avatar.path
|
||||
Picasso.get()
|
||||
.load(baseUrl + avatarPath)
|
||||
.into(binding.videoHighlightedAvatar)
|
||||
.load(baseUrl + avatarPath)
|
||||
.into(binding.videoHighlightedAvatar)
|
||||
}
|
||||
binding.videoHighlightedComment.text = highlightedComment.text
|
||||
}
|
||||
|
@ -99,7 +95,7 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
}
|
||||
|
||||
|
||||
class VideoMetaViewHolder(private val binding: ItemVideoMetaBinding, private val videoMetaDataFragment: VideoMetaDataFragment?): MultiViewRecyclerViewHolder(binding) {
|
||||
class VideoMetaViewHolder(private val binding: ItemVideoMetaBinding, private val videoMetaDataFragment: VideoMetaDataFragment?) : MultiViewRecyclerViewHolder(binding) {
|
||||
fun bind(videoMetaViewItem: VideoMetaViewItem) {
|
||||
|
||||
val video = videoMetaViewItem.video
|
||||
|
@ -109,16 +105,16 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
val context = binding.avatar.context
|
||||
val apiBaseURL = APIUrlHelper.getUrlWithVersion(context)
|
||||
val videoDataService = RetrofitInstance.getRetrofitInstance(
|
||||
apiBaseURL,
|
||||
APIUrlHelper.useInsecureConnection(context)
|
||||
apiBaseURL,
|
||||
APIUrlHelper.useInsecureConnection(context)
|
||||
).create(
|
||||
GetVideoDataService::class.java
|
||||
GetVideoDataService::class.java
|
||||
)
|
||||
val userService = RetrofitInstance.getRetrofitInstance(
|
||||
apiBaseURL,
|
||||
APIUrlHelper.useInsecureConnection(context)
|
||||
apiBaseURL,
|
||||
APIUrlHelper.useInsecureConnection(context)
|
||||
).create(
|
||||
GetUserService::class.java
|
||||
GetUserService::class.java
|
||||
)
|
||||
|
||||
// Title
|
||||
|
@ -137,27 +133,25 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
rateVideo(false, video, context, binding)
|
||||
}
|
||||
|
||||
// Add to playlist
|
||||
binding.videoAddToPlaylistWrapper.setOnClickListener {
|
||||
Toast.makeText(
|
||||
context,
|
||||
context.getString(string.video_feature_not_yet_implemented),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
videoMetaDataFragment.saveToPlaylist(video)
|
||||
Toast.makeText(context, context.getString(string.saved_to_playlist), Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
|
||||
binding.videoBlockWrapper.setOnClickListener {
|
||||
Toast.makeText(
|
||||
context,
|
||||
context.getString(string.video_feature_not_yet_implemented),
|
||||
Toast.LENGTH_SHORT
|
||||
context,
|
||||
context.getString(string.video_feature_not_yet_implemented),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
|
||||
binding.videoFlagWrapper.setOnClickListener {
|
||||
Toast.makeText(
|
||||
context,
|
||||
context.getString(string.video_feature_not_yet_implemented),
|
||||
Toast.LENGTH_SHORT
|
||||
context,
|
||||
context.getString(string.video_feature_not_yet_implemented),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
|
||||
|
@ -198,10 +192,10 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
|
||||
// created at / views
|
||||
binding.videoMeta.text = getMetaString(
|
||||
video.createdAt,
|
||||
video.views,
|
||||
context,
|
||||
true
|
||||
video.createdAt,
|
||||
video.views,
|
||||
context,
|
||||
true
|
||||
)
|
||||
|
||||
// owner / creator
|
||||
|
@ -220,8 +214,8 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
val baseUrl = APIUrlHelper.getUrl(context)
|
||||
val avatarPath = avatar.path
|
||||
Picasso.get()
|
||||
.load(baseUrl + avatarPath)
|
||||
.into(binding.avatar)
|
||||
.load(baseUrl + avatarPath)
|
||||
.into(binding.avatar)
|
||||
}
|
||||
|
||||
// videoOwnerSubscribers
|
||||
|
@ -243,7 +237,6 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
}
|
||||
|
||||
|
||||
|
||||
// get subscription status
|
||||
var isSubscribed = false
|
||||
|
||||
|
@ -262,6 +255,7 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<JsonObject>, t: Throwable) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
@ -278,52 +272,54 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
val call = userService.subscribe(body)
|
||||
call.enqueue(object : Callback<ResponseBody?> {
|
||||
override fun onResponse(
|
||||
call: Call<ResponseBody?>,
|
||||
response: Response<ResponseBody?>
|
||||
call: Call<ResponseBody?>,
|
||||
response: Response<ResponseBody?>
|
||||
) {
|
||||
if (response.isSuccessful) {
|
||||
binding.videoOwnerSubscribeButton.setText(string.unsubscribe)
|
||||
isSubscribed = true
|
||||
}
|
||||
}
|
||||
|
||||
override fun onFailure(call: Call<ResponseBody?>, t: Throwable) {
|
||||
// Do nothing.
|
||||
}
|
||||
})
|
||||
} else {
|
||||
AlertDialog.Builder(context)
|
||||
.setTitle(context.getString(string.video_sub_del_alert_title))
|
||||
.setMessage(context.getString(string.video_sub_del_alert_msg))
|
||||
.setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->
|
||||
// Yes
|
||||
val payload = video.channel.name + "@" + video.channel.host
|
||||
val call = userService.unsubscribe(payload)
|
||||
call.enqueue(object : Callback<ResponseBody?> {
|
||||
override fun onResponse(
|
||||
call: Call<ResponseBody?>,
|
||||
response: Response<ResponseBody?>
|
||||
) {
|
||||
if (response.isSuccessful) {
|
||||
binding.videoOwnerSubscribeButton.setText(string.subscribe)
|
||||
isSubscribed = false
|
||||
.setTitle(context.getString(string.video_sub_del_alert_title))
|
||||
.setMessage(context.getString(string.video_sub_del_alert_msg))
|
||||
.setPositiveButton(android.R.string.ok) { _: DialogInterface?, _: Int ->
|
||||
// Yes
|
||||
val payload = video.channel.name + "@" + video.channel.host
|
||||
val call = userService.unsubscribe(payload)
|
||||
call.enqueue(object : Callback<ResponseBody?> {
|
||||
override fun onResponse(
|
||||
call: Call<ResponseBody?>,
|
||||
response: Response<ResponseBody?>
|
||||
) {
|
||||
if (response.isSuccessful) {
|
||||
binding.videoOwnerSubscribeButton.setText(string.subscribe)
|
||||
isSubscribed = false
|
||||
}
|
||||
}
|
||||
}
|
||||
override fun onFailure(call: Call<ResponseBody?>, t: Throwable) {
|
||||
// Do nothing.
|
||||
}
|
||||
})
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _: DialogInterface?, _: Int ->
|
||||
// No
|
||||
}
|
||||
.setIcon(android.R.drawable.ic_dialog_alert)
|
||||
.show()
|
||||
|
||||
override fun onFailure(call: Call<ResponseBody?>, t: Throwable) {
|
||||
// Do nothing.
|
||||
}
|
||||
})
|
||||
}
|
||||
.setNegativeButton(android.R.string.cancel) { _: DialogInterface?, _: Int ->
|
||||
// No
|
||||
}
|
||||
.setIcon(android.R.drawable.ic_dialog_alert)
|
||||
.show()
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(
|
||||
context,
|
||||
context.getString(string.video_login_required_for_service),
|
||||
Toast.LENGTH_SHORT
|
||||
context,
|
||||
context.getString(string.video_login_required_for_service),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
@ -333,7 +329,7 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
}
|
||||
}
|
||||
|
||||
class ChannelViewHolder(private val binding: ItemChannelTitleBinding): MultiViewRecyclerViewHolder(binding) {
|
||||
class ChannelViewHolder(private val binding: ItemChannelTitleBinding) : MultiViewRecyclerViewHolder(binding) {
|
||||
fun bind(channel: Channel) {
|
||||
|
||||
val context = binding.avatar.context
|
||||
|
@ -344,22 +340,22 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
if (avatar != null) {
|
||||
val avatarPath = avatar.path
|
||||
Picasso.get()
|
||||
.load(baseUrl + avatarPath)
|
||||
.placeholder(R.drawable.test_image)
|
||||
.into(binding.avatar)
|
||||
.load(baseUrl + avatarPath)
|
||||
.placeholder(R.drawable.test_image)
|
||||
.into(binding.avatar)
|
||||
}
|
||||
|
||||
binding.textViewTitle.text = channel.displayName
|
||||
}
|
||||
}
|
||||
|
||||
class TagViewHolder(private val binding: ItemTagTitleBinding): MultiViewRecyclerViewHolder(binding) {
|
||||
class TagViewHolder(private val binding: ItemTagTitleBinding) : MultiViewRecyclerViewHolder(binding) {
|
||||
fun bind(tag: TagVideo) {
|
||||
binding.textViewTitle.text = tag.tag
|
||||
}
|
||||
}
|
||||
|
||||
class VideoViewHolder(private val binding: RowVideoListBinding): MultiViewRecyclerViewHolder(binding) {
|
||||
class VideoViewHolder(private val binding: RowVideoListBinding) : MultiViewRecyclerViewHolder(binding) {
|
||||
|
||||
fun bind(video: Video) {
|
||||
|
||||
|
@ -368,18 +364,18 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
|
||||
// Temp Loading Image
|
||||
Picasso.get()
|
||||
.load(baseUrl + video.previewPath)
|
||||
.placeholder(R.drawable.test_image)
|
||||
.error(R.drawable.test_image)
|
||||
.into(binding.thumb)
|
||||
.load(baseUrl + video.previewPath)
|
||||
.placeholder(R.drawable.test_image)
|
||||
.error(R.drawable.test_image)
|
||||
.into(binding.thumb)
|
||||
|
||||
// Avatar
|
||||
val avatar = getCreatorAvatar(video, context)
|
||||
if (avatar != null) {
|
||||
val avatarPath = avatar.path
|
||||
Picasso.get()
|
||||
.load(baseUrl + avatarPath)
|
||||
.into(binding.avatar)
|
||||
.load(baseUrl + avatarPath)
|
||||
.into(binding.avatar)
|
||||
}
|
||||
// set Name
|
||||
binding.slRowName.text = video.name
|
||||
|
@ -395,9 +391,9 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
|
||||
// set age and view count
|
||||
binding.videoMeta.text = getMetaString(
|
||||
video.createdAt,
|
||||
video.views,
|
||||
context
|
||||
video.createdAt,
|
||||
video.views,
|
||||
context
|
||||
)
|
||||
|
||||
// set owner
|
||||
|
@ -431,8 +427,8 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
|
||||
binding.moreButton.setOnClickListener { v: View? ->
|
||||
val popup = PopupMenu(
|
||||
context,
|
||||
v!!
|
||||
context,
|
||||
v!!
|
||||
)
|
||||
popup.setOnMenuItemClickListener { menuItem: MenuItem ->
|
||||
when (menuItem.itemId) {
|
||||
|
@ -492,17 +488,17 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
|
||||
val apiBaseURL = APIUrlHelper.getUrlWithVersion(context)
|
||||
val videoDataService = RetrofitInstance.getRetrofitInstance(
|
||||
apiBaseURL, APIUrlHelper.useInsecureConnection(
|
||||
apiBaseURL, APIUrlHelper.useInsecureConnection(
|
||||
context
|
||||
)
|
||||
)
|
||||
).create(
|
||||
GetVideoDataService::class.java
|
||||
GetVideoDataService::class.java
|
||||
)
|
||||
val call = videoDataService.rateVideo(video.id, body)
|
||||
call.enqueue(object : Callback<ResponseBody?> {
|
||||
override fun onResponse(
|
||||
call: Call<ResponseBody?>,
|
||||
response: Response<ResponseBody?>
|
||||
call: Call<ResponseBody?>,
|
||||
response: Response<ResponseBody?>
|
||||
) {
|
||||
// if 20x, update likes/dislikes
|
||||
if (response.isSuccessful) {
|
||||
|
@ -539,17 +535,17 @@ sealed class MultiViewRecyclerViewHolder(binding: ViewBinding) : RecyclerView.Vi
|
|||
|
||||
override fun onFailure(call: Call<ResponseBody?>, t: Throwable) {
|
||||
Toast.makeText(
|
||||
context,
|
||||
context.getString(string.video_rating_failed),
|
||||
Toast.LENGTH_SHORT
|
||||
context,
|
||||
context.getString(string.video_rating_failed),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
})
|
||||
} else {
|
||||
Toast.makeText(
|
||||
context,
|
||||
context.getString(string.video_login_required_for_service),
|
||||
Toast.LENGTH_SHORT
|
||||
context,
|
||||
context.getString(string.video_login_required_for_service),
|
||||
Toast.LENGTH_SHORT
|
||||
).show()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* Copyright (C) 2020 Stefan Schüller <sschueller@techdroid.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package net.schueller.peertube.adapter
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import net.schueller.peertube.database.Video
|
||||
import net.schueller.peertube.databinding.RowPlaylistBinding
|
||||
|
||||
class PlaylistAdapter(private val mVideos: MutableList<Video>, private val onClick: (Video) -> Unit) : RecyclerView.Adapter<PlaylistAdapter.VideoViewHolder>() {
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VideoViewHolder {
|
||||
|
||||
val binding = RowPlaylistBinding.inflate(LayoutInflater.from(parent.context), parent, false)
|
||||
|
||||
return VideoViewHolder(binding)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: VideoViewHolder, position: Int) {
|
||||
holder.bind(mVideos[position])
|
||||
}
|
||||
|
||||
fun setVideos(videos: List<Video>) {
|
||||
mVideos.clear()
|
||||
mVideos.addAll(videos)
|
||||
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
override fun getItemCount(): Int {
|
||||
return mVideos.size
|
||||
}
|
||||
|
||||
inner class VideoViewHolder(private val binding: RowPlaylistBinding) : RecyclerView.ViewHolder(binding.root) {
|
||||
|
||||
fun bind(video: Video) {
|
||||
|
||||
binding.videoName.text = video.videoName
|
||||
binding.videoDescription.text = video.videoDescription
|
||||
|
||||
binding.root.setOnClickListener { onClick(video) }
|
||||
}
|
||||
}
|
||||
|
||||
fun getVideoAtPosition(position: Int): Video {
|
||||
return mVideos[position]
|
||||
}
|
||||
}
|
|
@ -19,7 +19,9 @@ package net.schueller.peertube.database;
|
|||
import androidx.room.Database;
|
||||
import androidx.room.RoomDatabase;
|
||||
|
||||
@Database(entities = {Server.class}, version = 1)
|
||||
@Database(entities = {Server.class, Video.class}, version = 1)
|
||||
public abstract class AppDatabase extends RoomDatabase {
|
||||
public abstract ServerDao serverDao();
|
||||
|
||||
public abstract VideoDao videoDao();
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package net.schueller.peertube.database
|
||||
|
||||
import android.os.Parcelable
|
||||
import androidx.room.ColumnInfo
|
||||
import androidx.room.Entity
|
||||
import androidx.room.PrimaryKey
|
||||
import kotlinx.parcelize.Parcelize
|
||||
import java.util.*
|
||||
|
||||
@Parcelize
|
||||
@Entity(tableName = "watch_later")
|
||||
data class Video(
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
var id: Int = 0,
|
||||
|
||||
@ColumnInfo(name = "video_uuid")
|
||||
var videoUUID: String,
|
||||
|
||||
@ColumnInfo(name = "video_name")
|
||||
var videoName: String,
|
||||
|
||||
@ColumnInfo(name = "video_description")
|
||||
var videoDescription: String?
|
||||
|
||||
) : Parcelable
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright (C) 2020 Stefan Schüller <sschueller@techdroid.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package net.schueller.peertube.database
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.room.*
|
||||
|
||||
@Dao
|
||||
interface VideoDao {
|
||||
|
||||
@Insert
|
||||
suspend fun insert(video: Video)
|
||||
|
||||
@Update
|
||||
suspend fun update(video: Video)
|
||||
|
||||
@Query("DELETE FROM watch_later")
|
||||
suspend fun deleteAll()
|
||||
|
||||
@Delete
|
||||
suspend fun delete(video: Video)
|
||||
|
||||
@get:Query("SELECT * from watch_later ORDER BY video_name DESC")
|
||||
val allVideos: LiveData<List<Video>>
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright (C) 2020 Stefan Schüller <sschueller@techdroid.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package net.schueller.peertube.database
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.LiveData
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
internal class VideoRepository(application: Application) {
|
||||
|
||||
private val mVideoDao: VideoDao
|
||||
|
||||
val allVideos: LiveData<List<Video>>
|
||||
get() = mVideoDao.allVideos
|
||||
|
||||
init {
|
||||
val db = VideoRoomDatabase.getDatabase(application)
|
||||
mVideoDao = db.videoDao()
|
||||
}
|
||||
|
||||
suspend fun update(video: Video) = withContext(Dispatchers.IO) {
|
||||
mVideoDao.update(video)
|
||||
}
|
||||
|
||||
suspend fun insert(video: Video) = withContext(Dispatchers.IO) {
|
||||
mVideoDao.insert(video)
|
||||
}
|
||||
|
||||
suspend fun delete(video: Video) = withContext(Dispatchers.IO) {
|
||||
mVideoDao.delete(video)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Copyright (C) 2020 Stefan Schüller <sschueller@techdroid.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package net.schueller.peertube.database;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.room.Database;
|
||||
import androidx.room.Room;
|
||||
import androidx.room.RoomDatabase;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
@Database(entities = {Video.class}, version = 1, exportSchema = false)
|
||||
public abstract class VideoRoomDatabase extends RoomDatabase {
|
||||
|
||||
public abstract VideoDao videoDao();
|
||||
|
||||
private static volatile VideoRoomDatabase INSTANCE;
|
||||
|
||||
private static final int NUMBER_OF_THREADS = 4;
|
||||
|
||||
static final ExecutorService databaseWriteExecutor =
|
||||
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
|
||||
|
||||
public static VideoRoomDatabase getDatabase(final Context context) {
|
||||
if (INSTANCE == null) {
|
||||
synchronized (VideoRoomDatabase.class) {
|
||||
if (INSTANCE == null) {
|
||||
if (INSTANCE == null) {
|
||||
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
|
||||
VideoRoomDatabase.class, "playlist_database")
|
||||
.build();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright (C) 2020 Stefan Schüller <sschueller@techdroid.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program 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 Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package net.schueller.peertube.database
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class VideoViewModel(application: Application) : AndroidViewModel(application) {
|
||||
|
||||
private val mRepository: VideoRepository = VideoRepository(application)
|
||||
val allVideos: LiveData<List<Video>> = mRepository.allVideos
|
||||
|
||||
fun insert(video: Video) {
|
||||
viewModelScope.launch {
|
||||
mRepository.insert(video)
|
||||
}
|
||||
}
|
||||
|
||||
fun update(video: Video) {
|
||||
viewModelScope.launch {
|
||||
mRepository.update(video)
|
||||
}
|
||||
}
|
||||
|
||||
fun delete(video: Video) {
|
||||
viewModelScope.launch {
|
||||
mRepository.delete(video)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -16,54 +16,36 @@
|
|||
*/
|
||||
package net.schueller.peertube.fragment
|
||||
|
||||
import android.Manifest
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getMetaString
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getOwnerString
|
||||
import android.content.res.ColorStateList
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
import android.os.Bundle
|
||||
import net.schueller.peertube.R
|
||||
import net.schueller.peertube.service.VideoPlayerService
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import net.schueller.peertube.helper.APIUrlHelper
|
||||
import net.schueller.peertube.network.GetVideoDataService
|
||||
import net.schueller.peertube.network.RetrofitInstance
|
||||
import net.schueller.peertube.helper.ErrorHelper
|
||||
import androidx.core.app.ActivityCompat
|
||||
import android.content.pm.PackageManager
|
||||
import android.content.res.ColorStateList
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.widget.Toast
|
||||
import com.squareup.picasso.Picasso
|
||||
import android.widget.TextView
|
||||
import android.util.TypedValue
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.widget.Button
|
||||
import android.widget.ImageView
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import androidx.fragment.app.FragmentTransaction
|
||||
import androidx.fragment.app.activityViewModels
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.mikepenz.iconics.Iconics
|
||||
import net.schueller.peertube.R
|
||||
import net.schueller.peertube.adapter.MultiViewRecycleViewAdapter
|
||||
import net.schueller.peertube.intents.Intents
|
||||
import net.schueller.peertube.database.VideoViewModel
|
||||
import net.schueller.peertube.helper.APIUrlHelper
|
||||
import net.schueller.peertube.helper.ErrorHelper
|
||||
import net.schueller.peertube.model.CommentThread
|
||||
import net.schueller.peertube.model.Rating
|
||||
import net.schueller.peertube.model.Video
|
||||
import net.schueller.peertube.model.VideoList
|
||||
import net.schueller.peertube.model.ui.VideoMetaViewItem
|
||||
import net.schueller.peertube.network.GetUserService
|
||||
import net.schueller.peertube.network.Session
|
||||
import okhttp3.MediaType.Companion.toMediaType
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import okhttp3.ResponseBody
|
||||
import net.schueller.peertube.network.GetVideoDataService
|
||||
import net.schueller.peertube.network.RetrofitInstance
|
||||
import net.schueller.peertube.service.VideoPlayerService
|
||||
import retrofit2.Call
|
||||
import retrofit2.Callback
|
||||
import retrofit2.Response
|
||||
import java.lang.Exception
|
||||
|
||||
class VideoMetaDataFragment : Fragment() {
|
||||
private var videoRating: Rating? = null
|
||||
|
@ -73,12 +55,14 @@ class VideoMetaDataFragment : Fragment() {
|
|||
|
||||
private lateinit var videoDescriptionFragment: VideoDescriptionFragment
|
||||
|
||||
private val mVideoViewModel: VideoViewModel by activityViewModels()
|
||||
|
||||
var isLeaveAppExpected = false
|
||||
private set
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
|
||||
// Inflate the layout for this fragment
|
||||
|
@ -94,11 +78,11 @@ class VideoMetaDataFragment : Fragment() {
|
|||
// show full description fragment
|
||||
videoDescriptionFragment = VideoDescriptionFragment.newInstance(video, this)
|
||||
childFragmentManager.beginTransaction()
|
||||
.add(R.id.video_meta_data_fragment, videoDescriptionFragment, VideoDescriptionFragment.TAG).commit()
|
||||
.add(R.id.video_meta_data_fragment, videoDescriptionFragment, VideoDescriptionFragment.TAG).commit()
|
||||
}
|
||||
|
||||
fun hideDescriptionFragment() {
|
||||
val fragment: Fragment? = childFragmentManager.findFragmentByTag(VideoDescriptionFragment.TAG)
|
||||
val fragment: Fragment? = childFragmentManager.findFragmentByTag(VideoDescriptionFragment.TAG)
|
||||
if (fragment != null) {
|
||||
childFragmentManager.beginTransaction().remove(fragment).commit()
|
||||
}
|
||||
|
@ -113,10 +97,10 @@ class VideoMetaDataFragment : Fragment() {
|
|||
val activity: Activity? = activity
|
||||
val apiBaseURL = APIUrlHelper.getUrlWithVersion(context)
|
||||
val videoDataService = RetrofitInstance.getRetrofitInstance(
|
||||
apiBaseURL,
|
||||
APIUrlHelper.useInsecureConnection(context)
|
||||
apiBaseURL,
|
||||
APIUrlHelper.useInsecureConnection(context)
|
||||
).create(
|
||||
GetVideoDataService::class.java
|
||||
GetVideoDataService::class.java
|
||||
)
|
||||
|
||||
// related videos
|
||||
|
@ -149,8 +133,8 @@ class VideoMetaDataFragment : Fragment() {
|
|||
videoOptions.setOnClickListener {
|
||||
val videoOptionsFragment = VideoOptionsFragment.newInstance(mService, video.files)
|
||||
videoOptionsFragment.show(
|
||||
getActivity()!!.supportFragmentManager,
|
||||
VideoOptionsFragment.TAG
|
||||
getActivity()!!.supportFragmentManager,
|
||||
VideoOptionsFragment.TAG
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -166,9 +150,9 @@ class VideoMetaDataFragment : Fragment() {
|
|||
// We set this to default to null so that on initial start there are videos listed.
|
||||
val apiBaseURL = APIUrlHelper.getUrlWithVersion(context)
|
||||
val service =
|
||||
RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(context)).create(
|
||||
GetVideoDataService::class.java
|
||||
)
|
||||
RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(context)).create(
|
||||
GetVideoDataService::class.java
|
||||
)
|
||||
val call: Call<CommentThread> = service.getCommentThreads(videoId, start, count, sort)
|
||||
|
||||
call.enqueue(object : Callback<CommentThread?> {
|
||||
|
@ -176,7 +160,7 @@ class VideoMetaDataFragment : Fragment() {
|
|||
if (response.body() != null) {
|
||||
val commentThread = response.body()
|
||||
if (commentThread != null) {
|
||||
mMultiViewAdapter!!.setVideoComment(commentThread);
|
||||
mMultiViewAdapter!!.setVideoComment(commentThread)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -197,8 +181,8 @@ class VideoMetaDataFragment : Fragment() {
|
|||
val filter: String? = null
|
||||
|
||||
val sharedPref = context?.getSharedPreferences(
|
||||
context.packageName + "_preferences",
|
||||
Context.MODE_PRIVATE
|
||||
context.packageName + "_preferences",
|
||||
Context.MODE_PRIVATE
|
||||
)
|
||||
|
||||
var nsfw = "false"
|
||||
|
@ -211,9 +195,9 @@ class VideoMetaDataFragment : Fragment() {
|
|||
// We set this to default to null so that on initial start there are videos listed.
|
||||
val apiBaseURL = APIUrlHelper.getUrlWithVersion(context)
|
||||
val service =
|
||||
RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(context)).create(
|
||||
GetVideoDataService::class.java
|
||||
)
|
||||
RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(context)).create(
|
||||
GetVideoDataService::class.java
|
||||
)
|
||||
val call: Call<VideoList> = service.getVideosData(start, count, sort, nsfw, filter, languages)
|
||||
|
||||
/*Log the URL called*/Log.d("URL Called", call.request().url.toString() + "")
|
||||
|
@ -234,6 +218,12 @@ class VideoMetaDataFragment : Fragment() {
|
|||
}
|
||||
})
|
||||
}
|
||||
|
||||
fun saveToPlaylist(video: Video) {
|
||||
val playlistVideo: net.schueller.peertube.database.Video = net.schueller.peertube.database.Video(videoUUID = video.uuid, videoName = video.name, videoDescription = video.description)
|
||||
mVideoViewModel.insert(playlistVideo)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "VMDF"
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
*/
|
||||
package net.schueller.peertube.service
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Notification
|
||||
import net.schueller.peertube.helper.MetaDataHelper.getMetaString
|
||||
import net.schueller.peertube.model.Video.Companion.getMediaDescription
|
||||
|
@ -46,6 +47,7 @@ import android.content.BroadcastReceiver
|
|||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.os.Binder
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import android.webkit.URLUtil
|
||||
import androidx.core.app.NotificationCompat
|
||||
|
@ -217,11 +219,15 @@ class VideoPlayerService : Service() {
|
|||
return currentVideo!!.name
|
||||
}
|
||||
|
||||
@SuppressLint("UnspecifiedImmutableFlag")
|
||||
override fun createCurrentContentIntent(player: Player): PendingIntent? {
|
||||
val intent = Intent(context, VideoPlayActivity::class.java)
|
||||
intent.putExtra(VideoListActivity.EXTRA_VIDEOID, currentVideo!!.uuid)
|
||||
return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||
|
||||
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
|
||||
PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
|
||||
else
|
||||
PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||
}
|
||||
|
||||
override fun getCurrentContentText(player: Player): CharSequence {
|
||||
|
|
|
@ -1,175 +1,188 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
tools:context=".activity.MeActivity"
|
||||
android:orientation="vertical">
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".activity.MeActivity"
|
||||
android:orientation="vertical">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/appbar_me"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
android:id="@+id/tool_bar_me"
|
||||
android:id="@+id/appbar_me"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:elevation="4dp" />
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
android:id="@+id/tool_bar_me"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:elevation="4dp"/>
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
|
||||
<ScrollView
|
||||
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<LinearLayout
|
||||
android:visibility="gone"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:id="@+id/a_me_account_line"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal">
|
||||
android:orientation="vertical">
|
||||
|
||||
<de.hdodenhof.circleimageview.CircleImageView
|
||||
android:id="@+id/a_me_avatar"
|
||||
android:layout_width="72dp"
|
||||
android:layout_height="72dp"
|
||||
android:layout_marginTop="0dp"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginRight="12dp"/>
|
||||
|
||||
<LinearLayout
|
||||
android:visibility="gone"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:id="@+id/a_me_account_line"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<LinearLayout
|
||||
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/a_me_username"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text=""
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" />
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/a_me_email"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text=""
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" />
|
||||
<de.hdodenhof.circleimageview.CircleImageView
|
||||
android:id="@+id/a_me_avatar"
|
||||
android:layout_width="72dp"
|
||||
android:layout_height="72dp"
|
||||
android:layout_marginTop="0dp"
|
||||
android:paddingStart="12dp"
|
||||
android:paddingTop="12dp"
|
||||
android:paddingEnd="12dp"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginRight="12dp"/>
|
||||
|
||||
<TextView
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/me_logout_button"
|
||||
android:id="@+id/a_me_logout"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" />
|
||||
<LinearLayout
|
||||
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/a_me_username"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text=""
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/a_me_email"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text=""
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"/>
|
||||
|
||||
<TextView
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/me_logout_button"
|
||||
android:id="@+id/a_me_logout"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"/>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:background="@android:color/darker_gray"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/a_me_playlist"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:drawableStart="@drawable/ic_baseline_settings_24"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/playlist"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"/>
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/a_me_settings"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:drawableStart="@drawable/ic_baseline_settings_24"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/title_activity_settings"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"/>
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/a_me_helpnfeedback"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:drawableStart="@drawable/ic_baseline_help_24"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/me_help_and_feedback_button"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"/>
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginBottom="4dp"
|
||||
android:background="@android:color/darker_gray" />
|
||||
</ScrollView>
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/a_me_settings"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:orientation="horizontal">
|
||||
<!-- <LinearLayout-->
|
||||
<!-- android:layout_marginBottom="0dp"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:orientation="vertical">-->
|
||||
|
||||
<TextView
|
||||
android:drawableStart="@drawable/ic_baseline_settings_24"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/title_activity_settings"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" />
|
||||
</LinearLayout>
|
||||
<!-- <androidx.appcompat.widget.AppCompatTextView-->
|
||||
<!-- android:id="@+id/account_username"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:text="" />-->
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/a_me_helpnfeedback"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="12dp"
|
||||
android:orientation="horizontal">
|
||||
|
||||
<TextView
|
||||
android:drawableStart="@drawable/ic_baseline_help_24"
|
||||
android:drawablePadding="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/me_help_and_feedback_button"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" />
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</ScrollView>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- <LinearLayout-->
|
||||
<!-- android:layout_marginBottom="0dp"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:orientation="vertical">-->
|
||||
|
||||
<!-- <androidx.appcompat.widget.AppCompatTextView-->
|
||||
<!-- android:id="@+id/account_username"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:text="" />-->
|
||||
|
||||
<!-- <androidx.appcompat.widget.AppCompatTextView-->
|
||||
<!-- android:id="@+id/account_email"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:text="" />-->
|
||||
<!-- </LinearLayout>-->
|
||||
<!-- <androidx.appcompat.widget.AppCompatTextView-->
|
||||
<!-- android:id="@+id/account_email"-->
|
||||
<!-- android:layout_width="match_parent"-->
|
||||
<!-- android:layout_height="wrap_content"-->
|
||||
<!-- android:text="" />-->
|
||||
<!-- </LinearLayout>-->
|
||||
|
||||
|
||||
</LinearLayout>
|
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".activity.ServerAddressBookActivity"
|
||||
android:id="@+id/server_book">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:id="@+id/appbar_server_address_book"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.appcompat.widget.Toolbar
|
||||
android:id="@+id/tool_bar_server_address_book"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_scrollFlags="scroll|enterAlways"
|
||||
android:elevation="4dp"/>
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||
>
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/server_list_recyclerview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@android:color/darker_gray"
|
||||
tools:listitem="@layout/row_playlist"
|
||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
||||
/>
|
||||
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
@ -0,0 +1,43 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.cardview.widget.CardView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:card_view="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
card_view:cardCornerRadius="0dp"
|
||||
card_view:cardElevation="0dp"
|
||||
card_view:cardUseCompatPadding="true">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:padding="12dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/video_name"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
card_view:layout_constraintTop_toTopOf="parent"
|
||||
card_view:layout_constraintStart_toStartOf="parent"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"
|
||||
tools:text="@tools:sample/lorem"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/video_description"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:maxLines="2"
|
||||
android:ellipsize="end"
|
||||
card_view:layout_constraintTop_toBottomOf="@id/video_name"
|
||||
card_view:layout_constraintStart_toStartOf="parent"
|
||||
android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead"
|
||||
tools:text="@tools:sample/lorem"
|
||||
/>
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
</androidx.cardview.widget.CardView>
|
|
@ -364,6 +364,6 @@
|
|||
<string name="pref_title_video_speed">سرعة التشغيل الافتراضية</string>
|
||||
<string name="pref_description_video_speed">حدد سرعة تشغيل الفيديو العامة</string>
|
||||
<string name="action_bar_title_address_book">دفتر العناوين</string>
|
||||
<string name="video_get_full_description_failed">فشل في الحصول على وصف فيديو كامل</string>
|
||||
<string name="video_get_full_description_failed">تعذر جلب وصف الفيديو الكامل</string>
|
||||
<string name="video_description_read_more">اقرأ المزيد</string>
|
||||
</resources>
|
|
@ -276,7 +276,7 @@
|
|||
<string name="video_login_required_for_service">এই সেবা ব্যবহারের জন্য লগ ইন করো</string>
|
||||
<string name="video_meta_button_share">শেয়ার</string>
|
||||
<string name="video_meta_button_download">ডাউনলোড</string>
|
||||
<string name="video_meta_button_privacy">Privacy</string>
|
||||
<string name="video_meta_button_privacy"></string>
|
||||
<string name="video_meta_button_category">বিভাগ</string>
|
||||
<string name="video_meta_button_license">অনুমতিপত্র</string>
|
||||
<string name="video_meta_button_language">ভাষা</string>
|
||||
|
@ -295,7 +295,7 @@
|
|||
<string name="account_about_description">বিস্তারিত:</string>
|
||||
<string name="account_about_joined">যুক্ত হয়েছে:</string>
|
||||
<string name="api_error">কিছু সমস্যা হয়েছে, অনুগ্রহ করে পরে চেষ্টা করো!</string>
|
||||
<string name="action_set_url">সার্ভার পছন্দ করো</string>
|
||||
<string name="action_set_url">সার্ভার পছন্দ ক</string>
|
||||
<string name="server_selection_signup_allowed_yes">হ্যা</string>
|
||||
<string name="server_selection_signup_allowed_no">না</string>
|
||||
<string name="server_selection_peertube_server_url">পিয়ারটিউব সার্ভার URL</string>
|
||||
|
@ -333,7 +333,7 @@
|
|||
<string name="authentication_login_success">লগইন হয়েছে</string>
|
||||
<string name="bn_rBD">বাংলা (বাংলাদেশ)</string>
|
||||
<string name="clear_search_history_prompt">আপনি কি পুরোপুরি সার্চ ইতিহাস মুছে ফেলতে চান\?</string>
|
||||
<string name="clear_search_history">সার্চ ইতিহাস মুছে ফেলো</string>
|
||||
<string name="clear_search_history">সার্চ ইতিহাস মুছে ফেলুন</string>
|
||||
<string name="pref_background_behavior_summary">চালু ভিডিও কি করবে যখন পেছনে যাবে</string>
|
||||
<string name="settings_permissions_error_float">অ্যান্ড্রয়েড সেটিং এ পিকচার ইন পিকচার পারমিশন বন্ধ আছে এই আয়াপ এ</string>
|
||||
<string name="settings_api_error_float">অ্যান্ড্রয়েড ভার্সন ভাসমান ভিডিও সাপোর্ট করে</string>
|
||||
|
@ -355,7 +355,7 @@
|
|||
<string name="server_selection_filter_hint">ফিল্টার তালিকা</string>
|
||||
<string name="pref_insecure_confirm_message">তুমি থোরিয়াম এর সকল এসএসএল প্রত্যয়ন বৈধতা নিষ্ক্রিয় করতে যাচ্ছ। এটি নিষ্ক্রিয় করা খুবই বিপজ্জনক হতে পারে যদি পিয়ারটিউব সার্ভারটি তোমার নিয়ন্ত্রণে না থাকে, কারণ একটি ম্যান-ইন-দ্য-মিডল আক্রমণ তোমার অজান্তেই অন্য সার্ভারে ট্রাফিক পরিচালনা করতে পারে। একজন আক্রমণকারী পাসওয়ার্ড এবং অন্যান্য ব্যক্তিগত তথ্য রেকর্ড করতে পারে।</string>
|
||||
<string name="pref_description_accept_insecure">অনিরাপদ সংযোগ উপেক্ষা করো। তুমি যে সার্ভারের সাথে সংযুক্ত হচ্ছো তা জানলে তবেই এটি ব্যবহার করো। অ্যাপ পুনর্সূচনা প্রয়োজন।</string>
|
||||
<string name="pref_title_accept_insecure">এসএসএল সার্টিফিকেট চেক নিষ্ক্রিয় করো</string>
|
||||
<string name="pref_title_accept_insecure">এসএসএল সার্টিফিকেট চেক নিষ্ক্রিয় ক</string>
|
||||
<string name="pref_insecure_confirm_yes">হ্যাঁ</string>
|
||||
<string name="pref_insecure_confirm_no">না</string>
|
||||
<string name="pref_insecure_confirm_title">সতর্কতা!</string>
|
||||
|
@ -365,4 +365,6 @@
|
|||
<string name="action_bar_title_address_book">ঠিকানা বই</string>
|
||||
<string name="pref_title_video_speed">সহজাত গতি</string>
|
||||
<string name="pref_description_video_speed">সর্বজনীন গতি নির্ধারণ করো</string>
|
||||
<string name="video_description_read_more">আরও পড়ুন</string>
|
||||
<string name="video_get_full_description_failed">ভিডিওর বিবরণ খুঁজে পাওয়া যায় নি</string>
|
||||
</resources>
|
|
@ -359,6 +359,6 @@
|
|||
<string name="pref_title_video_speed">Standard-Wiedergabegeschwindigkeit</string>
|
||||
<string name="pref_description_video_speed">Wählen Sie die globale Videowiedergabegeschwindigkeit</string>
|
||||
<string name="action_bar_title_address_book">Adressbuch</string>
|
||||
<string name="video_get_full_description_failed">Das Abrufen der vollständigen Videobeschreibung ist fehlgeschlagen</string>
|
||||
<string name="video_get_full_description_failed">Die vollständige Videobeschreibung konnte nicht abgerufen werden</string>
|
||||
<string name="video_description_read_more">Mehr lesen</string>
|
||||
</resources>
|
|
@ -364,6 +364,6 @@
|
|||
<string name="pref_title_video_speed">Vitesse de lecture par défaut</string>
|
||||
<string name="pref_description_video_speed">Sélectionnez la vitesse globale de lecture vidéo</string>
|
||||
<string name="action_bar_title_address_book">Carnet d\'adresses</string>
|
||||
<string name="video_get_full_description_failed">L\'obtention de la description complète de la vidéo a échoué</string>
|
||||
<string name="video_get_full_description_failed">Impossible de récupérer la description complète de la vidéo</string>
|
||||
<string name="video_description_read_more">Lire la suite</string>
|
||||
</resources>
|
|
@ -297,4 +297,5 @@
|
|||
<string name="api_error">Chaidh rudeigin ceàrr, feuch ris a-rithist an ceann greis!</string>
|
||||
<string name="action_bar_title_server_selection">Tagh frithealaiche</string>
|
||||
<string name="login_current_server_hint">Am frithealaiche làithreach</string>
|
||||
<string name="bottom_nav_title_discover">Foir-shealladh</string>
|
||||
</resources>
|
|
@ -0,0 +1,2 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources></resources>
|
|
@ -359,6 +359,6 @@
|
|||
<string name="action_bar_title_address_book">Rubrica</string>
|
||||
<string name="pref_title_video_speed">Velocità di riproduzione predefinita</string>
|
||||
<string name="pref_description_video_speed">Seleziona la velocità globale di riproduzione video</string>
|
||||
<string name="video_get_full_description_failed">Impossibile ottenere la descrizione completa del video</string>
|
||||
<string name="video_get_full_description_failed">Impossibile recuperare la descrizione completa del video</string>
|
||||
<string name="video_description_read_more">Leggi di più</string>
|
||||
</resources>
|
|
@ -65,8 +65,8 @@
|
|||
<string name="bottom_nav_title_trending">Populært</string>
|
||||
<string name="meta_data_views">" Visninger"</string>
|
||||
<string name="video_row_video_thumbnail">Video-miniatyrbilde</string>
|
||||
<string name="pref_title_show_nsfw">VOKSENT innhold</string>
|
||||
<string name="pref_description_show_nsfw">Vis VOKSENT innhold</string>
|
||||
<string name="pref_title_show_nsfw">innhold upassende på jobb</string>
|
||||
<string name="pref_description_show_nsfw">Vis innhold som er upassende på jobb</string>
|
||||
<string name="pref_language">Språkfilter</string>
|
||||
<string name="pref_description_language">Velg videospråk, istedenfor å vise alle videoer på alle språk.</string>
|
||||
<string name="title_activity_url_video_play">UrlVideoPlayActivity</string>
|
||||
|
@ -87,7 +87,7 @@
|
|||
<string name="pref_title_dark_mode">Mørkt modus</string>
|
||||
<string name="pref_description_dark_mode">Start programmet for å ikle mørk drakt.</string>
|
||||
<string name="pref_title_app_theme">Programdrakt</string>
|
||||
<string name="pref_description_app_theme">Start programmet på ny for å ikle drakt.</string>
|
||||
<string name="pref_description_app_theme">Start programmet på nytt for å ikle drakt.</string>
|
||||
<string name="indigo">Indigo</string>
|
||||
<string name="cyan">Turkis</string>
|
||||
<string name="lime">Lime</string>
|
||||
|
@ -95,7 +95,7 @@
|
|||
<string name="video_speed_05">0,5×</string>
|
||||
<string name="video_speed_15">1,5×</string>
|
||||
<string name="video_speed_20">2×</string>
|
||||
<string name="pref_description_background_play">Hvis påskrudd vil videoer spilles videre i bakgrunnen.</string>
|
||||
<string name="pref_description_background_play">Video spiller videre i bakgrunnen om dette aktiveres.</string>
|
||||
<string name="video_login_required_for_service">Du må logge inn for å bruke denne tjenesten</string>
|
||||
<string name="ko">Koreansk</string>
|
||||
<string name="action_set_url">Velg tjener</string>
|
||||
|
@ -132,7 +132,7 @@
|
|||
<string name="pref_background_behavior">Oppsett av bakgrunnsavspilling</string>
|
||||
<string name="pref_background_float">Fortsett video|avspilling i flytende vindu</string>
|
||||
<string name="pref_description_back_pause">Opphold i bakgrunnsavspilling når \"Tilbake\" trykkes under videoavspilling.</string>
|
||||
<string name="pref_title_back_pause">Sett på pause med \"Tilbake\"-knapp</string>
|
||||
<string name="pref_title_back_pause">Pause når tilbake-knappen brukes</string>
|
||||
<string name="pref_background_stop">Stopp all avspilling</string>
|
||||
<string name="pref_background_audio">Fortsett som lydstrøm i bakgrunnen</string>
|
||||
<string name="pref_description_language_app">Velg språk for programgrensesnittet. Start programmet på ny for å utføre endringene.</string>
|
||||
|
@ -185,7 +185,7 @@
|
|||
<string name="gu">gujarati</string>
|
||||
<string name="bn">bengalsk</string>
|
||||
<string name="hy">armensk</string>
|
||||
<string name="server_selection_nsfw_instance">Arbeidsutrygg insans</string>
|
||||
<string name="server_selection_nsfw_instance">jobb-upassende instans</string>
|
||||
<string name="pref_insecure_confirm_yes">Ja</string>
|
||||
<string name="pref_insecure_confirm_no">Nei</string>
|
||||
<string name="pref_insecure_confirm_title">Advarsel!</string>
|
||||
|
@ -201,4 +201,9 @@
|
|||
<string name="pref_title_video_speed">Forvalgt avspillingshastighet</string>
|
||||
<string name="pref_description_video_speed">Velg videoavspillingshastighet for hele systemet</string>
|
||||
<string name="ab">Abkhasisk</string>
|
||||
<string name="video_description_read_more">Les mer</string>
|
||||
<string name="video_get_full_description_failed">Kunne ikke hente komplett videobeskrivelse</string>
|
||||
<string name="so">Somalisk</string>
|
||||
<string name="sk">Slovakisk</string>
|
||||
<string name="sfs">Sørafrikansk tegnspråk</string>
|
||||
</resources>
|
|
@ -318,4 +318,9 @@
|
|||
<string name="pref_background_behavior">Ustawienia odtwarzania w tle</string>
|
||||
<string name="pref_background_float">Kontynuuj odtwarzanie w ruchomym oknie</string>
|
||||
<string name="pref_language_app">Język Aplikacji</string>
|
||||
<string name="pref_title_video_speed">Domyślna prędkość odtwarzania</string>
|
||||
<string name="pref_description_video_speed">Wybierz globalną szybkość odtwarzania wideo</string>
|
||||
<string name="pref_title_back_pause">Wstrzymanie po naciśnięciu przycisku wstecz</string>
|
||||
<string name="settings_api_error_float">Android nie wspiera odtwarzania w ruchomym oknie</string>
|
||||
<string name="pref_description_language_app">Wybierz język interfejsu aplikacji. Wymaga restartu, by zmiany nabrały efektu.</string>
|
||||
</resources>
|
|
@ -359,4 +359,6 @@
|
|||
<string name="pref_title_video_speed">Velocidade de reprodução padrão</string>
|
||||
<string name="pref_description_video_speed">Selecione a velocidade global de reprodução de vídeo</string>
|
||||
<string name="action_bar_title_address_book">Lista de endereços</string>
|
||||
<string name="video_get_full_description_failed">Não foi possível obter a descrição completa do vídeo</string>
|
||||
<string name="video_description_read_more">Leia mais</string>
|
||||
</resources>
|
|
@ -359,4 +359,6 @@
|
|||
<string name="pref_title_video_speed">Velocidade de reprodução predefinida</string>
|
||||
<string name="pref_description_video_speed">Selecione a velocidade de reprodução de vídeo global</string>
|
||||
<string name="action_bar_title_address_book">Lista de contactos</string>
|
||||
<string name="video_get_full_description_failed">Não foi possível obter a descrição completa do vídeo</string>
|
||||
<string name="video_description_read_more">Leia mais</string>
|
||||
</resources>
|
|
@ -365,4 +365,6 @@
|
|||
<string name="action_bar_title_address_book">Адресная книга</string>
|
||||
<string name="pref_title_video_speed">Скорость воспроизведения по умолчанию</string>
|
||||
<string name="pref_description_video_speed">Выберите глобальную скорость воспроизведения видео</string>
|
||||
<string name="video_description_read_more">Подробнее</string>
|
||||
<string name="video_get_full_description_failed">Не удалось получить полное описание видео</string>
|
||||
</resources>
|
|
@ -350,4 +350,11 @@
|
|||
<string name="prompt_server">Shërbyes</string>
|
||||
<string name="title_activity_login">Hyni</string>
|
||||
<string name="title_activity_settings">Rregullime</string>
|
||||
<string name="action_bar_title_address_book">Libër Adresash</string>
|
||||
<string name="video_get_full_description_failed">S’u pru dot përshkrimi i plotë i videos</string>
|
||||
<string name="video_description_read_more">Lexoni Më Tepër</string>
|
||||
<string name="pref_description_video_speed">Përzgjidhni Shpejtësi globale për Luajtje Videosh</string>
|
||||
<string name="pref_title_video_speed">Shpejtësi Parazgjedhje Luajtjeje</string>
|
||||
<string name="rm">Romansh</string>
|
||||
<string name="pref_title_buildtime">Kohë Montimi</string>
|
||||
</resources>
|
|
@ -12,7 +12,7 @@
|
|||
<string name="bottom_nav_title_discover">Огляд</string>
|
||||
<string name="menu_video_options_quality_automated">Автоматизовано</string>
|
||||
<string name="server_selection_video_totals" formatted="false">Відео: %s, Локальні відео: %s</string>
|
||||
<string name="server_selection_nsfw_instance">Екземпляр NSFW</string>
|
||||
<string name="server_selection_nsfw_instance">Сервер NSFW</string>
|
||||
<string name="settings_activity_video_playback_category_title">Відтворення відео</string>
|
||||
<string name="settings_activity_video_list_category_title">Список відео</string>
|
||||
<string name="title_activity_settings2">SettingsActivity2</string>
|
||||
|
@ -115,7 +115,7 @@
|
|||
<string name="pink">Рожевий</string>
|
||||
<string name="red">Червоний</string>
|
||||
<string name="zu">зулуська</string>
|
||||
<string name="za">чуанг</string>
|
||||
<string name="za">чжуанська</string>
|
||||
<string name="yo">йоруба</string>
|
||||
<string name="yi">ідиш</string>
|
||||
<string name="xh">коса</string>
|
||||
|
|
|
@ -359,6 +359,6 @@
|
|||
<string name="pref_title_video_speed">預設播放速度</string>
|
||||
<string name="pref_description_video_speed">選取全域影片播放速度</string>
|
||||
<string name="action_bar_title_address_book">通訊錄</string>
|
||||
<string name="video_get_full_description_failed">取得完整影片描述失敗</string>
|
||||
<string name="video_get_full_description_failed">無法擷取完整影片描述</string>
|
||||
<string name="video_description_read_more">閱讀更多資訊</string>
|
||||
</resources>
|
|
@ -364,7 +364,7 @@
|
|||
<string name="pref_insecure_confirm_yes">Yes</string>
|
||||
<string name="pref_insecure_confirm_message">You are about the disable all SSL Certification validation in Thorium. Disabling this can be very dangerous if the peertube server is not under your control, because a man-in-the-middle attack could direct traffic to another server without your knowledge. An attacker could record passwords and other personal data.</string>
|
||||
<string name="video_list_live_marker">LIVE</string>
|
||||
<string name="video_get_full_description_failed">Getting full video description failed</string>
|
||||
<string name="video_get_full_description_failed">Could not fetch the full video description</string>
|
||||
<string name="video_description_read_more">Read More</string>
|
||||
<string name="player_time_seperator">/</string>
|
||||
<string name="video_meta_show_description">Show Description</string>
|
||||
|
@ -384,4 +384,8 @@
|
|||
<string name="video_owner_fqdn_line">%1$s@%2$s</string>
|
||||
<string name="video_sub_del_alert_title">Unsubscribe</string>
|
||||
<string name="video_sub_del_alert_msg">Are you sure you would like to unsubscribe?</string>
|
||||
<string name="saved_to_playlist">Saved to playlist</string>
|
||||
<string name="remove_video">Remove Video</string>
|
||||
<string name="remove_video_warning_message">Are you sure you want to remove this video from playlist?</string>
|
||||
<string name="playlist">Playlist</string>
|
||||
</resources>
|
|
@ -39,7 +39,7 @@ fi
|
|||
|
||||
# check we have required files
|
||||
|
||||
requiredfiles=(title.txt full_description.txt short_description.txt video.txt)
|
||||
requiredfiles=(title.txt full_description.txt short_description.txt)
|
||||
|
||||
for d in fastlane/metadata/android/* ; do
|
||||
[ -L "${d%/}" ] && continue
|
||||
|
@ -57,13 +57,13 @@ for d in fastlane/metadata/android/* ; do
|
|||
fi
|
||||
fi
|
||||
|
||||
if test -f "$d/video.txt"; then
|
||||
fcontents=$(cat "$d/video.txt")
|
||||
if [[ "$fcontents" != "https://www.youtube.com/watch?v=lVJs26gE2Ek" ]]; then
|
||||
exitcode=1
|
||||
echo -e "${Blue}$fcontents${Color_Off} --> $d/video.txt - not correct video URL"
|
||||
fi
|
||||
fi
|
||||
# if test -f "$d/video.txt"; then
|
||||
# fcontents=$(cat "$d/video.txt")
|
||||
# if [[ "$fcontents" != "https://www.youtube.com/watch?v=lVJs26gE2Ek" ]]; then
|
||||
# exitcode=1
|
||||
# echo -e "${Blue}$fcontents${Color_Off} --> $d/video.txt - not correct video URL"
|
||||
# fi
|
||||
# fi
|
||||
done
|
||||
|
||||
exit $exitcode
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -0,0 +1,6 @@
|
|||
## 1.10.4 (2022-01-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Temp removal of videos in fastlane config 1d25be1
|
|
@ -0,0 +1,6 @@
|
|||
# 1.11.0 (2022-01-09)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Open playlist video in player, string update c23c17d
|
|
@ -0,0 +1,15 @@
|
|||
# 1.12.0 (2022-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Weblate translations
|
||||
* Remove unsupported play store language pt a31cd54
|
||||
* set required (im)mutable flag when creating pending intent 0a48cb5
|
||||
* Shortened too long title fr-FR 2401de9
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **lang:** Added translation using Weblate (Interlingua) 699da52
|
||||
* weblate merge 21261b0
|
|
@ -0,0 +1,6 @@
|
|||
## 1.12.1 (2022-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Too long play store update notes fe187e5
|
|
@ -0,0 +1,7 @@
|
|||
## 1.12.2 (2022-04-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Removed videos, fastlane cant upload them d98bf8c
|
||||
* Update fastlane cef0043
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -0,0 +1,11 @@
|
|||
# 1.4.0 (2021-02-20)
|
||||
|
||||
|
||||
### Correction
|
||||
|
||||
* Le plantage des appareils avec le sdk 21, 22, 23 et 24 au démarrage a été corrigé [#262](https://git.techdroid.com/sschueller/peertube/issues/262) 5622b76
|
||||
|
||||
|
||||
### Fonctionnalité
|
||||
|
||||
* ajout d'un réglage global pour la vitesse de lecture fa79b2d
|
|
@ -0,0 +1,17 @@
|
|||
# 1.5.0 (2021-10-05)
|
||||
|
||||
|
||||
### Corrections
|
||||
|
||||
* Ajout des fichiers de description requis par fastlane 38eb072
|
||||
* mises à jour android
|
||||
* mises à jour jdk
|
||||
* **lang:** traductions Weblate
|
||||
* versions de node
|
||||
* Mise à jour de gradle dans docker 79c9e97
|
||||
|
||||
|
||||
### Fonctionnalités
|
||||
|
||||
* Mise à jour des bibliothèques Android, et de gradle 5f2847c
|
||||
* **lang:** Ajout de nouvelles tranductions via Weblate
|
|
@ -0,0 +1,6 @@
|
|||
## 1.5.1 (2021-10-10)
|
||||
|
||||
|
||||
### Corrections
|
||||
|
||||
* langues incompatible (android play) b4efa27
|
|
@ -0,0 +1,6 @@
|
|||
## 1.5.2 (2021-10-11)
|
||||
|
||||
|
||||
### Corrections
|
||||
|
||||
* retrait des langues incompatibles (android play) 4fd8ff9
|
|
@ -0,0 +1,6 @@
|
|||
# 1.6.0 (2021-11-20)
|
||||
|
||||
|
||||
### Fonctionnalités
|
||||
|
||||
* Description complète de chargement 2f89538
|
|
@ -0,0 +1,8 @@
|
|||
## 1.7.1 (2021-11-21)
|
||||
|
||||
|
||||
### Corrections
|
||||
|
||||
* mise à jour du CI, version android SDK d021919
|
||||
* mise à jour du CI, version android SDK b6d149e
|
||||
* mise à jour du CI, version android SDK be9f5ef
|
|
@ -0,0 +1,6 @@
|
|||
# 1.8.0 (2021-12-26)
|
||||
|
||||
|
||||
### Fonctionnalités
|
||||
|
||||
* Aperçu 335bbbb
|
|
@ -0,0 +1,6 @@
|
|||
## 1.8.1 (2021-12-27)
|
||||
|
||||
|
||||
### Corrections
|
||||
|
||||
* mise à jour du lien de la vidéo du play store ffa7d40
|
|
@ -0,0 +1,8 @@
|
|||
## 1.8.2 (2021-12-27)
|
||||
|
||||
|
||||
### Corrections
|
||||
|
||||
* fastlane mis à jour 0f10497
|
||||
* fastlane mis à jour 110e5da
|
||||
* fastlane mis à jour f75114b
|
|
@ -0,0 +1,6 @@
|
|||
## 1.8.3 (2021-12-27)
|
||||
|
||||
|
||||
### Corrections
|
||||
|
||||
* réduction du nom de l'appli pour répondre aux nouvelles règles du Play Store 37229a0
|
|
@ -1 +1 @@
|
|||
Thorium a PeerTube client
|
||||
Thorium un client PeerTube
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -0,0 +1 @@
|
|||
- versão f-droid para corrigir o auto deployment
|
|
@ -0,0 +1,6 @@
|
|||
# 1.6.0 (2021-11-20)
|
||||
|
||||
|
||||
### Características
|
||||
|
||||
* Carregar descrição completa 2f89538
|
|
@ -0,0 +1,8 @@
|
|||
## 1.7.1 (2021-11-21)
|
||||
|
||||
|
||||
### Correções
|
||||
|
||||
* Atualizações CI, versão do android SDK d021919
|
||||
* Atualizações CI, versão do android SDK b6d149e
|
||||
* Atualizações CI, versão do android SDK be9f5ef
|
|
@ -0,0 +1,6 @@
|
|||
# 1.8.0 (2021-12-26)
|
||||
|
||||
|
||||
### Funcionalidades
|
||||
|
||||
* Vista geral 335bbbb
|
|
@ -0,0 +1,6 @@
|
|||
## 1.8.1 (2021-12-27)
|
||||
|
||||
|
||||
### Correções
|
||||
|
||||
* hiperligação do vídeo na play store atualizada ffa7d40
|
|
@ -0,0 +1,8 @@
|
|||
## 1.8.2 (2021-12-27)
|
||||
|
||||
|
||||
### Correções
|
||||
|
||||
* fastlane atualizada 0f10497
|
||||
* fastlane atualizada 110e5da
|
||||
* fastlane atualizada f75114b
|
|
@ -0,0 +1,6 @@
|
|||
## 1.8.3 (2021-12-27)
|
||||
|
||||
|
||||
### Correções
|
||||
|
||||
* novo requisito do nome da aplicação mais curto na Play Store 37229a0
|
|
@ -1 +1 @@
|
|||
Thorium é um reprodutor de PeerTube não oficial
|
||||
Thorium é um reprodutor PeerTube não-oficial
|
||||
|
|
|
@ -1 +1 @@
|
|||
Thorium a PeerTube client
|
||||
Thorium, um cliente PeerTube
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -0,0 +1,6 @@
|
|||
# 1.2.0 (7 shkurt, 2021)
|
||||
|
||||
|
||||
### Veçori
|
||||
|
||||
* Tregim i videove të drejtpërdrejta te lista videosh 8518b80
|
|
@ -0,0 +1,12 @@
|
|||
# 1.3.0 (13 shkurt, 2021)
|
||||
|
||||
|
||||
### Ndreqje të Metash
|
||||
|
||||
* U shndërrua listë videosh në Kotlin, për të ndrequr prishje menuje të epërme 06ace0d
|
||||
|
||||
|
||||
### Veçori
|
||||
|
||||
* U shtua vendmbajtëse miniature vidoeje për ngarkim dhe gabime 830b197
|
||||
* U shndërrua në Kotlin ndihmues meta për datat 1c34556
|
|
@ -0,0 +1,11 @@
|
|||
# 1.4.0 (20 shkurt, 2021)
|
||||
|
||||
|
||||
### Ndreqje të Metash
|
||||
|
||||
* Vithisje sdk-je 21,22,23,24 pajisjesh gjatë nisjes, ndreqje [#262](https://git.techdroid.com/sschueller/peertube/issues/262) 5622b76
|
||||
|
||||
|
||||
### Veçori
|
||||
|
||||
* shtim rregullimi shpejtësie luajtjeje të videove globalisht fa79b2d
|
|
@ -0,0 +1,6 @@
|
|||
## 1.5.1 (10 tetor, 2021)
|
||||
|
||||
|
||||
### Ndreqje të Metash
|
||||
|
||||
* gjuhë të papërputhshme (android play) b4efa27
|
|
@ -0,0 +1,6 @@
|
|||
## 1.5.2 (11 tetor, 2021)
|
||||
|
||||
|
||||
### Ndreqje të Metash
|
||||
|
||||
* u hoqën gjuhë të papërputhshme (android play) 4fd8ff9
|
|
@ -0,0 +1,6 @@
|
|||
# 1.6.0 (20 nëntor, 2021)
|
||||
|
||||
|
||||
### Veçori
|
||||
|
||||
* Ngarkim përshkrimi të plotë 2f89538
|
|
@ -0,0 +1,8 @@
|
|||
## 1.7.1 (21 nëntor, 2021)
|
||||
|
||||
|
||||
### Ndreqje të Metash
|
||||
|
||||
* Përditësime CI, version SDK-je për android d021919
|
||||
* Përditësime CI, version SDK-je për android b6d149e
|
||||
* Përditësime CI, version SDK-je për android be9f5ef
|
|
@ -0,0 +1,6 @@
|
|||
# 1.8.0 (26 dhjetor, 2021)
|
||||
|
||||
|
||||
### Veçori
|
||||
|
||||
* Përmbledhje 335bbbb
|
|
@ -0,0 +1,6 @@
|
|||
## 1.8.1 (27 dhjetor, 2021)
|
||||
|
||||
|
||||
### Ndreqje të Metash
|
||||
|
||||
* u përditësua lidhje për videon në Play Store ffa7d40
|
|
@ -0,0 +1,8 @@
|
|||
## 1.8.2 (27 dhjetor, 2021)
|
||||
|
||||
|
||||
### Ndreqje të Metash
|
||||
|
||||
* u përditësua fastlane 0f10497
|
||||
* u përditësua fastlane 110e5da
|
||||
* u përditësua fastlane f75114b
|
|
@ -0,0 +1,6 @@
|
|||
## 1.8.3 (27 dhjetor, 2021)
|
||||
|
||||
|
||||
### Ndreqje të Metash
|
||||
|
||||
* domosdoshmëri e re për emër më të shkurtër aplikacioni në Play Store 37229a0
|
|
@ -1,6 +1,6 @@
|
|||
Thorium është një klient për PeerTube që mund të lidhe me çfarëdo shërbyesi peertube që xhiron versionin v1.1.0-alpha.2 ose më sipër.
|
||||
|
||||
PeerTube është një platformë e federuar transmetimi videosh (ActivityPub) që përdor P2P (BitTorrent) drejt e në shfletues. Për më tepër hollësi dhe një listë shërbyesish, ju lutemi, vizitoni https://joinpeertube.org/.
|
||||
PeerTube është një platformë e federuar transmetimi videosh (ActivityPub) që përdor P2P (BitTorrent) drejt e në shfletues. Për më tepër hollësi, ju lutemi, vizitoni https://joinpeertube.org/.
|
||||
|
||||
Ky klient vjen i paraformësuar me një shërbyes PeerTube nën administrimin e krijuesit të aplikacionit - jo nga vetë projekti PeerTube, i cili ofron më tepër, në http://instances.joinpeertube.org/ - për t’ju lejuar të keni një ide se çështë i zoti të bëjë klienti. Zgjidhni shërbyesin tuaj, që ta bëni punimin si doni!
|
||||
|
||||
|
@ -30,4 +30,4 @@ Licencuar sipas GNU Affero General Public License v3.0
|
|||
|
||||
Lejet e kësaj licence nga më të fortat e llojit <em>copyleft</em> kushtëzohen me bërjen të passhme të krejt kodit burim të punëve të licencuara dhe të ndryshimeve, çka përfshin punë më të mëdha që përdorin një punë të licencuar, nën të njëjtën licencë. Shënimet mbi të drejta kopjimi dhe licenca duhet të ruhen. Kontribuesit furnizojnë një dhënie shprehimisht të të drejtave mbi patenta. Kur një version i ndryshuar përdoret për të dhënë një shërbim përmes një rrjeti, duhet të bëhet i passhëm kodi i plotë burim i versionit të ndryshuar.
|
||||
|
||||
Source Code at: https://github.com/sschueller/peertube-android/
|
||||
Kod Burim te: https://github.com/sschueller/peertube-android/
|
||||
|
|
|
@ -1 +1 @@
|
|||
Thorium a PeerTube client
|
||||
Thorium a PeerTube client
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
|
@ -1 +0,0 @@
|
|||
https://www.youtube.com/watch?v=lVJs26gE2Ek
|
Loading…
Reference in New Issue