Merge branch 'develop' into 'master'
Release v1.0.53 See merge request sschueller/peertube!13
This commit is contained in:
commit
a937a51db8
@ -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)
|
### Version 1.0.52 Tag: v1.0.52 (2021-01-17)
|
||||||
- Implemented edit server in server book (@kosharskiy)
|
- Implemented edit server in server book (@kosharskiy)
|
||||||
- Updated translations
|
- Updated translations
|
||||||
|
@ -109,11 +109,11 @@ dependencies {
|
|||||||
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
|
||||||
implementation "androidx.fragment:fragment-ktx:$fragment_version"
|
implementation "androidx.fragment:fragment-ktx:$fragment_version"
|
||||||
|
|
||||||
implementation 'de.hdodenhof:circleimageview:3.0.0'
|
implementation 'de.hdodenhof:circleimageview:3.1.0'
|
||||||
|
|
||||||
// font awesome
|
// font awesome
|
||||||
implementation "com.mikepenz:iconics-core:3.1.0"
|
implementation 'com.mikepenz:iconics-core:5.2.4'
|
||||||
implementation 'com.mikepenz:fontawesome-typeface:5.3.1.1@aar'
|
implementation 'com.mikepenz:fontawesome-typeface:5.9.0.2-kotlin@aar'
|
||||||
|
|
||||||
// http client / REST
|
// http client / REST
|
||||||
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
|
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
|
||||||
@ -141,10 +141,10 @@ dependencies {
|
|||||||
implementation "com.google.android.exoplayer:extension-okhttp:$exoplayer"
|
implementation "com.google.android.exoplayer:extension-okhttp:$exoplayer"
|
||||||
|
|
||||||
// date formatter
|
// date formatter
|
||||||
implementation 'org.ocpsoft.prettytime:prettytime:4.0.4.Final'
|
implementation 'org.ocpsoft.prettytime:prettytime:5.0.0.Final'
|
||||||
|
|
||||||
// Version comparison
|
// Version comparison
|
||||||
implementation 'org.apache.maven:maven-artifact:3.5.0'
|
implementation 'org.apache.maven:maven-artifact:3.6.3'
|
||||||
|
|
||||||
// database lib
|
// database lib
|
||||||
implementation "androidx.room:room-runtime:$room_version"
|
implementation "androidx.room:room-runtime:$room_version"
|
||||||
@ -162,7 +162,7 @@ dependencies {
|
|||||||
implementation 'androidx.preference:preference-ktx:1.1.1'
|
implementation 'androidx.preference:preference-ktx:1.1.1'
|
||||||
|
|
||||||
// testing
|
// testing
|
||||||
testImplementation 'junit:junit:4.13'
|
testImplementation 'junit:junit:4.13.1'
|
||||||
androidTestImplementation 'androidx.test:runner:1.3.0'
|
androidTestImplementation 'androidx.test:runner:1.3.0'
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||||
androidTestImplementation "androidx.room:room-testing:$room_version"
|
androidTestImplementation "androidx.room:room-testing:$room_version"
|
||||||
|
@ -67,6 +67,13 @@
|
|||||||
android:exported="false" />
|
android:exported="false" />
|
||||||
|
|
||||||
<service android:name=".service.VideoPlayerService" />
|
<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>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
@ -24,12 +24,11 @@ import android.view.Menu;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import com.google.android.material.bottomnavigation.BottomNavigationView;
|
import com.google.android.material.bottomnavigation.BottomNavigationView;
|
||||||
import com.google.android.material.bottomnavigation.LabelVisibilityMode;
|
import com.google.android.material.bottomnavigation.LabelVisibilityMode;
|
||||||
import com.mikepenz.fontawesome_typeface_library.FontAwesome;
|
|
||||||
import com.mikepenz.iconics.IconicsDrawable;
|
import com.mikepenz.iconics.IconicsDrawable;
|
||||||
|
import com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome;
|
||||||
import com.squareup.picasso.Picasso;
|
import com.squareup.picasso.Picasso;
|
||||||
|
|
||||||
import net.schueller.peertube.R;
|
import net.schueller.peertube.R;
|
||||||
|
@ -20,6 +20,7 @@ import android.content.SharedPreferences;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import android.provider.SearchRecentSuggestions;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import androidx.appcompat.app.AlertDialog.Builder;
|
import androidx.appcompat.app.AlertDialog.Builder;
|
||||||
@ -30,6 +31,7 @@ import androidx.preference.PreferenceFragmentCompat;
|
|||||||
import androidx.preference.SwitchPreference;
|
import androidx.preference.SwitchPreference;
|
||||||
import net.schueller.peertube.BuildConfig;
|
import net.schueller.peertube.BuildConfig;
|
||||||
import net.schueller.peertube.R;
|
import net.schueller.peertube.R;
|
||||||
|
import net.schueller.peertube.provider.SearchSuggestionsProvider;
|
||||||
|
|
||||||
public class SettingsActivity extends CommonActivity {
|
public class SettingsActivity extends CommonActivity {
|
||||||
|
|
||||||
@ -108,6 +110,28 @@ public class SettingsActivity extends CommonActivity {
|
|||||||
return true;
|
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;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -50,11 +50,10 @@ import android.view.MenuInflater;
|
|||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import com.mikepenz.fontawesome_typeface_library.FontAwesome;
|
|
||||||
import com.mikepenz.iconics.IconicsDrawable;
|
import com.mikepenz.iconics.IconicsDrawable;
|
||||||
|
|
||||||
|
import com.mikepenz.iconics.typeface.library.fontawesome.FontAwesome;
|
||||||
import net.schueller.peertube.R;
|
import net.schueller.peertube.R;
|
||||||
import net.schueller.peertube.adapter.VideoAdapter;
|
import net.schueller.peertube.adapter.VideoAdapter;
|
||||||
import net.schueller.peertube.helper.APIUrlHelper;
|
import net.schueller.peertube.helper.APIUrlHelper;
|
||||||
@ -130,15 +129,15 @@ public class VideoListActivity extends CommonActivity {
|
|||||||
|
|
||||||
// Set an icon in the ActionBar
|
// Set an icon in the ActionBar
|
||||||
menu.findItem(R.id.action_account).setIcon(
|
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(
|
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);
|
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
|
||||||
|
|
||||||
searchMenuItem.setIcon(
|
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
|
// Get the SearchView and set the searchable configuration
|
||||||
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
|
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
|
||||||
@ -324,13 +323,16 @@ public class VideoListActivity extends CommonActivity {
|
|||||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
String nsfw = sharedPref.getBoolean(getString(R.string.pref_show_nsfw_key), false) ? "both" : "false";
|
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);
|
// We set this to default to null so that on initial start there are videos listed.
|
||||||
countries.add(country);
|
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);
|
String apiBaseURL = APIUrlHelper.getUrlWithVersion(this);
|
||||||
|
|
||||||
GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(this)).create(GetVideoDataService.class);
|
GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL, APIUrlHelper.useInsecureConnection(this)).create(GetVideoDataService.class);
|
||||||
|
@ -115,7 +115,7 @@ public class ChannelAdapter extends RecyclerView.Adapter<ChannelAdapter.AccountV
|
|||||||
});
|
});
|
||||||
|
|
||||||
holder.moreButton.setText(R.string.video_more_icon);
|
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 -> {
|
holder.moreButton.setOnClickListener(v -> {
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ public class ServerSearchAdapter extends RecyclerView.Adapter<ServerSearchAdapte
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
// holder.moreButton.setText(R.string.video_more_icon);
|
// 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 -> {
|
// holder.moreButton.setOnClickListener(v -> {
|
||||||
//
|
//
|
||||||
|
@ -131,7 +131,7 @@ public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.VideoViewHol
|
|||||||
});
|
});
|
||||||
|
|
||||||
holder.moreButton.setText(R.string.video_more_icon);
|
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 -> {
|
holder.moreButton.setOnClickListener(v -> {
|
||||||
|
|
||||||
|
@ -52,9 +52,9 @@ public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
|
|||||||
if (autoQualityFile == null) {
|
if (autoQualityFile == null) {
|
||||||
autoQualityFile = new File();
|
autoQualityFile = new File();
|
||||||
Resolution autoQualityResolution = new Resolution();
|
Resolution autoQualityResolution = new Resolution();
|
||||||
autoQualityResolution.setId(0);
|
autoQualityResolution.setId(999999);
|
||||||
autoQualityResolution.setLabel(context.getString(R.string.menu_video_options_quality_automated));
|
autoQualityResolution.setLabel(context.getString(R.string.menu_video_options_quality_automated));
|
||||||
autoQualityFile.setId(0);
|
autoQualityFile.setId(999999);
|
||||||
autoQualityFile.setResolution(autoQualityResolution);
|
autoQualityFile.setResolution(autoQualityResolution);
|
||||||
}
|
}
|
||||||
if (!mFiles.contains(autoQualityFile)) {
|
if (!mFiles.contains(autoQualityFile)) {
|
||||||
@ -74,7 +74,7 @@ public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
|
|||||||
false);
|
false);
|
||||||
|
|
||||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
|
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) {
|
for (File file : mFiles) {
|
||||||
|
|
||||||
@ -95,11 +95,13 @@ public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
|
|||||||
|
|
||||||
for (File fileV : mFiles) {
|
for (File fileV : mFiles) {
|
||||||
TextView iconViewV = view.findViewById(fileV.getResolution().getId());
|
TextView iconViewV = view.findViewById(fileV.getResolution().getId());
|
||||||
iconViewV.setText("");
|
if (iconViewV != null) {
|
||||||
|
iconViewV.setText("");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
iconView.setText(R.string.video_quality_active_icon);
|
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
|
//TODO: set new video quality on running video
|
||||||
|
|
||||||
@ -112,7 +114,7 @@ public class VideoMenuQualityFragment extends BottomSheetDialogFragment {
|
|||||||
// Set current
|
// Set current
|
||||||
if (videoQuality.equals(file.getResolution().getId())) {
|
if (videoQuality.equals(file.getResolution().getId())) {
|
||||||
iconView.setText(R.string.video_quality_active_icon);
|
iconView.setText(R.string.video_quality_active_icon);
|
||||||
new Iconics.IconicsBuilder().ctx(getContext()).on(iconView).build();
|
new Iconics.Builder().on(iconView).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -100,7 +100,7 @@ public class VideoMenuSpeedFragment extends BottomSheetDialogFragment {
|
|||||||
videoPlayerService.setPlayBackSpeed(speed);
|
videoPlayerService.setPlayBackSpeed(speed);
|
||||||
|
|
||||||
icon.setText(R.string.video_speed_active_icon);
|
icon.setText(R.string.video_speed_active_icon);
|
||||||
new Iconics.IconicsBuilder().ctx(getContext()).on(icon).build();
|
new Iconics.Builder().on(icon).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -105,7 +105,7 @@ public class VideoMetaDataFragment extends Fragment {
|
|||||||
Button thumbsUpButton = activity.findViewById(R.id.video_thumbs_up);
|
Button thumbsUpButton = activity.findViewById(R.id.video_thumbs_up);
|
||||||
defaultTextColor = thumbsUpButton.getTextColors();
|
defaultTextColor = thumbsUpButton.getTextColors();
|
||||||
thumbsUpButton.setText(R.string.video_thumbs_up_icon);
|
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 -> {
|
thumbsUpButton.setOnClickListener(v -> {
|
||||||
rateVideo(true, video);
|
rateVideo(true, video);
|
||||||
});
|
});
|
||||||
@ -113,7 +113,7 @@ public class VideoMetaDataFragment extends Fragment {
|
|||||||
// Thumbs Down
|
// Thumbs Down
|
||||||
Button thumbsDownButton = activity.findViewById(R.id.video_thumbs_down);
|
Button thumbsDownButton = activity.findViewById(R.id.video_thumbs_down);
|
||||||
thumbsDownButton.setText(R.string.video_thumbs_down_icon);
|
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 -> {
|
thumbsDownButton.setOnClickListener(v -> {
|
||||||
rateVideo(false, video);
|
rateVideo(false, video);
|
||||||
});
|
});
|
||||||
@ -145,7 +145,7 @@ public class VideoMetaDataFragment extends Fragment {
|
|||||||
// Share
|
// Share
|
||||||
Button videoShareButton = activity.findViewById(R.id.video_share);
|
Button videoShareButton = activity.findViewById(R.id.video_share);
|
||||||
videoShareButton.setText(R.string.video_share_icon);
|
videoShareButton.setText(R.string.video_share_icon);
|
||||||
new Iconics.IconicsBuilder().ctx(context).on(videoShareButton).build();
|
new Iconics.Builder().on(videoShareButton).build();
|
||||||
videoShareButton.setOnClickListener(v ->
|
videoShareButton.setOnClickListener(v ->
|
||||||
{
|
{
|
||||||
leaveAppExpected = true;
|
leaveAppExpected = true;
|
||||||
@ -155,7 +155,7 @@ public class VideoMetaDataFragment extends Fragment {
|
|||||||
// Download
|
// Download
|
||||||
Button videoDownloadButton = activity.findViewById(R.id.video_download);
|
Button videoDownloadButton = activity.findViewById(R.id.video_download);
|
||||||
videoDownloadButton.setText(R.string.video_download_icon);
|
videoDownloadButton.setText(R.string.video_download_icon);
|
||||||
new Iconics.IconicsBuilder().ctx(context).on(videoDownloadButton).build();
|
new Iconics.Builder().on(videoDownloadButton).build();
|
||||||
videoDownloadButton.setOnClickListener(v -> {
|
videoDownloadButton.setOnClickListener(v -> {
|
||||||
// get permission to store file
|
// get permission to store file
|
||||||
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||||
@ -235,7 +235,7 @@ public class VideoMetaDataFragment extends Fragment {
|
|||||||
// more button
|
// more button
|
||||||
TextView moreButton = activity.findViewById(R.id.moreButton);
|
TextView moreButton = activity.findViewById(R.id.moreButton);
|
||||||
moreButton.setText(R.string.video_more_icon);
|
moreButton.setText(R.string.video_more_icon);
|
||||||
new Iconics.IconicsBuilder().ctx(context).on(moreButton).build();
|
new Iconics.Builder().on(moreButton).build();
|
||||||
|
|
||||||
moreButton.setOnClickListener(v -> {
|
moreButton.setOnClickListener(v -> {
|
||||||
PopupMenu popup = new PopupMenu(context, v);
|
PopupMenu popup = new PopupMenu(context, v);
|
||||||
@ -260,7 +260,7 @@ public class VideoMetaDataFragment extends Fragment {
|
|||||||
// video player options
|
// video player options
|
||||||
TextView videoOptions = activity.findViewById(R.id.exo_more);
|
TextView videoOptions = activity.findViewById(R.id.exo_more);
|
||||||
videoOptions.setText(R.string.video_more_icon);
|
videoOptions.setText(R.string.video_more_icon);
|
||||||
new Iconics.IconicsBuilder().ctx(context).on(videoOptions).build();
|
new Iconics.Builder().on(videoOptions).build();
|
||||||
|
|
||||||
videoOptions.setOnClickListener(v -> {
|
videoOptions.setOnClickListener(v -> {
|
||||||
VideoOptionsFragment videoOptionsFragment =
|
VideoOptionsFragment videoOptionsFragment =
|
||||||
|
@ -77,7 +77,7 @@ public class VideoOptionsFragment extends BottomSheetDialogFragment {
|
|||||||
|
|
||||||
|
|
||||||
iconView.setText(R.string.video_option_speed_icon);
|
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 -> {
|
textView.setOnClickListener(view1 -> {
|
||||||
VideoMenuSpeedFragment videoMenuSpeedFragment =
|
VideoMenuSpeedFragment videoMenuSpeedFragment =
|
||||||
VideoMenuSpeedFragment.newInstance(videoPlayerService);
|
VideoMenuSpeedFragment.newInstance(videoPlayerService);
|
||||||
@ -92,7 +92,7 @@ public class VideoOptionsFragment extends BottomSheetDialogFragment {
|
|||||||
TextView textView2 = menuRow2.findViewById(R.id.video_quality_text);
|
TextView textView2 = menuRow2.findViewById(R.id.video_quality_text);
|
||||||
textView2.setText(String.format(getString(R.string.menu_video_options_quality), getCurrentVideoQuality(files)));
|
textView2.setText(String.format(getString(R.string.menu_video_options_quality), getCurrentVideoQuality(files)));
|
||||||
iconView2.setText(R.string.video_option_quality_icon);
|
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 -> {
|
textView2.setOnClickListener(view1 -> {
|
||||||
VideoMenuQualityFragment videoMenuQualityFragment =
|
VideoMenuQualityFragment videoMenuQualityFragment =
|
||||||
VideoMenuQualityFragment.newInstance(getContext(), files);
|
VideoMenuQualityFragment.newInstance(getContext(), files);
|
||||||
@ -107,7 +107,7 @@ public class VideoOptionsFragment extends BottomSheetDialogFragment {
|
|||||||
|
|
||||||
private String getCurrentVideoQuality(ArrayList<File> files) {
|
private String getCurrentVideoQuality(ArrayList<File> files) {
|
||||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
|
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) {
|
for (File file : files) {
|
||||||
if (videoQuality.equals(file.getResolution().getId())) {
|
if (videoQuality.equals(file.getResolution().getId())) {
|
||||||
|
@ -162,7 +162,7 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
|
|||||||
FrameLayout fullscreenButton = activity.findViewById(R.id.exo_fullscreen_button);
|
FrameLayout fullscreenButton = activity.findViewById(R.id.exo_fullscreen_button);
|
||||||
|
|
||||||
fullscreenText.setText(R.string.video_expand_icon);
|
fullscreenText.setText(R.string.video_expand_icon);
|
||||||
new Iconics.IconicsBuilder().ctx(context).on(fullscreenText).build();
|
new Iconics.Builder().on(fullscreenText).build();
|
||||||
|
|
||||||
fullscreenButton.setOnClickListener(view -> {
|
fullscreenButton.setOnClickListener(view -> {
|
||||||
Log.d(TAG, "Fullscreen");
|
Log.d(TAG, "Fullscreen");
|
||||||
@ -239,12 +239,12 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
|
|||||||
torrentStream.startStream(stream);
|
torrentStream.startStream(stream);
|
||||||
} else {
|
} 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) {
|
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() ) {
|
for ( File file : video.getFiles() ) {
|
||||||
// Set quality if it matches
|
// Set quality if it matches
|
||||||
if ( file.getResolution().getId().equals( videoQuality ) ) {
|
if ( file.getResolution().getId().equals( videoQuality ) ) {
|
||||||
@ -321,7 +321,7 @@ public class VideoPlayerFragment extends Fragment implements VideoRendererEventL
|
|||||||
} else {
|
} else {
|
||||||
fullscreenButton.setText(R.string.video_expand_icon);
|
fullscreenButton.setText(R.string.video_expand_icon);
|
||||||
}
|
}
|
||||||
new Iconics.IconicsBuilder().ctx(getContext()).on(fullscreenButton).build();
|
new Iconics.Builder().on(fullscreenButton).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Boolean getIsFullscreen() {
|
public Boolean getIsFullscreen() {
|
||||||
|
@ -44,6 +44,7 @@ import android.widget.Toast;
|
|||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlayer;
|
import com.google.android.exoplayer2.ExoPlayer;
|
||||||
import com.google.android.exoplayer2.ExoPlayerFactory;
|
import com.google.android.exoplayer2.ExoPlayerFactory;
|
||||||
|
import com.google.android.exoplayer2.MediaItem;
|
||||||
import com.google.android.exoplayer2.PlaybackParameters;
|
import com.google.android.exoplayer2.PlaybackParameters;
|
||||||
import com.google.android.exoplayer2.Player;
|
import com.google.android.exoplayer2.Player;
|
||||||
import com.google.android.exoplayer2.SimpleExoPlayer;
|
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.OkHttpDataSource;
|
||||||
import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSourceFactory;
|
import com.google.android.exoplayer2.ext.okhttp.OkHttpDataSourceFactory;
|
||||||
import com.google.android.exoplayer2.source.ExtractorMediaSource;
|
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.trackselection.DefaultTrackSelector;
|
||||||
import com.google.android.exoplayer2.ui.PlayerNotificationManager;
|
import com.google.android.exoplayer2.ui.PlayerNotificationManager;
|
||||||
import com.google.android.exoplayer2.upstream.DataSource;
|
import com.google.android.exoplayer2.upstream.DataSource;
|
||||||
@ -102,7 +105,9 @@ public class VideoPlayerService extends Service {
|
|||||||
|
|
||||||
super.onCreate();
|
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
|
// Stop player if audio device changes, e.g. headphones unplugged
|
||||||
player.addListener(new Player.EventListener() {
|
player.addListener(new Player.EventListener() {
|
||||||
@ -224,14 +229,18 @@ public class VideoPlayerService extends Service {
|
|||||||
okhttpClientBuilder = getUnsafeOkHttpClientBuilder();
|
okhttpClientBuilder = getUnsafeOkHttpClientBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a data source factory.
|
||||||
DataSource.Factory dataSourceFactory = new OkHttpDataSourceFactory(okhttpClientBuilder.build(), Util.getUserAgent(getApplicationContext(), "PeerTube"));
|
DataSource.Factory dataSourceFactory = new OkHttpDataSourceFactory(okhttpClientBuilder.build(), Util.getUserAgent(getApplicationContext(), "PeerTube"));
|
||||||
|
|
||||||
// This is the MediaSource representing the media to be played.
|
// Create a progressive media source pointing to a stream uri.
|
||||||
ExtractorMediaSource videoSource = new ExtractorMediaSource.Factory(dataSourceFactory)
|
MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
|
||||||
.createMediaSource(Uri.parse(currentStreamUrl));
|
.createMediaSource(MediaItem.fromUri(Uri.parse(currentStreamUrl)));
|
||||||
|
|
||||||
// Prepare the player with the source.
|
// Set the media source to be played.
|
||||||
player.prepare(videoSource);
|
player.setMediaSource(mediaSource);
|
||||||
|
|
||||||
|
// Prepare the player.
|
||||||
|
player.prepare();
|
||||||
|
|
||||||
// Auto play
|
// Auto play
|
||||||
player.setPlayWhenReady(true);
|
player.setPlayWhenReady(true);
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
android:background="@color/videoBackgroundColor"
|
android:background="@color/videoBackgroundColor"
|
||||||
app:controller_layout_id="@layout/video_playback_controls"
|
app:controller_layout_id="@layout/video_playback_controls"
|
||||||
app:resize_mode="fixed_width"
|
app:resize_mode="fixed_width"
|
||||||
|
app:show_buffering="always"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,4 +40,9 @@
|
|||||||
<string name="video_speed_20">2×</string>
|
<string name="video_speed_20">2×</string>
|
||||||
<string name="video_speed_15">1,5×</string>
|
<string name="video_speed_15">1,5×</string>
|
||||||
<string name="video_speed_05">0,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>
|
</resources>
|
@ -174,4 +174,21 @@
|
|||||||
<string name="pref_background_audio">Continuar como audio en segundo plano</string>
|
<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_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="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>
|
</resources>
|
@ -347,4 +347,12 @@
|
|||||||
<string name="title_activity_settings">Configurações</string>
|
<string name="title_activity_settings">Configurações</string>
|
||||||
<string name="network_error">Erro de acesso à rede, verifique sua conectividade</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="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>
|
</resources>
|
@ -360,4 +360,5 @@
|
|||||||
<string name="pref_insecure_confirm_title">Внимание!</string>
|
<string name="pref_insecure_confirm_title">Внимание!</string>
|
||||||
<string name="pref_description_accept_insecure">Игнорировать незащищенные соединения. Используйте только если знаете сервер к которому подключаетесь. Требуется перезапуск приложения.</string>
|
<string name="pref_description_accept_insecure">Игнорировать незащищенные соединения. Используйте только если знаете сервер к которому подключаетесь. Требуется перезапуск приложения.</string>
|
||||||
<string name="pref_insecure_confirm_message">"Вы собираетесь отключить валидацию всех SSL сертификатов в Thorium. Это может быть очень опасно если peertube сервер вами не контролируется, потому что \"атака посредника\" может направить трафик на другой сервер. Злоумышленник может записывать пароли и другие личные данные."</string>
|
<string name="pref_insecure_confirm_message">"Вы собираетесь отключить валидацию всех SSL сертификатов в Thorium. Это может быть очень опасно если peertube сервер вами не контролируется, потому что \"атака посредника\" может направить трафик на другой сервер. Злоумышленник может записывать пароли и другие личные данные."</string>
|
||||||
|
<string name="server_book_add_save_button">Сохранить</string>
|
||||||
</resources>
|
</resources>
|
@ -369,4 +369,5 @@
|
|||||||
<string name="settings_activity_advanced_category_title">Gelişmiş</string>
|
<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_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="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>
|
</resources>
|
@ -323,7 +323,7 @@
|
|||||||
<string name="title_activity_url_video_play">UrlVideoPlayActivity</string>
|
<string name="title_activity_url_video_play">UrlVideoPlayActivity</string>
|
||||||
<string name="video_row_account_avatar">Аватар облікового запису</string>
|
<string name="video_row_account_avatar">Аватар облікового запису</string>
|
||||||
<string name="video_row_video_thumbnail">Ескіз відео</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_subscriptions">Підписки</string>
|
||||||
<string name="bottom_nav_title_local">Локальне</string>
|
<string name="bottom_nav_title_local">Локальне</string>
|
||||||
<string name="bottom_nav_title_recent">Нещодавнє</string>
|
<string name="bottom_nav_title_recent">Нещодавнє</string>
|
||||||
@ -354,4 +354,5 @@
|
|||||||
<string name="pref_insecure_confirm_title">Увага!</string>
|
<string name="pref_insecure_confirm_title">Увага!</string>
|
||||||
<string name="pref_insecure_confirm_message">Ви збираєтеся вимкнути всі перевірки сертифікатів SSL у Thorium. Це може бути дуже небезпечно якщо ви не контролюєте сервер peertube, оскільки атака «людина посередині» може направити трафік на інший сервер без вашого відома. Зловмисник може записувати паролі та інші особисті дані.</string>
|
<string name="pref_insecure_confirm_message">Ви збираєтеся вимкнути всі перевірки сертифікатів SSL у Thorium. Це може бути дуже небезпечно якщо ви не контролюєте сервер peertube, оскільки атака «людина посередині» може направити трафік на інший сервер без вашого відома. Зловмисник може записувати паролі та інші особисті дані.</string>
|
||||||
<string name="settings_activity_advanced_category_title">Додатково</string>
|
<string name="settings_activity_advanced_category_title">Додатково</string>
|
||||||
|
<string name="server_book_add_save_button">Зберегти</string>
|
||||||
</resources>
|
</resources>
|
@ -354,4 +354,5 @@
|
|||||||
<string name="settings_activity_advanced_category_title">進階</string>
|
<string name="settings_activity_advanced_category_title">進階</string>
|
||||||
<string name="pref_title_accept_insecure">停用 SSL 憑證檢查</string>
|
<string name="pref_title_accept_insecure">停用 SSL 憑證檢查</string>
|
||||||
<string name="pref_description_accept_insecure">忽略不安全的連線。僅在您了解您要連線的伺服器時才使用此選項。需要重新啟動應用程式。</string>
|
<string name="pref_description_accept_insecure">忽略不安全的連線。僅在您了解您要連線的伺服器時才使用此選項。需要重新啟動應用程式。</string>
|
||||||
|
<string name="server_book_add_save_button">儲存</string>
|
||||||
</resources>
|
</resources>
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
<string name="pref_accept_insecure" translatable="false">pref_accept_insecure</string>
|
<string name="pref_accept_insecure" translatable="false">pref_accept_insecure</string>
|
||||||
|
|
||||||
|
<string name ="pref_clear_history_key" translatable="false">pref_clear_history</string>
|
||||||
<!-- defaults -->
|
<!-- defaults -->
|
||||||
<string name="pref_default_api_base_url" formatted="false" translatable="false">https://troll.tv</string>
|
<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>
|
<string name="app_default_theme" translatable="false">AppTheme.BLUE</string>
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
app:iconSpaceReserved="false"/>
|
app:iconSpaceReserved="false"/>
|
||||||
|
|
||||||
<MultiSelectListPreference
|
<MultiSelectListPreference
|
||||||
|
app:defaultValue="@array/empty_array"
|
||||||
app:entries="@array/languageArray"
|
app:entries="@array/languageArray"
|
||||||
app:entryValues="@array/languageValues"
|
app:entryValues="@array/languageValues"
|
||||||
app:key="@string/pref_video_language_key"
|
app:key="@string/pref_video_language_key"
|
||||||
@ -84,6 +85,13 @@
|
|||||||
app:title="@string/pref_title_accept_insecure"
|
app:title="@string/pref_title_accept_insecure"
|
||||||
app:iconSpaceReserved="false"/>
|
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>
|
||||||
|
|
||||||
<PreferenceCategory app:title="@string/settings_activity_about_category_title" app:iconSpaceReserved="false">
|
<PreferenceCategory app:title="@string/settings_activity_about_category_title" app:iconSpaceReserved="false">
|
||||||
|
@ -9,7 +9,7 @@ buildscript {
|
|||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
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"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
|
||||||
|
|
||||||
|
7
fastlane/metadata/android/en-US/changelogs/1053.txt
Normal file
7
fastlane/metadata/android/en-US/changelogs/1053.txt
Normal 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
|
5
fastlane/metadata/android/tr-TR/changelogs/1051.txt
Normal file
5
fastlane/metadata/android/tr-TR/changelogs/1051.txt
Normal 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
|
2
fastlane/metadata/android/tr-TR/changelogs/1052.txt
Normal file
2
fastlane/metadata/android/tr-TR/changelogs/1052.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
- Sunucu defterinde sunucu düzenleme uygulandı (@kosharskiy)
|
||||||
|
- Çeviriler güncellendi
|
@ -1,7 +1,7 @@
|
|||||||
- додано підтримку перенаправлення гіпертексту в опис (@freeboub)
|
- додано підтримку перенаправлення гіпертексту в опис (@freeboub)
|
||||||
- різні виправлення збоїв (@freeboub)
|
- різні виправлення збоїв (@freeboub)
|
||||||
- уникайте звз під час виходу з програми через кнопку спільного доступу (@freeboub)
|
- уникайте звз під час виходу з програми через кнопку спільного доступу (@freeboub)
|
||||||
- Додайно можливість фільтрувати список серверів (@freeboub)
|
- Додано можливість фільтрувати список серверів (@freeboub)
|
||||||
- Управління помилками Refactor Toast для розділення помилки мережі (@freeboub)
|
- Управління помилками Refactor Toast для розділення помилки мережі (@freeboub)
|
||||||
- збереження співвідношення сторін відео для зображення в зображенні (@freeboub)
|
- збереження співвідношення сторін відео для зображення в зображенні (@freeboub)
|
||||||
- панель навігації не відновлювалась після виходу з альбомного режиму (@freeboub)
|
- панель навігації не відновлювалась після виходу з альбомного режиму (@freeboub)
|
||||||
|
5
fastlane/metadata/android/uk/changelogs/1051.txt
Normal file
5
fastlane/metadata/android/uk/changelogs/1051.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
- виправлено типову мову першого запуску застосунку (@kosharskiy)
|
||||||
|
- Налаштування перекладів екрана uk і ru мов (@kosharskiy)
|
||||||
|
- очищення файлу app/build.gradle (@kosharskiy)
|
||||||
|
- виправлено проблему показу метаданих відео (@kosharskiy)
|
||||||
|
- оновлено переклади
|
2
fastlane/metadata/android/uk/changelogs/1052.txt
Normal file
2
fastlane/metadata/android/uk/changelogs/1052.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
- Реалізовано редагування сервера в книзі серверів (@kosharskiy)
|
||||||
|
- Оновлено переклади
|
@ -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/ .
|
PeerTube - це об'єднана (ActivityPub) платформа для потокового відео, що використовує P2P (BitTorrent) безпосередньо у браузері. Додаткові відомості та перелік серверів ви знайдете за адресою https://joinpeertube.org/ .
|
||||||
|
|
||||||
@ -6,7 +6,7 @@ PeerTube - це об'єднана (ActivityPub) платформа для пот
|
|||||||
|
|
||||||
Поточні функції:
|
Поточні функції:
|
||||||
- Під'єднання до будь-якого сервера PeerTube
|
- Під'єднання до будь-якого сервера PeerTube
|
||||||
- Торрент-відео або пряме відтворення
|
- Торент-відео або пряме відтворення
|
||||||
- Пошук у PeerTube
|
- Пошук у PeerTube
|
||||||
- Завантажити / Поділитися відео
|
- Завантажити / Поділитися відео
|
||||||
- Теми / Темний режим
|
- Теми / Темний режим
|
||||||
@ -14,8 +14,8 @@ PeerTube - це об'єднана (ActivityPub) платформа для пот
|
|||||||
- Повноекранне відтворення в альбомному режимі
|
- Повноекранне відтворення в альбомному режимі
|
||||||
- Швидкість відтворення
|
- Швидкість відтворення
|
||||||
- Фільтрувати вміст NSFW
|
- Фільтрувати вміст NSFW
|
||||||
- Аутентифікація / Вхід
|
- Автентифікація / Вхід
|
||||||
- Вподобати / не подобається відео
|
- Вподобати/не подобається відео
|
||||||
|
|
||||||
Скоро буде:
|
Скоро буде:
|
||||||
- Коментувати відео
|
- Коментувати відео
|
||||||
@ -24,7 +24,7 @@ PeerTube - це об'єднана (ActivityPub) платформа для пот
|
|||||||
- Звіт про відео
|
- Звіт про відео
|
||||||
|
|
||||||
Дозволи:
|
Дозволи:
|
||||||
- Доступ до сховища, необхідний для завантаження торрента або завантаження відео.
|
- Доступ до сховища, необхідний для завантаження торента або завантаження відео.
|
||||||
|
|
||||||
Ліцензовано під загальною публічною ліцензією GNU Affero v3.0
|
Ліцензовано під загальною публічною ліцензією GNU Affero v3.0
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
Thorium - неофіційний програвач PeerTube
|
Thorium — неофіційний програвач PeerTube
|
||||||
|
@ -1 +1 @@
|
|||||||
Thorium неоф. клієнт PeerTube
|
Thorium — неофіційний клієнт PeerTube
|
||||||
|
5
fastlane/metadata/android/zh-TW/changelogs/1051.txt
Normal file
5
fastlane/metadata/android/zh-TW/changelogs/1051.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
- 修復第一次啟動時的預設應用程式語言 (@kosharskiy)
|
||||||
|
- 英式英語與俄語的設定畫面翻譯 (@kosharskiy)
|
||||||
|
- 清理 app/build.gradle 檔案 (@kosharskiy)
|
||||||
|
- 已修復影片詮釋資料顯示問題 (@kosharskiy)
|
||||||
|
- 更新翻譯
|
2
fastlane/metadata/android/zh-TW/changelogs/1052.txt
Normal file
2
fastlane/metadata/android/zh-TW/changelogs/1052.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
- 在伺服器手冊中實作編輯伺服器 (@kosharskiy)
|
||||||
|
- 更新翻譯
|
Loading…
Reference in New Issue
Block a user