Merge branch 'develop' into 'master'

Release v1.0.53

See merge request sschueller/peertube!13
This commit is contained in:
Stefan Schüller 2021-01-24 01:08:53 +01:00
commit a937a51db8
37 changed files with 183 additions and 60 deletions

View File

@ -1,3 +1,12 @@
### Version 1.0.53 Tag: v1.0.53 (2021-01-24)
- Making X in pip mode stop background audio properly (@dhk2)
- Adding clear search history option to settings menu (@dhk2)
- Fix no language selected defaults to all video languages
- Updated icon library
- Added buffering indicator to video playback
- Fixed blank video issues on servers offering 0p video.
- Updated translations
### Version 1.0.52 Tag: v1.0.52 (2021-01-17)
- Implemented edit server in server book (@kosharskiy)
- Updated translations

View File

@ -109,11 +109,11 @@ dependencies {
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation "androidx.fragment:fragment-ktx:$fragment_version"
implementation 'de.hdodenhof:circleimageview:3.0.0'
implementation 'de.hdodenhof:circleimageview:3.1.0'
// font awesome
implementation "com.mikepenz:iconics-core:3.1.0"
implementation 'com.mikepenz:fontawesome-typeface:5.3.1.1@aar'
implementation 'com.mikepenz:iconics-core:5.2.4'
implementation 'com.mikepenz:fontawesome-typeface:5.9.0.2-kotlin@aar'
// http client / REST
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
@ -141,10 +141,10 @@ dependencies {
implementation "com.google.android.exoplayer:extension-okhttp:$exoplayer"
// date formatter
implementation 'org.ocpsoft.prettytime:prettytime:4.0.4.Final'
implementation 'org.ocpsoft.prettytime:prettytime:5.0.0.Final'
// Version comparison
implementation 'org.apache.maven:maven-artifact:3.5.0'
implementation 'org.apache.maven:maven-artifact:3.6.3'
// database lib
implementation "androidx.room:room-runtime:$room_version"
@ -162,7 +162,7 @@ dependencies {
implementation 'androidx.preference:preference-ktx:1.1.1'
// testing
testImplementation 'junit:junit:4.13'
testImplementation 'junit:junit:4.13.1'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
androidTestImplementation "androidx.room:room-testing:$room_version"

View File

@ -67,6 +67,13 @@
android:exported="false" />
<service android:name=".service.VideoPlayerService" />
<receiver android:name="androidx.media.session.MediaButtonReceiver" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
</application>
</manifest>

View File

@ -24,12 +24,11 @@ import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.bottomnavigation.LabelVisibilityMode;
import com.mikepenz.fontawesome_typeface_library.FontAwesome;
import com.mikepenz.iconics.IconicsDrawable;
import com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome;
import com.squareup.picasso.Picasso;
import net.schueller.peertube.R;

View File

@ -20,6 +20,7 @@ import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.SearchRecentSuggestions;
import android.util.Log;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog.Builder;
@ -30,6 +31,7 @@ import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreference;
import net.schueller.peertube.BuildConfig;
import net.schueller.peertube.R;
import net.schueller.peertube.provider.SearchSuggestionsProvider;
public class SettingsActivity extends CommonActivity {
@ -108,6 +110,28 @@ public class SettingsActivity extends CommonActivity {
return true;
});
}
//clear search history buttonish
Preference button = findPreference(getString(R.string.pref_clear_history_key));
button.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
new Builder(preference.getContext())
.setTitle(R.string.clear_search_history)
.setMessage(R.string.clear_search_history_prompt)
.setIcon(R.drawable.ic_info_black_24dp)
.setNegativeButton(R.string.pref_insecure_confirm_no, (dialog, whichButton) -> {
// do nothing
})
.setPositiveButton(R.string.pref_insecure_confirm_yes, (dialog, whichButton) -> {
// OK has been pressed
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(getContext(),
SearchSuggestionsProvider.AUTHORITY,
SearchSuggestionsProvider.MODE);
suggestions.clearHistory();
}).create().show();
return true;
}
});
}
}
}

View File

@ -50,11 +50,10 @@ import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.mikepenz.fontawesome_typeface_library.FontAwesome;
import com.mikepenz.iconics.IconicsDrawable;
import com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome;
import net.schueller.peertube.R;
import net.schueller.peertube.adapter.VideoAdapter;
import net.schueller.peertube.helper.APIUrlHelper;
@ -130,15 +129,15 @@ public class VideoListActivity extends CommonActivity {
// Set an icon in the ActionBar
menu.findItem(R.id.action_account).setIcon(
new IconicsDrawable(this, FontAwesome.Icon.faw_user_circle).actionBar());
new IconicsDrawable(this, FontAwesome.Icon.faw_user_circle));
menu.findItem(R.id.action_server_address_book).setIcon(
new IconicsDrawable(this, FontAwesome.Icon.faw_server).actionBar());
new IconicsDrawable(this, FontAwesome.Icon.faw_server));
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
searchMenuItem.setIcon(
new IconicsDrawable(this, FontAwesome.Icon.faw_search).actionBar());
new IconicsDrawable(this, FontAwesome.Icon.faw_search));
// Get the SearchView and set the searchable configuration
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
@ -324,13 +323,16 @@ public class VideoListActivity extends CommonActivity {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String nsfw = sharedPref.getBoolean(getString(R.string.pref_show_nsfw_key), false) ? "both" : "false";
Locale locale = getResources().getConfiguration().locale;
String country = locale.getLanguage();
//
// Locale locale = getResources().getConfiguration().locale;
// String country = locale.getLanguage();
//
// HashSet<String> countries = new HashSet<>(1);
// countries.add(country);
HashSet<String> countries = new HashSet<>(1);
countries.add(country);
// We set this to default to null so that on initial start there are videos listed.
Set<String> languages = sharedPref.getStringSet(getString(R.string.pref_video_language_key), null);
Set<String> languages = sharedPref.getStringSet(getString(R.string.pref_video_language_key), countries);
String apiBaseURL = APIUrlHelper.getUrlWithVersion(this);
GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(this)).create(GetVideoDataService.class);

View File

@ -115,7 +115,7 @@ public class ChannelAdapter extends RecyclerView.Adapter<ChannelAdapter.AccountV
});
holder.moreButton.setText(R.string.video_more_icon);
new Iconics.IconicsBuilder().ctx(context).on(holder.moreButton).build();
new Iconics.Builder().on(holder.moreButton).build();
holder.moreButton.setOnClickListener(v -> {

View File

@ -119,7 +119,7 @@ public class ServerSearchAdapter extends RecyclerView.Adapter<ServerSearchAdapte
//
//
// holder.moreButton.setText(R.string.video_more_icon);
// new Iconics.IconicsBuilder().ctx(context).on(holder.moreButton).build();
// new Iconics.Builder().on(holder.moreButton).build();
//
// holder.moreButton.setOnClickListener(v -> {
//

View File

@ -131,7 +131,7 @@ public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHol
});
holder.moreButton.setText(R.string.video_more_icon);
new Iconics.IconicsBuilder().ctx(context).on(holder.moreButton).build();
new Iconics.Builder().on(holder.moreButton).build();
holder.moreButton.setOnClickListener(v -> {

View File

@ -52,9 +52,9 @@ public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
if (autoQualityFile == null) {
autoQualityFile = new File();
Resolution autoQualityResolution = new Resolution();
autoQualityResolution.setId(0);
autoQualityResolution.setId(999999);
autoQualityResolution.setLabel(context.getString(R.string.menu_video_options_quality_automated));
autoQualityFile.setId(0);
autoQualityFile.setId(999999);
autoQualityFile.setResolution(autoQualityResolution);
}
if (!mFiles.contains(autoQualityFile)) {
@ -74,7 +74,7 @@ public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
false);
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
Integer videoQuality = sharedPref.getInt(getString(R.string.pref_quality_key), 0);
Integer videoQuality = sharedPref.getInt(getString(R.string.pref_quality_key), 999999);
for (File file : mFiles) {
@ -95,11 +95,13 @@ public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
for (File fileV : mFiles) {
TextView iconViewV = view.findViewById(fileV.getResolution().getId());
iconViewV.setText("");
if (iconViewV != null) {
iconViewV.setText("");
}
}
iconView.setText(R.string.video_quality_active_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build();
new Iconics.Builder().on(iconView).build();
//TODO: set new video quality on running video
@ -112,7 +114,7 @@ public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
// Set current
if (videoQuality.equals(file.getResolution().getId())) {
iconView.setText(R.string.video_quality_active_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build();
new Iconics.Builder().on(iconView).build();
}
}

View File

@ -100,7 +100,7 @@ public class VideoMenuSpeedFragment extends BottomSheetDialogFragment {
videoPlayerService.setPlayBackSpeed(speed);
icon.setText(R.string.video_speed_active_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(icon).build();
new Iconics.Builder().on(icon).build();
}
}

View File

@ -105,7 +105,7 @@ public class VideoMetaDataFragment extends Fragment {
Button thumbsUpButton = activity.findViewById(R.id.video_thumbs_up);
defaultTextColor = thumbsUpButton.getTextColors();
thumbsUpButton.setText(R.string.video_thumbs_up_icon);
new Iconics.IconicsBuilder().ctx(context).on(thumbsUpButton).build();
new Iconics.Builder().on(thumbsUpButton).build();
thumbsUpButton.setOnClickListener(v -> {
rateVideo(true, video);
});
@ -113,7 +113,7 @@ public class VideoMetaDataFragment extends Fragment {
// Thumbs Down
Button thumbsDownButton = activity.findViewById(R.id.video_thumbs_down);
thumbsDownButton.setText(R.string.video_thumbs_down_icon);
new Iconics.IconicsBuilder().ctx(context).on(thumbsDownButton).build();
new Iconics.Builder().on(thumbsDownButton).build();
thumbsDownButton.setOnClickListener(v -> {
rateVideo(false, video);
});
@ -145,7 +145,7 @@ public class VideoMetaDataFragment extends Fragment {
// Share
Button videoShareButton = activity.findViewById(R.id.video_share);
videoShareButton.setText(R.string.video_share_icon);
new Iconics.IconicsBuilder().ctx(context).on(videoShareButton).build();
new Iconics.Builder().on(videoShareButton).build();
videoShareButton.setOnClickListener(v ->
{
leaveAppExpected = true;
@ -155,7 +155,7 @@ public class VideoMetaDataFragment extends Fragment {
// Download
Button videoDownloadButton = activity.findViewById(R.id.video_download);
videoDownloadButton.setText(R.string.video_download_icon);
new Iconics.IconicsBuilder().ctx(context).on(videoDownloadButton).build();
new Iconics.Builder().on(videoDownloadButton).build();
videoDownloadButton.setOnClickListener(v -> {
// get permission to store file
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
@ -235,7 +235,7 @@ public class VideoMetaDataFragment extends Fragment {
// more button
TextView moreButton = activity.findViewById(R.id.moreButton);
moreButton.setText(R.string.video_more_icon);
new Iconics.IconicsBuilder().ctx(context).on(moreButton).build();
new Iconics.Builder().on(moreButton).build();
moreButton.setOnClickListener(v -> {
PopupMenu popup = new PopupMenu(context, v);
@ -260,7 +260,7 @@ public class VideoMetaDataFragment extends Fragment {
// video player options
TextView videoOptions = activity.findViewById(R.id.exo_more);
videoOptions.setText(R.string.video_more_icon);
new Iconics.IconicsBuilder().ctx(context).on(videoOptions).build();
new Iconics.Builder().on(videoOptions).build();
videoOptions.setOnClickListener(v -> {
VideoOptionsFragment videoOptionsFragment =

View File

@ -77,7 +77,7 @@ public class VideoOptionsFragment extends BottomSheetDialogFragment {
iconView.setText(R.string.video_option_speed_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build();
new Iconics.Builder().on(iconView).build();
textView.setOnClickListener(view1 -> {
VideoMenuSpeedFragment videoMenuSpeedFragment =
VideoMenuSpeedFragment.newInstance(videoPlayerService);
@ -92,7 +92,7 @@ public class VideoOptionsFragment extends BottomSheetDialogFragment {
TextView textView2 = menuRow2.findViewById(R.id.video_quality_text);
textView2.setText(String.format(getString(R.string.menu_video_options_quality), getCurrentVideoQuality(files)));
iconView2.setText(R.string.video_option_quality_icon);
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView2).build();
new Iconics.Builder().on(iconView2).build();
textView2.setOnClickListener(view1 -> {
VideoMenuQualityFragment videoMenuQualityFragment =
VideoMenuQualityFragment.newInstance(getContext(), files);
@ -107,7 +107,7 @@ public class VideoOptionsFragment extends BottomSheetDialogFragment {
private String getCurrentVideoQuality(ArrayList<File> files) {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
Integer videoQuality = sharedPref.getInt(getString(R.string.pref_quality_key), 0);
Integer videoQuality = sharedPref.getInt(getString(R.string.pref_quality_key), 999999);
for (File file : files) {
if (videoQuality.equals(file.getResolution().getId())) {

View File

@ -162,7 +162,7 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
FrameLayout fullscreenButton = activity.findViewById(R.id.exo_fullscreen_button);
fullscreenText.setText(R.string.video_expand_icon);
new Iconics.IconicsBuilder().ctx(context).on(fullscreenText).build();
new Iconics.Builder().on(fullscreenText).build();
fullscreenButton.setOnClickListener(view -> {
Log.d(TAG, "Fullscreen");
@ -239,12 +239,12 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
torrentStream.startStream(stream);
} else {
Integer videoQuality = sharedPref.getInt(getString(R.string.pref_quality_key), 0);
Integer videoQuality = sharedPref.getInt(getString(R.string.pref_quality_key), 999999);
//get video qualities
/// #
// get video qualities
// TODO: if auto is set all versions except 0p should be added to a track and have exoplayer auto select optimal bitrate
if (video.getFiles().size() > 0) {
String urlToPlay = video.getFiles().get( 0 ).getFileUrl();
String urlToPlay = video.getFiles().get( 0 ).getFileUrl(); // default, take first found, usually highest res
for ( File file : video.getFiles() ) {
// Set quality if it matches
if ( file.getResolution().getId().equals( videoQuality ) ) {
@ -321,7 +321,7 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
} else {
fullscreenButton.setText(R.string.video_expand_icon);
}
new Iconics.IconicsBuilder().ctx(getContext()).on(fullscreenButton).build();
new Iconics.Builder().on(fullscreenButton).build();
}
public Boolean getIsFullscreen() {

View File

@ -44,6 +44,7 @@ import android.widget.Toast;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer;
@ -53,6 +54,8 @@ import com.google.android.exoplayer2.ext.mediasession.TimelineQueueNavigator;
import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSource;
import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSourceFactory;
import com.google.android.exoplayer2.source.ExtractorMediaSource;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.ui.PlayerNotificationManager;
import com.google.android.exoplayer2.upstream.DataSource;
@ -102,7 +105,9 @@ public class VideoPlayerService extends Service {
super.onCreate();
player = ExoPlayerFactory.newSimpleInstance(getApplicationContext(), new DefaultTrackSelector());
player = new SimpleExoPlayer.Builder(getApplicationContext())
.setTrackSelector(new DefaultTrackSelector(getApplicationContext()))
.build();
// Stop player if audio device changes, e.g. headphones unplugged
player.addListener(new Player.EventListener() {
@ -224,14 +229,18 @@ public class VideoPlayerService extends Service {
okhttpClientBuilder = getUnsafeOkHttpClientBuilder();
}
// Create a data source factory.
DataSource.Factory dataSourceFactory = new OkHttpDataSourceFactory(okhttpClientBuilder.build(), Util.getUserAgent(getApplicationContext(), "PeerTube"));
// This is the MediaSource representing the media to be played.
ExtractorMediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
.createMediaSource(Uri.parse(currentStreamUrl));
// Create a progressive media source pointing to a stream uri.
MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(MediaItem.fromUri(Uri.parse(currentStreamUrl)));
// Prepare the player with the source.
player.prepare(videoSource);
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();
// Auto play
player.setPlayWhenReady(true);

View File

@ -13,7 +13,7 @@
android:background="@color/videoBackgroundColor"
app:controller_layout_id="@layout/video_playback_controls"
app:resize_mode="fixed_width"
app:show_buffering="always"
/>

View File

@ -40,4 +40,9 @@
<string name="video_speed_20">2×</string>
<string name="video_speed_15">1,5×</string>
<string name="video_speed_05">0,5×</string>
<string name="pref_title_background_play">Αναπαραγωγή στο παρασκήνιο</string>
<string name="pref_title_peertube_server">Εξυπηρετητής PeerTube</string>
<string name="pref_description_language">Επιλογή γλώσσας βίντεο, αντί να εμφανίζονται όλα τα βίντεο σε όλες τις γλώσσες.</string>
<string name="pref_title_version">Έκδοση</string>
<string name="pref_title_license">Άδεια χρήσης</string>
</resources>

View File

@ -174,4 +174,21 @@
<string name="pref_background_audio">Continuar como audio en segundo plano</string>
<string name="pref_description_language_app">Selecciona el idioma de la interfaz de la aplicación. Reinicia para que los cambios se apliquen.</string>
<string name="pref_title_back_pause">Pausar con el botón de retroceso</string>
<string name="bzs">Portugués Brasileño (Lenguaje de Señas)</string>
<string name="csl">Chino (Lenguaje de señas)</string>
<string name="zh">Chino</string>
<string name="ce">Checheno</string>
<string name="ch">Chamorro</string>
<string name="ca">Catalán</string>
<string name="my">Birmano</string>
<string name="bg">Búlgaro</string>
<string name="bfi">Idioma de Señas Británico</string>
<string name="br">Bretón</string>
<string name="bs">Bosnio</string>
<string name="bi">Bislama</string>
<string name="bn_rBD">Bengalí (Bangladés)</string>
<string name="pref_title_accept_insecure">Inhabilitar certificación SSL</string>
<string name="pref_description_accept_insecure">Ignorar conexiones inseguras. Usa esta opción únicamente si conoces el servidor al que te vas a conectar. Requiere reiniciar la aplicación.</string>
<string name="pref_background_behavior_summary">La manera en que un vídeo responde al ser enviado al fondo</string>
<string name="pref_description_back_pause">Pausa la reproducción de fondo al presionar atrás durante la reproducción de vídeo.</string>
</resources>

View File

@ -347,4 +347,12 @@
<string name="title_activity_settings">Configurações</string>
<string name="network_error">Erro de acesso à rede, verifique sua conectividade</string>
<string name="server_selection_filter_hint">Filtrar a lista</string>
<string name="settings_activity_advanced_category_title">Avançado</string>
<string name="pref_insecure_confirm_message">Você está prestes a desativar toda a validação de certificação SSL no Thorium. Desativar isso pode ser muito perigoso se o servidor peertube não estiver sob seu controle, pois um ataque man-in-the-middle pode direcionar tráfego para outro servidor sem seu conhecimento. Um atacador pode gravar senhas e outros dados pessoais.</string>
<string name="pref_insecure_confirm_yes">Sim</string>
<string name="pref_insecure_confirm_no">Não</string>
<string name="pref_insecure_confirm_title">Aviso!</string>
<string name="server_book_add_save_button">Salvar</string>
<string name="pref_title_accept_insecure">Desativar check do certificado SSL</string>
<string name="pref_description_accept_insecure">Ignorar conexões não seguras. Use isto apenas se você conhece o servidor ao qual está se conectando. Requer o reinício do app.</string>
</resources>

View File

@ -360,4 +360,5 @@
<string name="pref_insecure_confirm_title">Внимание!</string>
<string name="pref_description_accept_insecure">Игнорировать незащищенные соединения. Используйте только если знаете сервер к которому подключаетесь. Требуется перезапуск приложения.</string>
<string name="pref_insecure_confirm_message">"Вы собираетесь отключить валидацию всех SSL сертификатов в Thorium. Это может быть очень опасно если peertube сервер вами не контролируется, потому что \"атака посредника\" может направить трафик на другой сервер. Злоумышленник может записывать пароли и другие личные данные."</string>
<string name="server_book_add_save_button">Сохранить</string>
</resources>

View File

@ -369,4 +369,5 @@
<string name="settings_activity_advanced_category_title">Gelişmiş</string>
<string name="pref_title_accept_insecure">SSL Sertifika Denetimini Devre Dışı Bırak</string>
<string name="pref_description_accept_insecure">Güvenli olmayan bağlantıları yok sayın. Bunu yalnızca bağlandığınız sunucuyu biliyorsanız kullanın. Uygulamanın yeniden başlatılmasını gerektirir.</string>
<string name="server_book_add_save_button">Kaydet</string>
</resources>

View File

@ -323,7 +323,7 @@
<string name="title_activity_url_video_play">UrlVideoPlayActivity</string>
<string name="video_row_account_avatar">Аватар облікового запису</string>
<string name="video_row_video_thumbnail">Ескіз відео</string>
<string name="meta_data_views">" Перегляди"</string>
<string name="meta_data_views">" переглядів"</string>
<string name="bottom_nav_title_subscriptions">Підписки</string>
<string name="bottom_nav_title_local">Локальне</string>
<string name="bottom_nav_title_recent">Нещодавнє</string>
@ -354,4 +354,5 @@
<string name="pref_insecure_confirm_title">Увага!</string>
<string name="pref_insecure_confirm_message">Ви збираєтеся вимкнути всі перевірки сертифікатів SSL у Thorium. Це може бути дуже небезпечно якщо ви не контролюєте сервер peertube, оскільки атака «людина посередині» може направити трафік на інший сервер без вашого відома. Зловмисник може записувати паролі та інші особисті дані.</string>
<string name="settings_activity_advanced_category_title">Додатково</string>
<string name="server_book_add_save_button">Зберегти</string>
</resources>

View File

@ -354,4 +354,5 @@
<string name="settings_activity_advanced_category_title">進階</string>
<string name="pref_title_accept_insecure">停用 SSL 憑證檢查</string>
<string name="pref_description_accept_insecure">忽略不安全的連線。僅在您了解您要連線的伺服器時才使用此選項。需要重新啟動應用程式。</string>
<string name="server_book_add_save_button">儲存</string>
</resources>

View File

@ -17,6 +17,7 @@
<string name="pref_accept_insecure" translatable="false">pref_accept_insecure</string>
<string name ="pref_clear_history_key" translatable="false">pref_clear_history</string>
<!-- defaults -->
<string name="pref_default_api_base_url" formatted="false" translatable="false">https://troll.tv</string>
<string name="app_default_theme" translatable="false">AppTheme.BLUE</string>

View File

@ -39,6 +39,7 @@
app:iconSpaceReserved="false"/>
<MultiSelectListPreference
app:defaultValue="@array/empty_array"
app:entries="@array/languageArray"
app:entryValues="@array/languageValues"
app:key="@string/pref_video_language_key"
@ -84,6 +85,13 @@
app:title="@string/pref_title_accept_insecure"
app:iconSpaceReserved="false"/>
<Preference
app:title="@string/clear_search_history"
app:key="@string/pref_clear_history_key"
app:summary="@string/clear_search_history_prompt"
app:iconSpaceReserved="false"/>
/>
</PreferenceCategory>
<PreferenceCategory app:title="@string/settings_activity_about_category_title" app:iconSpaceReserved="false">

View File

@ -9,7 +9,7 @@ buildscript {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:4.1.1'
classpath 'com.android.tools.build:gradle:4.1.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

View File

@ -0,0 +1,7 @@
- Making X in pip mode stop background audio properly (@dhk2)
- Adding clear search history option to settings menu (@dhk2)
- Fix no language selected defaults to all video languages
- Updated icon library
- Added buffering indicator to video playback
- Fixed blank video issues on servers offering 0p video.
- Updated translations

View File

@ -0,0 +1,5 @@
- ilk başlangıçta öntanımlı uygulama dili düzeltildi (@kosharskiy)
- Ayarlar ekranı uk ve ru dilleri çevirileri (@kosharskiy)
- app/build.gradle dosyası temizlendi (@kosharskiy)
- video üst verisi görüntüleme sorunu düzeltildi (@kosharskiy)
- çeviriler güncellendi

View File

@ -0,0 +1,2 @@
- Sunucu defterinde sunucu düzenleme uygulandı (@kosharskiy)
- Çeviriler güncellendi

View File

@ -1,7 +1,7 @@
- додано підтримку перенаправлення гіпертексту в опис (@freeboub)
- різні виправлення збоїв (@freeboub)
- уникайте звз під час виходу з програми через кнопку спільного доступу (@freeboub)
- Додайно можливість фільтрувати список серверів (@freeboub)
- Додано можливість фільтрувати список серверів (@freeboub)
- Управління помилками Refactor Toast для розділення помилки мережі (@freeboub)
- збереження співвідношення сторін відео для зображення в зображенні (@freeboub)
- панель навігації не відновлювалась після виходу з альбомного режиму (@freeboub)

View File

@ -0,0 +1,5 @@
- виправлено типову мову першого запуску застосунку (@kosharskiy)
- Налаштування перекладів екрана uk і ru мов (@kosharskiy)
- очищення файлу app/build.gradle (@kosharskiy)
- виправлено проблему показу метаданих відео (@kosharskiy)
- оновлено переклади

View File

@ -0,0 +1,2 @@
- Реалізовано редагування сервера в книзі серверів (@kosharskiy)
- Оновлено переклади

View File

@ -1,4 +1,4 @@
Thorium - це клієнт PeerTube, який може під'єднуватися до будь-якого сервера peertube, що працює версії v1.1.0-alpha.2 або новіших.
Thorium це клієнт PeerTube, який може під'єднуватися до будь-якого сервера peertube, що працює на версії v1.1.0-alpha.2 або новіших.
PeerTube - це об'єднана (ActivityPub) платформа для потокового відео, що використовує P2P (BitTorrent) безпосередньо у браузері. Додаткові відомості та перелік серверів ви знайдете за адресою https://joinpeertube.org/ .
@ -6,7 +6,7 @@ PeerTube - це об'єднана (ActivityPub) платформа для пот
Поточні функції:
- Під'єднання до будь-якого сервера PeerTube
- Торрент-відео або пряме відтворення
- Торент-відео або пряме відтворення
- Пошук у PeerTube
- Завантажити / Поділитися відео
- Теми / Темний режим
@ -14,8 +14,8 @@ PeerTube - це об'єднана (ActivityPub) платформа для пот
- Повноекранне відтворення в альбомному режимі
- Швидкість відтворення
- Фільтрувати вміст NSFW
- Аутентифікація / Вхід
- Вподобати / не подобається відео
- Автентифікація / Вхід
- Вподобати/не подобається відео
Скоро буде:
- Коментувати відео
@ -24,7 +24,7 @@ PeerTube - це об'єднана (ActivityPub) платформа для пот
- Звіт про відео
Дозволи:
- Доступ до сховища, необхідний для завантаження торрента або завантаження відео.
- Доступ до сховища, необхідний для завантаження торента або завантаження відео.
Ліцензовано під загальною публічною ліцензією GNU Affero v3.0

View File

@ -1 +1 @@
Thorium - неофіційний програвач PeerTube
Thorium неофіційний програвач PeerTube

View File

@ -1 +1 @@
Thorium неоф. клієнт PeerTube
Thorium — неофіційний клієнт PeerTube

View File

@ -0,0 +1,5 @@
- 修復第一次啟動時的預設應用程式語言 (@kosharskiy)
- 英式英語與俄語的設定畫面翻譯 (@kosharskiy)
- 清理 app/build.gradle 檔案 (@kosharskiy)
- 已修復影片詮釋資料顯示問題 (@kosharskiy)
- 更新翻譯

View File

@ -0,0 +1,2 @@
- 在伺服器手冊中實作編輯伺服器 (@kosharskiy)
- 更新翻譯