Merge pull request #106 from sschueller/develop

Release 1.0.24
This commit is contained in:
Stefan Schüller 2019-01-09 21:29:22 +01:00 committed by GitHub
commit a67f6591e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 837 additions and 189 deletions

View File

@ -1,3 +1,11 @@
### Version 1.0.24 Tag: v1.0.24 (2019-01-09)
* Set video quality (@digiwizkid)
* BN Strings update (@digiwizkid)
* RU Strings update (@ferhadnecef)
* Added another level in video options menu
* Moved torrent progressbas into video
* Better NSFW Filter labeling
### Version 1.0.23 Tag: v1.0.23 (2019-01-06)
* Moved video playback into fragment
* Added duration to video list

View File

@ -22,12 +22,13 @@ Beta Test on Google Play: https://play.google.com/store/apps/details?id=net.schu
- [X] Very Basic Torrent playback
- [X] Change Server
- [X] Search
- [X] App Icon and assets
- [X] Themes / Dark mode
- [X] Background playback
- [X] NSFW Filter option
- [X] Authentication / Login
- [X] Like/dislike video
- [X] Video speed selection
- [X] Video quality selection
## TODO

View File

@ -6,8 +6,8 @@ android {
applicationId "net.schueller.peertube"
minSdkVersion 21
targetSdkVersion 28
versionCode 1023
versionName "1.0.23"
versionCode 1024
versionName "1.0.24"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ext {
libVersions = [

View File

@ -0,0 +1,125 @@
/*
* Copyright 2018 Stefan Schüller <sschueller@techdroid.com>
*
* License: GPL-3.0+
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.schueller.peertube.fragment;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.mikepenz.iconics.Iconics;
import net.schueller.peertube.R;
import net.schueller.peertube.model.File;
import net.schueller.peertube.model.Resolution;
import java.util.ArrayList;
import androidx.annotation.Nullable;
public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
private static ArrayList<File> mFiles;
public static final String TAG = "VideoMenuQuality";
private static File autoQualityFile;
public static VideoMenuQualityFragment newInstance(ArrayList<File> files) {
mFiles = files;
// Auto quality
if (autoQualityFile == null) {
autoQualityFile = new File();
Resolution autoQualityResolution = new Resolution();
autoQualityResolution.setId(0);
autoQualityResolution.setLabel("Auto");
autoQualityFile.setId(0);
autoQualityFile.setResolution(autoQualityResolution);
}
if (!mFiles.contains(autoQualityFile)) {
mFiles.add(0, autoQualityFile);
}
return new VideoMenuQualityFragment();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_video_options_quality_popup_menu, container,
false);
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
Integer videoQuality = sharedPref.getInt("pref_quality", 0);
for (File file : mFiles) {
LinearLayout menuRow = (LinearLayout) inflater.inflate(R.layout.row_popup_menu, null);
TextView iconView = menuRow.findViewById(R.id.video_quality_icon);
iconView.setId(file.getResolution().getId());
TextView textView = menuRow.findViewById(R.id.video_quality_text);
Log.v(TAG, file.getResolution().getLabel());
textView.setText(file.getResolution().getLabel());
textView.setOnClickListener(view1 -> {
// Log.v(TAG, file.getResolution().getLabel());
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("pref_quality", file.getResolution().getId());
editor.apply();
for (File fileV : mFiles) {
TextView iconViewV = view.findViewById(fileV.getResolution().getId());
iconViewV.setText("");
}
iconView.setText(R.string.video_quality_active_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build();
//TODO: set new video quality on running video
});
// Add to menu
LinearLayout menuHolder = view.findViewById(R.id.video_quality_menu);
menuHolder.addView(menuRow);
// Set current
if (videoQuality.equals(file.getResolution().getId())) {
iconView.setText(R.string.video_quality_active_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build();
}
}
return view;
}
}

View File

@ -0,0 +1,97 @@
/*
* Copyright 2018 Stefan Schüller <sschueller@techdroid.com>
*
* License: GPL-3.0+
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.schueller.peertube.fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.mikepenz.iconics.Iconics;
import net.schueller.peertube.R;
import net.schueller.peertube.service.VideoPlayerService;
import androidx.annotation.Nullable;
public class VideoMenuSpeedFragment extends BottomSheetDialogFragment {
private static VideoPlayerService videoPlayerService;
public static final String TAG = "VideoMenuSpeed";
private TextView speed05Icon;
private TextView speed10Icon;
private TextView speed15Icon;
private TextView speed20Icon;
public static VideoMenuSpeedFragment newInstance(VideoPlayerService mService) {
videoPlayerService = mService;
return new VideoMenuSpeedFragment();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_video_options_speed_popup_menu, container,
false);
// Icons
speed05Icon = view.findViewById(R.id.video_speed05_icon);
speed10Icon = view.findViewById(R.id.video_speed10_icon);
speed15Icon = view.findViewById(R.id.video_speed15_icon);
speed20Icon = view.findViewById(R.id.video_speed20_icon);
// Buttons
TextView speed05 = view.findViewById(R.id.video_speed05);
TextView speed10 = view.findViewById(R.id.video_speed10);
TextView speed15 = view.findViewById(R.id.video_speed15);
TextView speed20 = view.findViewById(R.id.video_speed20);
// Default
setVideoSpeed(1.0f, speed10Icon);
// Attach the listener
speed05.setOnClickListener(v -> setVideoSpeed(0.5f, speed05Icon));
speed10.setOnClickListener(v -> setVideoSpeed(1.0f, speed10Icon));
speed15.setOnClickListener(v -> setVideoSpeed(1.5f, speed15Icon));
speed20.setOnClickListener(v -> setVideoSpeed(2.0f, speed20Icon));
return view;
}
private void setVideoSpeed(Float speed, TextView icon) {
speed05Icon.setText("");
speed10Icon.setText("");
speed15Icon.setText("");
speed20Icon.setText("");
videoPlayerService.setPlayBackSpeed(speed);
icon.setText(R.string.video_speed_active_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(icon).build();
}
}

View File

@ -251,11 +251,10 @@ public class VideoMetaDataFragment extends Fragment {
new Iconics.IconicsBuilder().ctx(context).on(videoOptions).build();
videoOptions.setOnClickListener(v -> {
VideoOptionsFragment videoOptionsFragment =
VideoOptionsFragment.newInstance(mService);
VideoOptionsFragment.newInstance(mService, video.getFiles());
videoOptionsFragment.show(getActivity().getSupportFragmentManager(),
"video_options_fragment");
VideoOptionsFragment.TAG);
});
}

View File

@ -17,30 +17,36 @@
*/
package net.schueller.peertube.fragment;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.mikepenz.iconics.Iconics;
import net.schueller.peertube.R;
import net.schueller.peertube.model.File;
import net.schueller.peertube.service.VideoPlayerService;
import java.util.ArrayList;
import androidx.annotation.Nullable;
public class VideoOptionsFragment extends BottomSheetDialogFragment {
private static VideoPlayerService videoPlayerService;
private static ArrayList<File> files;
private TextView speed05Icon;
private TextView speed10Icon;
private TextView speed15Icon;
private TextView speed20Icon;
public static final String TAG = "VideoOptions";
public static VideoOptionsFragment newInstance(VideoPlayerService mService) {
public static VideoOptionsFragment newInstance(VideoPlayerService mService, ArrayList<File> mFiles) {
videoPlayerService = mService;
files = mFiles;
return new VideoOptionsFragment();
}
@ -53,43 +59,40 @@ public class VideoOptionsFragment extends BottomSheetDialogFragment {
View view = inflater.inflate(R.layout.fragment_video_options_popup_menu, container,
false);
// Icons
speed05Icon = view.findViewById(R.id.video_speed05_icon);
speed10Icon = view.findViewById(R.id.video_speed10_icon);
speed15Icon = view.findViewById(R.id.video_speed15_icon);
speed20Icon = view.findViewById(R.id.video_speed20_icon);
LinearLayout menuHolder = view.findViewById(R.id.video_options_popup);
// Buttons
TextView speed05 = view.findViewById(R.id.video_speed05);
TextView speed10 = view.findViewById(R.id.video_speed10);
TextView speed15 = view.findViewById(R.id.video_speed15);
TextView speed20 = view.findViewById(R.id.video_speed20);
// Video Speed
LinearLayout menuRow = (LinearLayout) inflater.inflate(R.layout.row_popup_menu, null);
TextView iconView = menuRow.findViewById(R.id.video_quality_icon);
TextView textView = menuRow.findViewById(R.id.video_quality_text);
textView.setText(getString(R.string.menu_video_options_playback_speed));
iconView.setText(R.string.video_option_speed_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build();
textView.setOnClickListener(view1 -> {
VideoMenuSpeedFragment videoMenuSpeedFragment =
VideoMenuSpeedFragment.newInstance(videoPlayerService);
videoMenuSpeedFragment.show(getActivity().getSupportFragmentManager(),
VideoMenuSpeedFragment.TAG);
});
menuHolder.addView(menuRow);
// Default
setVideoSpeed(1.0f, speed10Icon);
// Attach the listener
speed05.setOnClickListener(v -> setVideoSpeed(0.5f, speed05Icon));
speed10.setOnClickListener(v -> setVideoSpeed(1.0f, speed10Icon));
speed15.setOnClickListener(v -> setVideoSpeed(1.5f, speed15Icon));
speed20.setOnClickListener(v -> setVideoSpeed(2.0f, speed20Icon));
// Video Quality
LinearLayout menuRow2 = (LinearLayout) inflater.inflate(R.layout.row_popup_menu, null);
TextView iconView2 = menuRow2.findViewById(R.id.video_quality_icon);
TextView textView2 = menuRow2.findViewById(R.id.video_quality_text);
textView2.setText(getString(R.string.menu_video_options_quality));
iconView2.setText(R.string.video_option_quality_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView2).build();
textView2.setOnClickListener(view1 -> {
VideoMenuQualityFragment videoMenuQualityFragment =
VideoMenuQualityFragment.newInstance(files);
videoMenuQualityFragment.show(getActivity().getSupportFragmentManager(),
videoMenuQualityFragment.TAG);
});
menuHolder.addView(menuRow2);
return view;
}
private void setVideoSpeed(Float speed, TextView icon) {
speed05Icon.setText("");
speed10Icon.setText("");
speed15Icon.setText("");
speed20Icon.setText("");
videoPlayerService.setPlayBackSpeed(speed);
icon.setText(R.string.video_speed_active_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(icon).build();
}
}

View File

@ -34,6 +34,8 @@ import android.view.LayoutInflater;
import android.view.Surface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
@ -54,6 +56,7 @@ import com.mikepenz.iconics.Iconics;
import net.schueller.peertube.R;
import net.schueller.peertube.helper.APIUrlHelper;
import net.schueller.peertube.model.File;
import net.schueller.peertube.model.Video;
import net.schueller.peertube.network.GetVideoDataService;
import net.schueller.peertube.network.RetrofitInstance;
@ -77,6 +80,7 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
private Boolean isFullscreen = false;
private VideoPlayerService mService;
private TorrentStream torrentStream;
private LinearLayout torrentStatus;
private static final String TAG = "VideoPlayerFragment";
@ -122,7 +126,7 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
mVideoUuid = videoUuid;
assert activity != null;
progressBar = activity.findViewById(R.id.progress);
progressBar = activity.findViewById(R.id.torrent_progress);
progressBar.setMax(100);
simpleExoPlayerView = new PlayerView(context);
@ -131,6 +135,8 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
simpleExoPlayerView.setControllerShowTimeoutMs(1000);
simpleExoPlayerView.setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FIT);
torrentStatus = activity.findViewById(R.id.exo_torrent_status);
// Full screen Icon
TextView fullscreenButton = activity.findViewById(R.id.exo_fullscreen);
fullscreenButton.setText(R.string.video_expand_icon);
@ -202,18 +208,29 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
assert videoMetaDataFragment != null;
videoMetaDataFragment.updateVideoMeta(video, mService);
Log.v(TAG, "url : " + video.getFiles().get(0).getFileUrl());
mService.setCurrentStreamUrl(video.getFiles().get(0).getFileUrl());
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
if (sharedPref.getBoolean("pref_torrent_player", false)) {
if (sharedPref.getBoolean("pref_torrent_player", false)) {
torrentStatus.setVisibility(View.VISIBLE);
String stream = video.getFiles().get(0).getTorrentUrl();
Log.v(TAG, "getTorrentUrl : " + video.getFiles().get(0).getTorrentUrl());
torrentStream = setupTorrentStream();
torrentStream.startStream(stream);
} else {
Integer videoQuality = sharedPref.getInt("pref_quality", 0);
//get video qualities
String urlToPlay = video.getFiles().get(0).getFileUrl();
for (File file :video.getFiles()) {
// Set quality if it matches
if (file.getResolution().getId().equals(videoQuality)) {
urlToPlay = file.getFileUrl();
}
}
mService.setCurrentStreamUrl(urlToPlay);
torrentStatus.setVisibility(View.GONE);
startPlayer();
}
Log.v(TAG, "end of load Video");

View File

@ -21,7 +21,6 @@ public class File {
private Integer id;
private String fileDownloadUrl;
private Integer fps;
private String label;
private Resolution resolution;
private String resolutionLabel;
private String magnetUri;
@ -54,14 +53,6 @@ public class File {
this.fps = fps;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public Resolution getResolution() {
return resolution;
}

View File

@ -4,124 +4,7 @@
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:background="@color/videoBackgroundColor"
android:id="@+id/video_options_popup"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/video_speed05_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_speed05"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text="@string/video_speed_05"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/video_speed10_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_speed10"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text="@string/video_speed_10"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/video_speed15_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_speed15"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text="@string/video_speed_15"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/video_speed20_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_speed20"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text="@string/video_speed_20"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,11 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/video_quality_menu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:background="@color/videoBackgroundColor"
android:orientation="vertical">
</LinearLayout>

View File

@ -0,0 +1,127 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:background="@color/videoBackgroundColor"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/video_speed05_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_speed05"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text="@string/video_speed_05"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/video_speed10_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_speed10"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text="@string/video_speed_10"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/video_speed15_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_speed15"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text="@string/video_speed_15"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/video_speed20_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_speed20"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text="@string/video_speed_20"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>

View File

@ -15,12 +15,5 @@
/>
<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:max="100" />
</LinearLayout>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/video_quality_icon"
android:layout_width="32dp"
android:layout_height="56dp"
android:layout_marginStart="16dp"
android:gravity="center|start"
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="12sp" />
<TextView
android:id="@+id/video_quality_text"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:gravity="center|start"
android:text=""
android:textAllCaps="false"
android:textColor="#ffffff"
android:textSize="16sp" />
</LinearLayout>

View File

@ -10,8 +10,6 @@
android:orientation="vertical"
tools:targetApi="28">
<FrameLayout
android:id="@+id/exo_more_button"
android:layout_width="32dp"
@ -146,4 +144,20 @@
</LinearLayout>
<LinearLayout
android:visibility="gone"
android:id="@+id/exo_torrent_status"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/torrent_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:indeterminate="false"
android:max="100" />
</LinearLayout>
</LinearLayout>

View File

@ -0,0 +1,331 @@
<resources>
<string name="app_name" translatable="false">PeerTube</string>
<string name="title_activity_video_play">VideoPlayActivity</string>
<string name="title_activity_settings">সেটিং</string>
<string name="title_activity_login">সাইন ইন</string>
<!-- Strings related to login -->
<string name="prompt_server">সার্ভার</string>
<string name="prompt_email">ইমেল / ইয়ুজারনেম</string>
<string name="prompt_password">পাসওয়ার্ড</string>
<string name="action_sign_in">সাইন ইন</string>
<string name="action_sign_in_short">সাইন ইন</string>
<string name="error_invalid_email">ভুল ইমেল আইডি</string>
<string name="error_invalid_password">পাসওয়ার্ড খুব ছোট</string>
<string name="error_incorrect_password">ভুল পাসওয়ার্ড</string>
<string name="error_field_required">এটি জরুরি ফিল্ড</string>
<string name="permission_rationale">"Contacts permissions are needed for providing email
completions."
</string>
<!-- Action bar -->
<string name="action_bar_title_search">সার্চ</string>
<string name="action_bar_title_settings">সেটিং</string>
<string name="action_bar_title_logout">" লগআউট"</string>
<!-- Bottom navigation bar -->
<string name="bottom_nav_title_home">হোম</string>
<string name="bottom_nav_title_trending">"Trending"</string>
<string name="bottom_nav_title_subscriptions">Subscriptions</string>
<string name="bottom_nav_title_account">একাউন্ট</string>
<!-- Strings related to Settings -->
<string name="peertube_required_server_version" translatable="false">1.0.0-alpha.7</string>
<string name="pref_default_api_base_url" formatted="false" translatable="false">https://troll.tv</string>
<string name="pref_title_peertube_server">PeerTube Server</string>
<!-- Strings related to Video meta data -->
<string name="meta_data_seperator" translatable="false">\u0020-\u0020</string>
<string name="meta_data_views">\u0020Views</string>
<string name="meta_data_owner_seperator" translatable="false">\@</string>
<string name="video_row_video_thumbnail">Video Thumbnail</string>
<string name="video_row_account_avatar">Account Avatar</string>
<string name="pref_title_show_nsfw">NSFW দেখাও</string>
<string name="pref_description_show_nsfw">NSFW content will be shown if enabled.</string>
<string name="pref_language">ভাষা ফিলটার</string>
<string name="pref_description_language">" ভিডিওর ভাষা পছন্দ করুন, কিছু পছন্দ না করলে সব ভাষার ভিডিও দেখা যাবে"</string>
<string name="title_activity_url_video_play">UrlVideoPlayActivity</string>
<string name="pref_title_torrent_player">Torrent Video Player</string>
<string name="pref_description_torrent_player">Video playback via a torrent stream. This requires Storage Permissions. (Alpha, not stable!)</string>
<string name="pref_title_license">লাইসেন্স</string>
<string name="pref_description_license">\n<b>GNU Affero General Public License v3.0</b>\n\nPermissions of this strongest copyleft license are conditioned on making available complete source code of licensed works and modifications, which include larger works using a licensed work, under the same license. Copyright and license notices must be preserved. Contributors provide an express grant of patent rights. When a modified version is used to provide a service over a network, the complete source code of the modified version must be made available.</string>
<string name="pref_title_version">ভার্সন</string>
<string name="search_hint">সার্চ PeerTube</string>
<string name="title_activity_search">সার্চ</string>
<string name="no_data_available">" কোন উত্তর নেই"</string>
<string name="descr_overflow_button">আরও</string>
<string name="menu_share">শেয়ার</string>
<string name="playback_channel_name" translatable="false">PeerTube</string>
<string name="invalid_url">Invalid Url!</string>
<string name="pref_title_dark_mode">ডার্ক মোড</string>
<string name="pref_description_dark_mode">Restart App for Dark Mode to take effect.</string>
<string name="pref_title_app_theme">App Theme</string>
<string name="pref_description_app_theme">Restart App for theme to take effect.</string>
<string name="ab">Abkhazian</string>
<string name="aa">Afar</string>
<string name="af">Afrikaans</string>
<string name="ak">Akan</string>
<string name="sq">Albanian</string>
<string name="ase">American Sign Language</string>
<string name="am">Amharic</string>
<string name="ar">Arabic</string>
<string name="an">Aragonese</string>
<string name="hy">Armenian</string>
<string name="as">Assamese</string>
<string name="av">Avaric</string>
<string name="ay">Aymara</string>
<string name="az">Azerbaijani</string>
<string name="bm">Bambara</string>
<string name="ba">Bashkir</string>
<string name="eu">Basque</string>
<string name="be">Belarusian</string>
<string name="bn">বাংলা</string>
<string name="bi">Bislama</string>
<string name="bs">Bosnian</string>
<string name="bzs">Brazilian Sign Language</string>
<string name="br">Breton</string>
<string name="bfi">British Sign Language</string>
<string name="bg">Bulgarian</string>
<string name="my">Burmese</string>
<string name="ca">Catalan</string>
<string name="ch">Chamorro</string>
<string name="ce">Chechen</string>
<string name="zh">Chinese</string>
<string name="csl">Chinese Sign Language</string>
<string name="cv">Chuvash</string>
<string name="kw">Cornish</string>
<string name="co">Corsican</string>
<string name="cr">Cree</string>
<string name="hr">Croatian</string>
<string name="cs">Czech</string>
<string name="cse">Czech Sign Language</string>
<string name="da">Danish</string>
<string name="dsl">Danish Sign Language</string>
<string name="dv">Dhivehi</string>
<string name="nl">Dutch</string>
<string name="dz">Dzongkha</string>
<string name="en">ইংলিশ</string>
<string name="eo">Esperanto</string>
<string name="et">Estonian</string>
<string name="ee">Ewe</string>
<string name="fo">Faroese</string>
<string name="fj">Fijian</string>
<string name="fi">Finnish</string>
<string name="fr">French</string>
<string name="fsl">French Sign Language</string>
<string name="ff">Fulah</string>
<string name="gl">Galician</string>
<string name="lg">Ganda</string>
<string name="ka">Georgian</string>
<string name="de">German</string>
<string name="gsg">German Sign Language</string>
<string name="gn">Guarani</string>
<string name="gu">Gujarati</string>
<string name="ht">Haitian</string>
<string name="ha">Hausa</string>
<string name="he">Hebrew</string>
<string name="hz">Herero</string>
<string name="hi">Hindi</string>
<string name="ho">Hiri Motu</string>
<string name="hu">Hungarian</string>
<string name="is">Icelandic</string>
<string name="ig">Igbo</string>
<string name="id">Indonesian</string>
<string name="iu">Inuktitut</string>
<string name="ik">Inupiaq</string>
<string name="ga">Irish</string>
<string name="it">Italian</string>
<string name="ja">Japanese</string>
<string name="jsl">Japanese Sign Language</string>
<string name="jv">Javanese</string>
<string name="kl">Kalaallisut</string>
<string name="kn">Kannada</string>
<string name="kr">Kanuri</string>
<string name="ks">Kashmiri</string>
<string name="kk">Kazakh</string>
<string name="km">Khmer</string>
<string name="ki">Kikuyu</string>
<string name="rw">Kinyarwanda</string>
<string name="ky">Kirghiz</string>
<string name="tlh">Klingon</string>
<string name="kv">Komi</string>
<string name="kg">Kongo</string>
<string name="ko">Korean</string>
<string name="avk">Kotava</string>
<string name="kj">Kuanyama</string>
<string name="ku">Kurdish</string>
<string name="lo">Lao</string>
<string name="lv">Latvian</string>
<string name="li">Limburgan</string>
<string name="ln">Lingala</string>
<string name="lt">Lithuanian</string>
<string name="jbo">Lojban</string>
<string name="lu">Luba-Katanga</string>
<string name="lb">Luxembourgish</string>
<string name="mk">Macedonian</string>
<string name="mg">Malagasy</string>
<string name="ms">Malay (macrolanguage)</string>
<string name="ml">Malayalam</string>
<string name="mt">Maltese</string>
<string name="gv">Manx</string>
<string name="mi">Maori</string>
<string name="mr">Marathi</string>
<string name="mh">Marshallese</string>
<string name="el">Modern Greek (1453-)</string>
<string name="mn">Mongolian</string>
<string name="na">Nauru</string>
<string name="nv">Navajo</string>
<string name="ng">Ndonga</string>
<string name="ne">Nepali (macrolanguage)</string>
<string name="nd">North Ndebele</string>
<string name="se">Northern Sami</string>
<string name="no">Norwegian</string>
<string name="nb">Norwegian Bokmål</string>
<string name="nn">Norwegian Nynorsk</string>
<string name="ny">Nyanja</string>
<string name="oc">Occitan</string>
<string name="oj">Ojibwa</string>
<string name="or">Oriya (macrolanguage)</string>
<string name="om">Oromo</string>
<string name="os">Ossetian</string>
<string name="pks">Pakistan Sign Language</string>
<string name="pa">Panjabi</string>
<string name="fa">Persian</string>
<string name="pl">Polish</string>
<string name="pt">Portuguese</string>
<string name="ps">Pushto</string>
<string name="qu">Quechua</string>
<string name="ro">Romanian</string>
<string name="rm">Romansh</string>
<string name="rn">Rundi</string>
<string name="ru">Russian</string>
<string name="rsl">Russian Sign Language</string>
<string name="sm">Samoan</string>
<string name="sg">Sango</string>
<string name="sc">Sardinian</string>
<string name="sdl">Saudi Arabian Sign Language</string>
<string name="gd">Scottish Gaelic</string>
<string name="sr">Serbian</string>
<string name="sh">Serbo-Croatian</string>
<string name="sn">Shona</string>
<string name="ii">Sichuan Yi</string>
<string name="sd">Sindhi</string>
<string name="si">Sinhala</string>
<string name="sk">Slovak</string>
<string name="sl">Slovenian</string>
<string name="so">Somali</string>
<string name="sfs">South African Sign Language</string>
<string name="nr">South Ndebele</string>
<string name="st">Southern Sotho</string>
<string name="es">Spanish</string>
<string name="su">Sundanese</string>
<string name="sw">Swahili (macrolanguage)</string>
<string name="ss">Swati</string>
<string name="sv">Swedish</string>
<string name="swl">Swedish Sign Language</string>
<string name="tl">Tagalog</string>
<string name="ty">Tahitian</string>
<string name="tg">Tajik</string>
<string name="ta">Tamil</string>
<string name="tt">Tatar</string>
<string name="te">Telugu</string>
<string name="th">Thai</string>
<string name="bo">Tibetan</string>
<string name="ti">Tigrinya</string>
<string name="to">Tonga (Tonga Islands)</string>
<string name="ts">Tsonga</string>
<string name="tn">Tswana</string>
<string name="tr">Turkish</string>
<string name="tk">Turkmen</string>
<string name="tw">Twi</string>
<string name="ug">Uighur</string>
<string name="uk">Ukrainian</string>
<string name="ur">Urdu</string>
<string name="uz">Uzbek</string>
<string name="ve">Venda</string>
<string name="vi">Vietnamese</string>
<string name="wa">Walloon</string>
<string name="cy">Welsh</string>
<string name="fy">Western Frisian</string>
<string name="wo">Wolof</string>
<string name="xh">Xhosa</string>
<string name="yi">Yiddish</string>
<string name="yo">Yoruba</string>
<string name="za">Zhuang</string>
<string name="zu">Zulu</string>
<string name="red">লাল</string>
<string name="pink">গোলাপি</string>
<string name="purple">বেগুনি</string>
<string name="indigo">Indigo</string>
<string name="blue">নীল</string>
<string name="lightblue">হালকা নীল</string>
<string name="cyan">Cyan</string>
<string name="teal">Teal</string>
<string name="green">সবুজ</string>
<string name="lightgreen">হালকা সবুজ</string>
<string name="lime">Lime</string>
<string name="yellow">হলুদ</string>
<string name="amber">Amber</string>
<string name="orange">কমলা</string>
<string name="deeporange">Deep Orange</string>
<string name="brown">বাদামী</string>
<string name="gray">ধুসর</string>
<string name="bluegray">Bluegray</string>
<string name="video_speed_05">0.5x</string>
<string name="video_speed_10">Normal</string>
<string name="video_speed_15">1.5x</string>
<string name="video_speed_20">2x</string>
<string name="video_speed_active_icon" translatable="false">{faw-check}</string>
<string name="video_expand_icon" translatable="false">{faw-expand}</string>
<string name="video_compress_icon" translatable="false">{faw-compress}</string>
<string name="video_more_icon" translatable="false">{faw-ellipsis-v}</string>
<string name="video_thumbs_up_icon" translatable="false">{faw-thumbs-up}</string>
<string name="video_thumbs_down_icon" translatable="false">{faw-thumbs-down}</string>
<string name="video_share_icon" translatable="false">{faw-share}</string>
<string name="video_download_icon" translatable="false">{faw-download}</string>
<string name="video_save_icon" translatable="false">{faw-save}</string>
<string name="pref_title_background_play">Background Playback</string>
<string name="pref_description_background_play">If enabled, continues to play video in background.</string>
<string name="bottom_nav_title_local">Local</string>
<string name="title_activity_account">একাউন্ট</string>
<string name="menu_video_more_report">রিপোর্ট</string>
<string name="menu_video_more_blacklist">Blacklist</string>
<string name="video_download_permission_error">Can not download video without write permission</string>
<string name="video_rating_failed">Rating Failed</string>
<string name="video_login_required_for_service">You must login to use this 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_category">Category</string>
<string name="video_meta_button_license">License</string>
<string name="video_meta_button_language">ভাষা</string>
<string name="video_meta_button_tags">Tags</string>
<!-- Constants, Don't translate -->
<string name="pref_token_access" translatable="false">pref_token_access</string>
<string name="pref_token_refresh" translatable="false">pref_token_refresh</string>
<string name="pref_token_expiration" translatable="false">pref_token_expiration</string>
<string name="pref_token_type" translatable="false">pref_token_type</string>
<string name="pref_auth_username" translatable="false">pref_auth_username</string>
<string name="pref_auth_password" translatable="false">pref_auth_password</string>
<string name="video_rating_none" translatable="false">none</string>
<string name="video_rating_like" translatable="false">like</string>
<string name="video_rating_dislike" translatable="false">dislike</string>
<string name="deeppurple">গাঢ় বেগুনি</string>
</resources>

View File

@ -252,7 +252,7 @@
<string name="gray">Серый</string>
<string name="bluegray">Серо-голубой</string>
<string name="video_speed_05">0.5x</string>
<string name="video_speed_10">Нормальный</string>
<string name="video_speed_10">Нормальная</string>
<string name="video_speed_15">1.5x</string>
<string name="video_speed_20">2x</string>

View File

@ -435,4 +435,16 @@
</string-array>
<string-array name="empty_array"/>
<string-array name="quality">
<item>Low</item>
<item>Medium</item>
<item>High</item>
</string-array>
<string-array name="qualityValues">
<item>Low</item>
<item>Medium</item>
<item>High</item>
</string-array>
</resources>

View File

@ -46,8 +46,8 @@
<string name="video_row_video_thumbnail">Video Thumbnail</string>
<string name="video_row_account_avatar">Account Avatar</string>
<string name="pref_title_show_nsfw">Show NSFW</string>
<string name="pref_description_show_nsfw">NSFW content will be shown if enabled.</string>
<string name="pref_title_show_nsfw">NSFW Content</string>
<string name="pref_description_show_nsfw">Show NSFW content</string>
<string name="pref_language">Languages filter</string>
<string name="pref_description_language">Select video languages that should be shown. None selected will show all videos in all languages.</string>
<string name="title_activity_url_video_play">UrlVideoPlayActivity</string>
@ -285,8 +285,10 @@
<string name="video_speed_15">1.5x</string>
<string name="video_speed_20">2x</string>
<string name="video_option_speed_icon" translatable="false">{faw-play-circle}</string>
<string name="video_option_quality_icon" translatable="false">{faw-cog}</string>
<string name="video_speed_active_icon" translatable="false">{faw-check}</string>
<string name="video_quality_active_icon" translatable="false">{faw-check}</string>
<string name="video_expand_icon" translatable="false">{faw-expand}</string>
<string name="video_compress_icon" translatable="false">{faw-compress}</string>
<string name="video_more_icon" translatable="false">{faw-ellipsis-v}</string>
@ -315,6 +317,8 @@
<string name="video_meta_button_language">Language</string>
<string name="video_meta_button_tags">Tags</string>
<string name="menu_video_options_playback_speed">Playback speed</string>
<string name="menu_video_options_quality">Quality</string>
<!-- Constants, Don't translate -->
<string name="pref_token_access" translatable="false">pref_token_access</string>
@ -328,4 +332,5 @@
<string name="video_rating_dislike" translatable="false">dislike</string>
</resources>