Merge pull request #135 from sschueller/develop

Version v1.0.28
This commit is contained in:
Stefan Schüller 2019-03-03 15:48:40 +01:00 committed by GitHub
commit 07c1cd03d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 1022 additions and 198 deletions

View File

@ -1,3 +1,11 @@
### Version 1.0.28 Tag: v1.0.28 (2019-03-03)
* Server selection
* Lots of translations
### Version 1.0.27 Tag: v1.0.27 (2019-02-17)
* App Rename
* Lots of translations
### Version 1.0.26 Tag: v1.0.26 (2019-01-27)
* Larger fullscreen button target
* Fixed duration colors

View File

@ -1,47 +1,67 @@
<h1 align="center">
Thorium, a Android PeerTube Client
Thorium, an Android PeerTube Client
</h1>
[![Latest release](https://img.shields.io/github/release/sschueller/peertube-android.svg)](https://github.com/sschueller/peertube-android/releases/latest)
[![F-Droid](https://img.shields.io/f-droid/v/net.schueller.peertube.svg)](https://f-droid.org/de/packages/net.schueller.peertube/)
<h4 align="center">
</h4>
<p align="center">
<img width="250" src="https://raw.githubusercontent.com/sschueller/peertube-android/develop/Screenshot_1546780555.png" alt="screenshot" />
<img width="250" src="https://raw.githubusercontent.com/sschueller/peertube-android/develop/Screenshot_1546780637.png" alt="screenshot" />
<a href="https://github.com/sschueller/peertube-android/releases/latest" alt="GitHub release"><img src="https://img.shields.io/github/release/sschueller/peertube-android.svg" ></a>
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/License-GPL%20v3-blue.svg"></a>
<a href="https://f-droid.org/de/packages/net.schueller.peertube/" alt="F-Droid release"><img src="https://img.shields.io/f-droid/v/net.schueller.peertube.svg"></a>
<a href="https://hosted.weblate.org/projects/peertube/" alt="Translation Status"><img src="https://hosted.weblate.org/widgets/NewPipe/-/svg-badge.svg"></a>
<a href="https://www.bountysource.com/people/65848-sschueller" alt="Bountysource bounties"><img src="https://img.shields.io/bountysource/team/newpipe/activity.svg?colorB=cd201f"></a>
<a href="https://liberapay.com/sschueller/donate" alt="Donate Link"><img src="http://img.shields.io/liberapay/patrons/sschueller.svg?logo=liberapay"></a>
</p>
## Screenshots
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png)
[<img src="fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png" width=160>](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png)
## Description
PeerTube is a federated video streaming platform that is community-owned and ad-free, with no vendor lock-in. This client allows you to watch and browse videos on a server of your choice in the PeerTube network.
This client comes preconfigured with one PeerTube server managed by the application creator - not the PeerTube project itself, which lists more on http://instances.joinpeertube.org/ - to allow you to have a taste of what the client is capable of. Choose your server to tune your experience!
Please note this is app is in beta and is still missing a lot of features.
## Download
* Beta Test on Google Play: https://play.google.com/store/apps/details?id=net.schueller.peertube
* F-Droid: https://f-droid.org/packages/net.schueller.peertube/
## Help Translate
* https://hosted.weblate.org/projects/peertube/
## Features
- [X] Recent Videos
- [X] Trending Videos
- [X] Endless scrolling
- [X] Pull to refresh
- [X] Very Basic Torrent playback
- [X] Change Server
- [X] Search
- [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
* Recent Videos
* Trending Videos
* Endless scrolling
* Pull to refresh
* Very Basic Torrent playback
* Change Server
* Search
* Themes / Dark mode
* Background playback
* NSFW Filter option
* Authentication / Login
* Like/dislike video
* Video speed selection
* Video quality selection
* Server selection
## TODO
## Coming soon
- [ ] Video Playback via WebRTC
- [ ] Video overlay play and draggable video window
- [ ] Comment videos
- [ ] Report Videos
- [ ] User / Channel Overview Page
- [ ] Unit Tests
- [ ] Lots more missing at this point...
* Video Playback via WebRTC
* Video overlay play and draggable video window
* Comment videos
* Report Videos
* User / Channel Overview Page
* Unit Tests
* Lots more...
## Contribution
Whether you have ideas, translations, design changes, code cleaning, or real heavy code changes, help is always welcome.
## Donate
<script src="https://liberapay.com/sschueller/widgets/button.js"></script>
<noscript><a href="https://liberapay.com/sschueller/donate"><img alt="Donate using Liberapay" src="https://liberapay.com/assets/widgets/donate.svg"></a></noscript>

View File

@ -6,8 +6,8 @@ android {
applicationId "net.schueller.peertube"
minSdkVersion 21
targetSdkVersion 28
versionCode 1027
versionName "1.0.27"
versionCode 1028
versionName "1.0.28"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ext {
libVersions = [
@ -78,4 +78,6 @@ android {
dependencies {
implementation 'com.android.support.constraint:constraint-layout:+'
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
}

View File

@ -2,73 +2,65 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="net.schueller.peertube">
<!-- connect to peertube server -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- required for torrent downloading -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- required to play video in background via notification -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- required for torrent downloading -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- required to play video in background via notification -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application
android:name=".application.AppApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning"
android:name=".application.AppApplication">
<activity android:name=".activity.VideoListActivity"
android:theme="@style/AppTheme.NoActionBar"
android:launchMode="singleTop">
tools:ignore="GoogleAppIndexingWarning">
<activity
android:name=".activity.VideoListActivity"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SEARCH" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable">
</meta-data>
android:resource="@xml/searchable"></meta-data>
</activity>
<activity
android:name=".activity.LoginActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_login" />
android:label="@string/title_activity_login"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".activity.VideoPlayActivity"
android:theme="@style/AppTheme.NoActionBar"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
android:label="@string/title_activity_video_play"
android:launchMode="singleTop" />
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".activity.SettingsActivity"
android:theme="@style/AppTheme.NoActionBar"
android:label="@string/title_activity_settings" />
<activity android:name=".activity.SelectServerActivity"
android:theme="@style/AppTheme.NoActionBar"/>
<activity android:name=".activity.MeActivity"
android:label="@string/title_activity_settings"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".activity.SelectServerActivity"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".activity.MeActivity"
android:label="@string/title_activity_account"
android:theme="@style/AppTheme.NoActionBar"/>
<activity android:name=".activity.AccountActivity"
android:theme="@style/AppTheme.NoActionBar"/>
<!-- Content provider for search suggestions -->
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".activity.AccountActivity"
android:theme="@style/AppTheme.NoActionBar" /> <!-- Content provider for search suggestions -->
<provider
android:name=".provider.SearchSuggestionsProvider"
android:authorities="net.schueller.peertube.provider.SearchSuggestionsProvider"
android:enabled="true"
android:exported="false" />
<service android:name=".service.VideoPlayerService" />
</application>
</manifest>

View File

@ -1,61 +1,177 @@
/*
* 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.activity;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import net.schueller.peertube.R;
import net.schueller.peertube.model.ServerList;
import net.schueller.peertube.network.GetServerListDataService;
import net.schueller.peertube.network.RetrofitInstance;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import net.schueller.peertube.R;
import net.schueller.peertube.adapter.ServerAdapter;
import net.schueller.peertube.adapter.VideoAdapter;
import net.schueller.peertube.helper.APIUrlHelper;
import net.schueller.peertube.model.ServerList;
import net.schueller.peertube.model.VideoList;
import net.schueller.peertube.network.GetServerListDataService;
import net.schueller.peertube.network.GetVideoDataService;
import net.schueller.peertube.network.RetrofitInstance;
import java.util.ArrayList;
import static net.schueller.peertube.helper.Constants.DEFAULT_THEME;
import static net.schueller.peertube.helper.Constants.THEME_PREF_KEY;
public class SelectServerActivity extends AppCompatActivity {
private ServerAdapter serverAdapter;
private SwipeRefreshLayout swipeRefreshLayout;
private int currentStart = 0;
private int count = 12;
private TextView emptyView;
private RecyclerView recyclerView;
private boolean isLoading = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_server);
setContentView(R.layout.activity_server_selection);
// get list of peertube servers
loadList();
// TODO: Get here via settings, get data from API, add to adapter and show in recycle view, upon selection fill settings field
// set url
TextView selectedUrl = findViewById(R.id.serverSelectedUrl);
selectedUrl.setText(APIUrlHelper.getUrl(SelectServerActivity.this));
GetServerListDataService service = RetrofitInstance.getRetrofitInstance("https://instances.joinpeertube.org/api/v1/").create(GetServerListDataService.class);
Call<ServerList> call = service.getInstancesData(0, 500);
call.enqueue(new Callback<ServerList>() {
Button setServerButton = findViewById(R.id.server_selection_set);
setServerButton.setOnClickListener(v -> {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = sharedPref.edit();
String serverUrl = APIUrlHelper.cleanServerUrl(selectedUrl.getText().toString());
editor.putString("pref_api_base", serverUrl);
editor.apply();
this.finish();
});
}
private void loadList() {
recyclerView = findViewById(R.id.serverRecyclerView);
swipeRefreshLayout = findViewById(R.id.serversSwipeRefreshLayout);
emptyView = findViewById(R.id.empty_server_selection_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(SelectServerActivity.this);
recyclerView.setLayoutManager(layoutManager);
serverAdapter = new ServerAdapter(new ArrayList<>(), this);
recyclerView.setAdapter(serverAdapter);
loadServers(currentStart, count);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onResponse(@NonNull Call<ServerList> call, @NonNull Response<ServerList> response) {
// response.body().getVideoArrayList();
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onFailure(@NonNull Call<ServerList> call, @NonNull Throwable t) {
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (dy > 0) {
// is at end of list?
if (!recyclerView.canScrollVertically(RecyclerView.FOCUS_DOWN)) {
if (!isLoading) {
currentStart = currentStart + count;
loadServers(currentStart, count);
}
}
}
}
});
swipeRefreshLayout.setOnRefreshListener(() -> {
// Refresh items
if (!isLoading) {
currentStart = 0;
loadServers(currentStart, count);
}
});
}
private void loadServers(int start, int count) {
isLoading = true;
GetServerListDataService service = RetrofitInstance.getRetrofitInstance(
APIUrlHelper.getServerIndexUrl(SelectServerActivity.this)
).create(GetServerListDataService.class);
Call<ServerList> call;
call = service.getInstancesData(start, count);
Log.d("URL Called", call.request().url() + "");
call.enqueue(new Callback<ServerList>() {
@Override
public void onResponse(@NonNull Call<ServerList> call, @NonNull Response<ServerList> response) {
if (currentStart == 0) {
serverAdapter.clearData();
}
if (response.body() != null) {
serverAdapter.setData(response.body().getServerArrayList());
}
// no results show no results message
if (currentStart == 0 && serverAdapter.getItemCount() == 0) {
emptyView.setVisibility(View.VISIBLE);
recyclerView.setVisibility(View.GONE);
} else {
emptyView.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
}
isLoading = false;
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onFailure(@NonNull Call<ServerList> call, @NonNull Throwable t) {
Log.wtf("err", t.fillInStackTrace());
Toast.makeText(SelectServerActivity.this, getString(R.string.api_error), Toast.LENGTH_SHORT).show();
isLoading = false;
swipeRefreshLayout.setRefreshing(false);
}
});
}
}

View File

@ -26,14 +26,18 @@ import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.preference.Preference;
import androidx.appcompat.app.ActionBar;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
import android.util.Patterns;
import android.view.MenuItem;
import android.widget.Toast;
import net.schueller.peertube.R;
import java.util.List;
import static net.schueller.peertube.helper.Constants.DEFAULT_THEME;
@ -53,14 +57,14 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
return super.onOptionsItemSelected(item);
}
private static String getSelectedColor(Context context, String colorId){
private static String getSelectedColor(Context context, String colorId) {
String res = "Color not found";
String [ ] themeArray = context.getResources().getStringArray(R.array.themeValues);
String [ ] colorArray = context.getResources().getStringArray(R.array.themeArray);
String[] themeArray = context.getResources().getStringArray(R.array.themeValues);
String[] colorArray = context.getResources().getStringArray(R.array.themeArray);
for (int i = 0 ; i < themeArray.length ; i++){
if (themeArray[i].equals(colorId)){
for (int i = 0; i < themeArray.length; i++) {
if (themeArray[i].equals(colorId)) {
res = colorArray[i];
break;
}
@ -76,12 +80,12 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
String stringValue = value.toString();
// check URL is valid
if (preference.getKey().equals("pref_api_base") && !Patterns.WEB_URL.matcher(stringValue).matches()) {
Toast.makeText(preference.getContext(), R.string.invalid_url, Toast.LENGTH_LONG).show();
return false;
}
// if (preference.getKey().equals("pref_api_base") && !Patterns.WEB_URL.matcher(stringValue).matches()) {
// Toast.makeText(preference.getContext(), R.string.invalid_url, Toast.LENGTH_LONG).show();
// return false;
// }
// Check if Theme color has change & Provide selected color
else if (preference.getKey().equals("pref_theme")) {
if (preference.getKey().equals("pref_theme")) {
stringValue = getSelectedColor(preference.getContext(), stringValue);
@ -212,6 +216,27 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
Preference preference) {
String key = preference.getKey();
if (key.equals("pref_api_base")) {
Intent intentServer = new Intent(preference.getContext(), SelectServerActivity.class);
startActivity(intentServer);
return true;
}
return false;
}
@Override
public void onResume() {
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.pref_general);
bindPreferenceSummaryToValue(findPreference("pref_api_base"));
super.onResume();
}
}
}

View File

@ -128,6 +128,9 @@ public class VideoListActivity extends CommonActivity {
menu.findItem(R.id.action_account).setIcon(
new IconicsDrawable(this, FontAwesome.Icon.faw_user_circle).actionBar());
// menu.findItem(R.id.action_server_selection).setIcon(
// new IconicsDrawable(this, FontAwesome.Icon.faw_server).actionBar());
MenuItem searchMenuItem = menu.findItem(R.id.action_search);
searchMenuItem.setIcon(
@ -200,6 +203,10 @@ public class VideoListActivity extends CommonActivity {
this.startActivity(intentMe);
}
return false;
// case R.id.action_server_selection:
// Intent intentServer = new Intent(this, SelectServerActivity.class);
// this.startActivity(intentServer);
// return false;
default:
break;
}

View File

@ -0,0 +1,146 @@
/*
* 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.adapter;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import net.schueller.peertube.R;
import net.schueller.peertube.activity.SelectServerActivity;
import net.schueller.peertube.helper.APIUrlHelper;
import net.schueller.peertube.model.Server;
import java.util.ArrayList;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class ServerAdapter extends RecyclerView.Adapter<ServerAdapter.AccountViewHolder> {
private ArrayList<Server> serverList;
private SelectServerActivity activity;
private String baseUrl;
public ServerAdapter(ArrayList<Server> serverList, SelectServerActivity activity) {
this.serverList = serverList;
this.activity = activity;
}
@NonNull
@Override
public AccountViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.row_server, parent, false);
baseUrl = APIUrlHelper.getUrl(activity);
return new AccountViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull AccountViewHolder holder, int position) {
holder.name.setText(serverList.get(position).getName());
holder.host.setText(serverList.get(position).getHost());
holder.signupAllowed.setText(activity.getString(R.string.server_selection_signup_allowed, activity.getString(
serverList.get(position).getSignupAllowed() ?
R.string.server_selection_signup_allowed_yes :
R.string.server_selection_signup_allowed_no
)));
holder.shortDescription.setText(serverList.get(position).getShortDescription());
holder.itemView.setOnClickListener(v -> {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor editor = sharedPref.edit();
String serverUrl = APIUrlHelper.cleanServerUrl(serverList.get(position).getHost());
editor.putString("pref_api_base", serverUrl);
editor.apply();
activity.finish();
Toast.makeText(activity, activity.getString(R.string.server_selection_set_server, serverUrl), Toast.LENGTH_LONG).show();
});
//
//
// holder.moreButton.setText(R.string.video_more_icon);
// new Iconics.IconicsBuilder().ctx(context).on(holder.moreButton).build();
//
// holder.moreButton.setOnClickListener(v -> {
//
// PopupMenu popup = new PopupMenu(context, v);
// popup.setOnMenuItemClickListener(menuItem -> {
// switch (menuItem.getItemId()) {
// case R.id.menu_share:
// Intents.Share(context, serverList.get(position));
// return true;
// default:
// return false;
// }
// });
// popup.inflate(R.menu.menu_video_row_mode);
// popup.show();
//
// });
}
public void setData(ArrayList<Server> data) {
serverList.addAll(data);
this.notifyDataSetChanged();
}
public void clearData() {
serverList.clear();
this.notifyDataSetChanged();
}
@Override
public int getItemCount() {
return serverList.size();
}
class AccountViewHolder extends RecyclerView.ViewHolder {
TextView name, host, signupAllowed, shortDescription;
AccountViewHolder(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.name);
host = itemView.findViewById(R.id.host);
signupAllowed = itemView.findViewById(R.id.signupAllowed);
shortDescription = itemView.findViewById(R.id.shortDescription);
}
}
}

View File

@ -44,4 +44,23 @@ public class APIUrlHelper{
public static String getShareUrl(Context context, String videoUuid) {
return APIUrlHelper.getUrl(context) + "/videos/watch/" + videoUuid;
}
public static String getServerIndexUrl(Context context) {
return "https://instances.joinpeertube.org/api/v1/";
}
public static String cleanServerUrl(String url) {
String cleanUrl = url.toLowerCase();
if (!cleanUrl.startsWith("http")) {
cleanUrl = "https://" + cleanUrl;
}
if (cleanUrl.endsWith("/")) {
cleanUrl = cleanUrl.substring(0, cleanUrl.length() - 1);
}
return cleanUrl;
}
}

View File

@ -25,12 +25,16 @@ public class Server {
private String shortDescription;
private String version;
private Boolean signupAllowed;
private Integer userVideoQuota;
private Double userVideoQuota;
private Integer totalUsers;
private Integer totalVideos;
private Integer totalLocalVideos;
private Integer totalInstanceFollowers;
private Integer totalInstanceFollowing;
private Boolean supportsIPv6;
private String country;
private Integer health;
public Integer getId() {
@ -81,11 +85,11 @@ public class Server {
this.signupAllowed = signupAllowed;
}
public Integer getUserVideoQuota() {
public Double getUserVideoQuota() {
return userVideoQuota;
}
public void setUserVideoQuota(Integer userVideoQuota) {
public void setUserVideoQuota(Double userVideoQuota) {
this.userVideoQuota = userVideoQuota;
}
@ -129,6 +133,22 @@ public class Server {
this.totalInstanceFollowing = totalInstanceFollowing;
}
public Boolean getSupportsIPv6() {
return supportsIPv6;
}
public void setSupportsIPv6(Boolean supportsIPv6) {
this.supportsIPv6 = supportsIPv6;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public Integer getHealth() {
return health;
}

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.SelectServerActivity">
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.SelectServerActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<LinearLayout
android:padding="@dimen/fab_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@string/server_selection_select_a_server" />
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<AutoCompleteTextView
android:hint="@string/server_selection_peertube_server_url"
android:id="@+id/serverSelectedUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textUri"
android:maxLines="1"
android:singleLine="true" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/server_selection_set"
style="?android:textAppearanceSmall"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/action_set_url"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/empty_server_selection_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="@string/no_data_available"
android:visibility="gone" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/serversSwipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/serverRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</androidx.recyclerview.widget.RecyclerView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?><!-- START*** Root Container *** -->
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
card_view:cardCornerRadius="0dp"
card_view:cardElevation="0dp"
card_view:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="12dp">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginEnd="24dp"
android:paddingTop="0dp"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Headline" />
<TextView
android:id="@+id/host"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginEnd="24dp"
android:paddingTop="0dp"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" />
<TextView
android:id="@+id/signupAllowed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginEnd="24dp"
android:paddingTop="0dp"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" />
<TextView
android:id="@+id/shortDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginEnd="24dp"
android:paddingTop="0dp"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Subhead" />
</LinearLayout>
</androidx.cardview.widget.CardView>

View File

@ -26,4 +26,11 @@
android:textAppearance="@style/Base.TextAppearance.AppCompat.Caption"
app:showAsAction="ifRoom" />
<!--<item-->
<!--android:id="@+id/action_server_selection"-->
<!--android:orderInCategory="300"-->
<!--android:title="@string/action_bar_title_server_selection"-->
<!--android:textAppearance="@style/Base.TextAppearance.AppCompat.Caption"-->
<!--app:showAsAction="ifRoom" />-->
</menu>

View File

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">Thorium</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>
@ -16,37 +14,26 @@
<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>
<string name="permission_rationale">Grant contact permission for email completion.</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_overview">হোম</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>
@ -63,12 +50,11 @@
<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="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="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>
@ -261,7 +247,6 @@
<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>
@ -284,8 +269,6 @@
<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>
@ -295,18 +278,15 @@
<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">এই সেবা ব্যবহারের জন্য লগ ইন করুন</string>
<string name="video_meta_button_share">শেয়ার</string>
<string name="video_meta_button_download">ডাউনলোড</string>
<string name="video_meta_button_privacy">Privacy</string>
@ -314,8 +294,6 @@
<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>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_activity_settings">Einstellungen</string>
<string name="title_activity_login">Anmelden</string>
<string name="prompt_server">Server</string>
<string name="prompt_email">Kontoname</string>
<string name="prompt_password">Passwort</string>
<string name="action_sign_in">Anmelden</string>
<string name="action_sign_in_short">Anmelden</string>
<string name="error_invalid_email">Ungültige E-Mail-Adresse</string>
<string name="action_bar_title_search">Suche</string>
<string name="action_bar_title_logout">Abmelden</string>
<string name="action_bar_title_account">Konto</string>
<string name="bottom_nav_title_overview">Übersicht</string>
<string name="bottom_nav_title_local">Lokal</string>
<string name="bottom_nav_title_subscriptions">Abos</string>
<string name="bottom_nav_title_account">Konto</string>
<string name="pref_title_peertube_server">PeerTube Server</string>
<string name="title_activity_video_play">VideoPlayActivity</string>
<string name="error_invalid_password">Dieses Passwort ist zu kurz</string>
<string name="error_incorrect_password">Dieses Passwort ist falsch</string>
<string name="action_bar_title_settings">Einstellungen</string>
<string name="bottom_nav_title_recent">Aktuell</string>
<string name="meta_data_views">" Abrufe"</string>
<string name="video_row_video_thumbnail">Video Vorschaubild</string>
<string name="video_row_account_avatar">Konto Avatar</string>
<string name="pref_title_show_nsfw">NSFW Inhalt</string>
<string name="pref_description_show_nsfw">Zeigen NSFW Inhalt</string>
<string name="pref_language">Sprachfilter</string>
<string name="pref_title_license">Lizenz</string>
<string name="pref_title_version">Version</string>
<string name="search_hint">PeerTube durchsuchen</string>
<string name="title_activity_search">Suche</string>
<string name="no_data_available">Keine Ergebnisse</string>
<string name="descr_overflow_button">Mehr</string>
<string name="menu_share">Teilen</string>
<string name="invalid_url">Ungültige URL.</string>
<string name="pref_title_dark_mode">Dunkler Modus</string>
<string name="pref_title_app_theme">Farbschema</string>
</resources>

View File

@ -0,0 +1,293 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="title_activity_settings">Inställningar</string>
<string name="title_activity_login">Logga in</string>
<string name="prompt_server">Server</string>
<string name="prompt_email">E-post / Användarnamn</string>
<string name="prompt_password">Lösenord</string>
<string name="action_sign_in">Logga in</string>
<string name="action_sign_in_short">Logga in</string>
<string name="error_invalid_email">E-postadressen är inte giltig</string>
<string name="error_invalid_password">Lösenordet är för kort</string>
<string name="error_incorrect_password">Lösenordet stämmer inte</string>
<string name="error_field_required">Obligatoriskt fält</string>
<string name="action_bar_title_search">Sök</string>
<string name="action_bar_title_settings">Inställningar</string>
<string name="action_bar_title_logout">Logga ut</string>
<string name="action_bar_title_account">Konto</string>
<string name="bottom_nav_title_overview">Översikt</string>
<string name="bottom_nav_title_trending">Populärt</string>
<string name="bottom_nav_title_recent">Nyligen tillagt</string>
<string name="bottom_nav_title_local">Lokalt</string>
<string name="bottom_nav_title_subscriptions">Prenumerationer</string>
<string name="bottom_nav_title_account">Konto</string>
<string name="pref_title_peertube_server">PeerTube-server</string>
<string name="meta_data_views">" Visningar"</string>
<string name="video_row_video_thumbnail">Videominiatyr</string>
<string name="video_row_account_avatar">Kontoavatar</string>
<string name="pref_title_show_nsfw">Känsligt innehåll</string>
<string name="pref_description_show_nsfw">Visa känsligt innehåll</string>
<string name="pref_language">Språkfilter</string>
<string name="pref_description_language">Välj ett språk för att inte visa videor på samtliga språk.</string>
<string name="pref_title_torrent_player">Torrent-videospelare</string>
<string name="pref_description_torrent_player">Videouppspelning via en torrent-ström. Detta kräver lagringsåtkomst. (Alfa-version, inte stabilt!)</string>
<string name="pref_title_license">Licens</string>
<string name="pref_title_version">Version</string>
<string name="search_hint">Sök på PeerTube</string>
<string name="title_activity_search">Sök</string>
<string name="no_data_available">Inga resultat</string>
<string name="descr_overflow_button">Mer</string>
<string name="menu_share">Dela</string>
<string name="invalid_url">Ogiltig webbadress.</string>
<string name="pref_title_dark_mode">Mörkt tema</string>
<string name="pref_description_dark_mode">Starta om appen för att visa med mörkt tema.</string>
<string name="pref_title_app_theme">App-tema</string>
<string name="pref_description_app_theme">Starta om appen för att ladda in det nya temat.</string>
<string name="ab">Abchaziska</string>
<string name="aa">Afar</string>
<string name="af">Afrikaans</string>
<string name="ak">Akan</string>
<string name="sq">Albanska</string>
<string name="ase">Amerikanskt teckenspråk</string>
<string name="am">Amhariska</string>
<string name="ar">Arabiska</string>
<string name="an">Aragonska</string>
<string name="hy">Armeniska</string>
<string name="as">Assamesiska</string>
<string name="av">Avariska</string>
<string name="ay">Aymara</string>
<string name="az">Azerbajdzjanska</string>
<string name="bm">Bambara</string>
<string name="ba">Basjkiriska</string>
<string name="eu">Baskiska</string>
<string name="be">Vitryska</string>
<string name="bn">Bengali</string>
<string name="bi">Bislama</string>
<string name="bs">Bosniska</string>
<string name="bzs">Brasilianskt teckenspråk</string>
<string name="br">Bretonska</string>
<string name="bfi">Brittiskt teckenspråk</string>
<string name="bg">Bulgariska</string>
<string name="my">Burmesiska</string>
<string name="ca">Katalanska</string>
<string name="ch">Chamorro</string>
<string name="ce">Tjetjenska</string>
<string name="zh">Kinesiska</string>
<string name="csl">Kinesiskt teckenspråk</string>
<string name="cv">Tjuvasjiska</string>
<string name="kw">Korniska</string>
<string name="co">Korsikanska</string>
<string name="cr">Cree</string>
<string name="hr">Kroatiska</string>
<string name="cs">Tjeckiska</string>
<string name="cse">Tjeckiskt teckenspråk</string>
<string name="da">Danska</string>
<string name="dsl">Danskt teckenspråk</string>
<string name="dv">Divehi</string>
<string name="nl">Nederländska</string>
<string name="dz">Dzongkha</string>
<string name="en">Engelska</string>
<string name="eo">Esperanto</string>
<string name="et">Estniska</string>
<string name="ee">Ewe</string>
<string name="fo">Färöiska</string>
<string name="fj">Fijianska</string>
<string name="fi">Finska</string>
<string name="fr">Franska</string>
<string name="fsl">Franskt teckenspråk</string>
<string name="ff">Fula</string>
<string name="gl">Galiciska</string>
<string name="lg">Luganda</string>
<string name="ka">Georgiska</string>
<string name="de">Tyska</string>
<string name="gsg">Tyskt teckenspråk</string>
<string name="gn">Guaraní</string>
<string name="gu">Gujarati</string>
<string name="ht">Haitisk kreol</string>
<string name="ha">Hausa</string>
<string name="he">Hebreiska</string>
<string name="hz">Herero</string>
<string name="hi">Hindi</string>
<string name="ho">Hiri motu</string>
<string name="hu">Ungerska</string>
<string name="is">Isländska</string>
<string name="ig">Igbo</string>
<string name="id">Indonesiska</string>
<string name="iu">Inuktitut</string>
<string name="ik">Iñupiaq</string>
<string name="ga">Iriska</string>
<string name="it">Italienska</string>
<string name="ja">Japanska</string>
<string name="jsl">Japanskt teckenspråk</string>
<string name="jv">Javanesiska</string>
<string name="kl">Grönländska</string>
<string name="kn">Kannada</string>
<string name="kr">Kanuri</string>
<string name="ks">Kashmiri</string>
<string name="kk">Kazakiska</string>
<string name="km">Khmer</string>
<string name="ki">Kikuyu</string>
<string name="rw">Rwanda</string>
<string name="ky">Kirgiziska</string>
<string name="tlh">Klingon</string>
<string name="kv">Komi</string>
<string name="kg">Kikongo</string>
<string name="ko">Koreanska</string>
<string name="avk">Kotava</string>
<string name="kj">Kwanyama</string>
<string name="ku">Kurdiska</string>
<string name="lo">Lao</string>
<string name="lv">Lettiska</string>
<string name="li">Limburgiska</string>
<string name="ln">Lingala</string>
<string name="lt">Litauiska</string>
<string name="jbo">Lojban</string>
<string name="lu">Luba-Katanga</string>
<string name="lb">Luxemburgiska</string>
<string name="mk">Makedonska</string>
<string name="mg">Malagassiska</string>
<string name="ms">Malajiska</string>
<string name="ml">Malayalam</string>
<string name="mt">Maltesiska</string>
<string name="gv">Manx</string>
<string name="mi">Maori</string>
<string name="mr">Marathi</string>
<string name="mh">Marshallesiska</string>
<string name="el">Modern grekiska (1453)</string>
<string name="mn">Mongoliska</string>
<string name="na">Nauruanska</string>
<string name="nv">Navajo</string>
<string name="ng">Ndonga</string>
<string name="ne">Nepali</string>
<string name="nd">Nordndebele</string>
<string name="se">Nordsamiska</string>
<string name="no">Norska</string>
<string name="nb">Bokmål</string>
<string name="nn">Nynorska</string>
<string name="ny">Chichewa</string>
<string name="oc">Occitanska</string>
<string name="oj">Ojibwa</string>
<string name="or">Oriya</string>
<string name="om">Oromo</string>
<string name="os">Ossetiska</string>
<string name="pks">Pakistanskt teckenspråk</string>
<string name="pa">Punjabi</string>
<string name="fa">Persiska</string>
<string name="pl">Polska</string>
<string name="pt">Portugisiska</string>
<string name="ps">Pashto</string>
<string name="qu">Quechua</string>
<string name="ro">Rumänska</string>
<string name="rm">Rätoromanska</string>
<string name="rn">Kirundi</string>
<string name="ru">Ryska</string>
<string name="rsl">Ryskt teckenspråk</string>
<string name="sm">Samoanska</string>
<string name="sg">Sango</string>
<string name="sc">Sardiska</string>
<string name="sdl">Saudiskt teckenspråk</string>
<string name="gd">Skotsk gäliska</string>
<string name="sr">Serbiska</string>
<string name="sh">Serbokroatiska</string>
<string name="sn">Shona</string>
<string name="ii">Nuosu</string>
<string name="sd">Sindhi</string>
<string name="si">Singalesiska</string>
<string name="sk">Slovakiska</string>
<string name="sl">Slovenska</string>
<string name="so">Somaliska</string>
<string name="sfs">Sydafrikanskt teckenspråk</string>
<string name="nr">Sydndebele</string>
<string name="st">Sesotho</string>
<string name="es">Spanska</string>
<string name="su">Sundanesiska</string>
<string name="sw">Swahili</string>
<string name="ss">SiSwati</string>
<string name="sv">Svenska</string>
<string name="swl">Svenskt teckenspråk</string>
<string name="tl">Tagalog</string>
<string name="ty">Tahitiska</string>
<string name="tg">Tadzjikiska</string>
<string name="ta">Tamil</string>
<string name="tt">Tatariska</string>
<string name="te">Telugu</string>
<string name="th">Thai</string>
<string name="bo">Tibetanska</string>
<string name="ti">Tigrinska</string>
<string name="to">Tonganska</string>
<string name="ts">Tsonga</string>
<string name="tn">Setswana</string>
<string name="tr">Turkiska</string>
<string name="tk">Turkmeniska</string>
<string name="tw">Twi</string>
<string name="ug">Uiguriska</string>
<string name="uk">Ukrainska</string>
<string name="ur">Urdu</string>
<string name="uz">Uzbekiska</string>
<string name="ve">Venda</string>
<string name="vi">Vietnamesiska</string>
<string name="wa">Vallonska</string>
<string name="cy">Kymriska</string>
<string name="fy">Västfrisiska</string>
<string name="wo">Wolof</string>
<string name="xh">Xhosa</string>
<string name="yi">Jiddisch</string>
<string name="yo">Yoruba</string>
<string name="za">Zhuang</string>
<string name="zu">Zulu</string>
<string name="red">Röd</string>
<string name="pink">Rosa</string>
<string name="purple">Lila</string>
<string name="deeppurple">Mörklila</string>
<string name="indigo">Indigo</string>
<string name="blue">Blå</string>
<string name="lightblue">Ljusblå</string>
<string name="cyan">Cyan</string>
<string name="teal">Turkos</string>
<string name="green">Grön</string>
<string name="lightgreen">Ljusgrön</string>
<string name="lime">Gulgrön</string>
<string name="yellow">Gul</string>
<string name="amber">Gulorange</string>
<string name="orange">Orange</string>
<string name="deeporange">Mörkorange</string>
<string name="brown">Brun</string>
<string name="gray">Grå</string>
<string name="bluegray">Gråblå</string>
<string name="video_speed_05">0,5×</string>
<string name="video_speed_10">Normal</string>
<string name="video_speed_15">1,5×</string>
<string name="video_speed_20">2×</string>
<string name="pref_title_background_play">Spela upp i bakgrunden</string>
<string name="title_activity_account">Konto</string>
<string name="menu_video_more_report">Rapportera</string>
<string name="menu_video_more_blacklist">Svartlista</string>
<string name="video_download_permission_error">Kan inte ladda ner video utan skrivbehörighet</string>
<string name="video_rating_failed">Bedömningen kunde inte genomföras</string>
<string name="video_login_required_for_service">Du måste logga in för att använda den här tjänsten</string>
<string name="video_meta_button_share">Dela</string>
<string name="video_meta_button_download">Ladda ner</string>
<string name="video_meta_button_privacy">Hantering av personuppgifter</string>
<string name="video_meta_button_category">Kategori</string>
<string name="video_meta_button_license">Licens</string>
<string name="video_meta_button_language">Språk</string>
<string name="video_meta_button_tags">Taggar</string>
<string name="menu_video_options_playback_speed">Uppspelningshastighet</string>
<string name="menu_video_options_quality">Kvalitet</string>
<string name="account_bottom_menu_videos">Videor</string>
<string name="account_bottom_menu_channels">Kanaler</string>
<string name="account_bottom_menu_about">Om</string>
<string name="account_about_account">Konto:</string>
<string name="account_about_subscribers">Prenumeranter:</string>
<string name="account_about_description">Beskrivning:</string>
<string name="account_about_joined">Gick med:</string>
<string name="api_error">Någonting gick snett, försök gärna igen om en stund!</string>
<string name="title_activity_video_play">VideoPlayActivity</string>
<string name="permission_rationale">Ge åtkomst till kontakter för komplettering av e-postadresser.</string>
<string name="title_activity_url_video_play">UrlVideoPlayActivity</string>
<string name="pref_description_license">
\n<b>GNU Affero General Public License v3.0</b>
\n
\nRättigheterna den här starka copyleft-licensen ger, ges på villkoret att det licenserade verkets källkods samtliga delar och modifikationer görs tillgänglig under samma licens, detta gäller även större verk som använder det licenserade verket. Copyright- och licensnotiser måste bevaras. Bidragsgivare ger ett uttryckligt godkännande av patenträttigheter. Källkodens samtliga delar och modifikationer måste göras tillgänglig när en modifierad version används för att tillhandahålla en service över ett nätverk.</string>
<string name="pref_description_background_play">Videor kommer fortsätta spelas i bakgrunden om detta aktiveras.</string>
</resources>

View File

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">Thorium</string>
<string name="title_activity_video_play">İzleti Oynatma Etkinliği</string>
<string name="title_activity_settings">Ayarlar</string>
<string name="title_activity_login">Oturum aç</string>
<!-- Strings related to login -->
<string name="prompt_server">Sunucu</string>
<string name="prompt_email">E-posta / Kullanıcı adı</string>
@ -16,40 +14,30 @@
<string name="error_invalid_password">Bu şifre çok kısa</string>
<string name="error_incorrect_password">Bu şifre yanlış</string>
<string name="error_field_required">Bu alan gereklidir</string>
<string name="permission_rationale">"E-posta tanımlamaları için Rehber izinleri gerekir."
</string>
<string name="permission_rationale">E-posta tanımlamaları için Rehber izni verin.</string>
<!-- Action bar -->
<string name="action_bar_title_search">Arama</string>
<string name="action_bar_title_settings">Ayarlar</string>
<string name="action_bar_title_logout">Çıkış yap</string>
<!-- Bottom navigation bar -->
<string name="bottom_nav_title_overview">Ev</string>
<string name="bottom_nav_title_trending">Eğilimler</string>
<string name="bottom_nav_title_subscriptions">Abonelikler</string>
<string name="bottom_nav_title_account">Hesap</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 Sunucusu</string>
<!-- Strings related to Video meta data -->
<string name="meta_data_seperator" translatable="false">\u0020-\u0020</string>
<string name="meta_data_views">\u0020 Görüntüleme</string>
<string name="meta_data_owner_seperator" translatable="false">\@</string>
<string name="video_row_video_thumbnail">İzleti Küçük Resmi</string>
<string name="video_row_account_avatar">Hesap Resmi</string>
<string name="pref_title_show_nsfw">Ahlaksız İçerik</string>
<string name="pref_description_show_nsfw">Ahlaksız içeriği göster</string>
<string name="pref_language">Dil süzgeci</string>
<string name="pref_description_language">Gösterilmesi gereken izleti dillerini seçin. Hiçbiri seçili değilse tüm izletileri tüm dillerde gösterecek.</string>
<string name="pref_description_language">Tüm izletileri tüm dillerde göstermek yerine bir izleti dili seçin.</string>
<string name="title_activity_url_video_play">URL İzleti Oynatma Etkinliği</string>
<string name="pref_title_torrent_player">Torrent İzleti Oynatıcı</string>
<string name="pref_description_torrent_player">Bir torrent akışı üzerinden izleti oynatma. Bu Depolama İzinlerini gerektirir. (Deneyseldir, kararlı değil!)</string>
@ -62,12 +50,11 @@
<string name="descr_overflow_button">Daha</string>
<string name="menu_share">Paylaş</string>
<string name="playback_channel_name" translatable="false">PeerTube</string>
<string name="invalid_url">Geçersiz bağlantı!</string>
<string name="invalid_url">Geçersiz bağlantı.</string>
<string name="pref_title_dark_mode">Karanlık Kipi</string>
<string name="pref_description_dark_mode">Karanlık kipin etkinleşmesi için uygulamayı yeniden başlatın.</string>
<string name="pref_title_app_theme">Uygulama Teması</string>
<string name="pref_description_app_theme">Temanın etkinleşmesi için uygulamayı yeniden başlatın.</string>
<string name="ab">Abhazca</string>
<string name="aa">Afar</string>
<string name="af">Afrikanca</string>
@ -260,7 +247,6 @@
<string name="yo">Yorubaca</string>
<string name="za">Zhuangca</string>
<string name="zu">Zuluca</string>
<string name="red">Kırmızı</string>
<string name="pink">Pembe</string>
<string name="purple">Mor</string>
@ -284,7 +270,6 @@
<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_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>
@ -297,18 +282,15 @@
<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">Arkaplanda Oynatma</string>
<string name="pref_description_background_play">Etkinleştirilirse, arka planda izleti oynatmaya devam eder.</string>
<string name="bottom_nav_title_local">Yerel</string>
<string name="title_activity_account">Hesap</string>
<string name="menu_video_more_report">Rapor</string>
<string name="menu_video_more_blacklist">Karaliste</string>
<string name="video_download_permission_error">Yazma izni olmadan video indirilemiyor</string>
<string name="video_rating_failed">Değerlendirme Başarısız</string>
<string name="video_login_required_for_service">Bu hizmeti kullanmak için giriş yapmalısınız</string>
<string name="video_meta_button_share">Paylaş</string>
<string name="video_meta_button_download">İndir</string>
<string name="video_meta_button_privacy">Gizlilik</string>
@ -316,10 +298,8 @@
<string name="video_meta_button_license">Lisans</string>
<string name="video_meta_button_language">Dil</string>
<string name="video_meta_button_tags">Etiketler</string>
<string name="menu_video_options_playback_speed">Oynatma hızı</string>
<string name="menu_video_options_quality">Kalite</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>

View File

@ -63,4 +63,12 @@
<string name="pref_description_torrent_player">视频通过一个种子下载,此选项需要存储权限(实验阶段,不稳定!)</string>
<string name="action_bar_title_logout">退出</string>
<string name="zh">中文</string>
<string name="title_activity_video_play">视频播放Activity</string>
<string name="error_field_required">本字段必填</string>
<string name="action_bar_title_account">账户</string>
<string name="bottom_nav_title_recent">最近</string>
<string name="video_row_video_thumbnail">视频缩略图</string>
<string name="video_row_account_avatar">账号头像</string>
<string name="title_activity_url_video_play">Url视频播放Activity</string>
<string name="api_error">出故障了,请稍候再试</string>
</resources>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources><string name="title_activity_video_play">影片播放活動</string>
<resources>
<string name="title_activity_video_play">影片播放活動</string>
<string name="title_activity_settings">設定</string>
<string name="title_activity_login">登入</string>
<string name="prompt_server">伺服器</string>
@ -11,8 +12,7 @@
<string name="error_invalid_password">這個密碼太短了</string>
<string name="error_incorrect_password">這個密碼不正確</string>
<string name="error_field_required">這個欄位為必填</string>
<string name="permission_rationale">"聯絡人權限是電子郵件
\n 完成功能所必須。"</string>
<string name="permission_rationale">授予連絡人電子郵件完成權限。</string>
<string name="action_bar_title_search">搜尋</string>
<string name="action_bar_title_settings">設定</string>
<string name="action_bar_title_logout">登出</string>
@ -30,7 +30,7 @@
<string name="pref_title_show_nsfw">NSFW 內容</string>
<string name="pref_description_show_nsfw">顯示 NSFW 內容</string>
<string name="pref_language">語言過濾器</string>
<string name="pref_description_language">選取要顯示的影片語言。若未選取則將會顯示所有語言的所有影片。</string>
<string name="pref_description_language">選取所要的影片語言,而不是以所有的語言顯示全部影片。</string>
<string name="title_activity_url_video_play">Url影片播放活動</string>
<string name="pref_title_torrent_player">種子影片播放器</string>
<string name="pref_description_torrent_player">透過種子串流播放影片。這需要儲存權限。Alpha 版,不穩定!)</string>
@ -45,7 +45,7 @@
<string name="no_data_available">沒有結果</string>
<string name="descr_overflow_button">更多</string>
<string name="menu_share">分享</string>
<string name="invalid_url">無效的 Url</string>
<string name="invalid_url">無效的 URL。</string>
<string name="pref_title_dark_mode">深色模式</string>
<string name="pref_description_dark_mode">重新啟動應用程式以讓深色模式生效。</string>
<string name="pref_title_app_theme">應用程式主題</string>

View File

@ -1,9 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name" translatable="false">Thorium</string>
<string name="title_activity_video_play">VideoPlayActivity</string>
<string name="title_activity_video_play" translatable="false">VideoPlayActivity</string>
<string name="title_activity_settings">Settings</string>
<string name="title_activity_login">Sign in</string>
<!-- Strings related to login -->
<string name="prompt_server">Server</string>
<string name="prompt_email">Email / Username</string>
@ -15,11 +16,13 @@
<string name="error_incorrect_password">This password is incorrect</string>
<string name="error_field_required">This field is required</string>
<string name="permission_rationale">Grant contact permission for e-mail completion.</string>
<!-- Action bar -->
<string name="action_bar_title_search">Search</string>
<string name="action_bar_title_settings">Settings</string>
<string name="action_bar_title_logout">Log out</string>
<string name="action_bar_title_account">Account</string>
<!-- Bottom navigation bar -->
<string name="bottom_nav_title_overview">Overview</string>
<string name="bottom_nav_title_trending">Trending</string>
@ -28,25 +31,15 @@
<string name="bottom_nav_title_subscriptions">Subscriptions</string>
<string name="bottom_nav_title_account">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 Content</string>
<string name="pref_description_show_nsfw">Show NSFW content</string>
<string name="pref_language">Language filter</string>
<string name="pref_description_language">Select a video language, instead of showing all videos in all languages.</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">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">Version</string>
<string name="search_hint">Search PeerTube</string>
<string name="title_activity_search">Search</string>
<string name="no_data_available">No Results</string>
@ -54,10 +47,29 @@
<string name="menu_share">Share</string>
<string name="playback_channel_name" translatable="false">PeerTube</string>
<string name="invalid_url">Invalid URL.</string>
<!-- settings/preferences -->
<string name="pref_title_dark_mode">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="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">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">Version</string>
<string name="pref_title_show_nsfw">NSFW Content</string>
<string name="pref_description_show_nsfw">Show NSFW content</string>
<string name="pref_language">Language filter</string>
<string name="pref_description_language">Select a video language, instead of showing all videos in all languages.</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>
<string name="pref_title_background_play">Background Playback</string>
<string name="pref_description_background_play">If enabled, continues to play video in background.</string>
<!-- languages -->
<string name="ab">Abkhazian</string>
<string name="aa">Afar</string>
<string name="af">Afrikaans</string>
@ -250,6 +262,8 @@
<string name="yo">Yoruba</string>
<string name="za">Zhuang</string>
<string name="zu">Zulu</string>
<!-- colors -->
<string name="red">Red</string>
<string name="pink">Pink</string>
<string name="purple">Purple</string>
@ -269,10 +283,12 @@
<string name="brown">Brown</string>
<string name="gray">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_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>
@ -285,8 +301,16 @@
<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="action_set_url">Select Server</string>
<string name="server_selection_signup_allowed">Signup Allowed: %s</string>
<string name="server_selection_signup_allowed_yes">Yes</string>
<string name="server_selection_signup_allowed_no">No</string>
<string name="server_selection_set_server">Server set to: %s</string>
<string name="server_selection_select_a_server">Select a Server from the list below or enter it directly.</string>
<string name="server_selection_peertube_server_url">PeerTube Server URL</string>
<string name="title_activity_account">Account</string>
<string name="menu_video_more_report">Report</string>
<string name="menu_video_more_blacklist">Blacklist</string>
@ -310,6 +334,10 @@
<string name="account_about_description">Description:</string>
<string name="account_about_joined">Joined:</string>
<string name="api_error">Something went wrong, please try later!</string>
<string name="action_bar_title_server_selection">Select Server</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>
@ -320,4 +348,6 @@
<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="peertube_required_server_version" translatable="false">1.0.0-alpha.7</string>
</resources>

View File

@ -1,13 +1,7 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference
android:capitalize="words"
android:defaultValue="@string/pref_default_api_base_url"
android:inputType="textUri"
<Preference
android:key="pref_api_base"
android:maxLines="1"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_title_peertube_server" />
<!--<SwitchPreference-->

View File

@ -0,0 +1,5 @@
PeerTube is a federated video streaming platform that is community-owned and ad-free, with no vendor lock-in. This client allows you to watch and browse videos on a server of your choice in the PeerTube network.
This client comes preconfigured with one PeerTube server managed by the application creator - not the PeerTube project itself, which lists more on http://instances.joinpeertube.org/ - to allow you to have a taste of what the client is capable of. Choose your server to tune your experience!
Please note this is app is in beta and is still missing a lot of features.

View File

Before

Width:  |  Height:  |  Size: 614 KiB

After

Width:  |  Height:  |  Size: 614 KiB

View File

Before

Width:  |  Height:  |  Size: 440 KiB

After

Width:  |  Height:  |  Size: 440 KiB

View File

@ -0,0 +1 @@
A PeerTube player