diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0269056..a6a0853 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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
diff --git a/README.md b/README.md
index 5dcb6e2..567e070 100644
--- a/README.md
+++ b/README.md
@@ -1,47 +1,67 @@
- Thorium, a Android PeerTube Client
+ Thorium, an Android PeerTube Client
-[![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/)
-
-
-
-
-
-
+
+
+
+
+
+
+## Screenshots
+[](fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png)
+[](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
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index fb012d1..71bfb1b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -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'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 073b0ba..5250d9f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,73 +2,65 @@
-
-
-
-
-
-
-
+
+
-
-
+ tools:ignore="GoogleAppIndexingWarning">
+
+
+
-
+ android:resource="@xml/searchable">
+ android:label="@string/title_activity_login"
+ android:theme="@style/AppTheme.NoActionBar" />
+ android:launchMode="singleTop"
+ android:theme="@style/AppTheme.NoActionBar" />
-
-
-
-
+
+
-
-
-
-
+ android:theme="@style/AppTheme.NoActionBar" />
+
-
-
\ No newline at end of file
diff --git a/app/src/main/java/net/schueller/peertube/activity/SelectServerActivity.java b/app/src/main/java/net/schueller/peertube/activity/SelectServerActivity.java
index 4a8789e..d29a8fa 100644
--- a/app/src/main/java/net/schueller/peertube/activity/SelectServerActivity.java
+++ b/app/src/main/java/net/schueller/peertube/activity/SelectServerActivity.java
@@ -1,61 +1,177 @@
-/*
- * Copyright 2018 Stefan Schüller
- *
- * 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 .
- */
-
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 call = service.getInstancesData(0, 500);
- call.enqueue(new Callback() {
+ 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 call, @NonNull Response response) {
- // response.body().getVideoArrayList();
+ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
+ super.onScrollStateChanged(recyclerView, newState);
}
@Override
- public void onFailure(@NonNull Call 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 call;
+
+ call = service.getInstancesData(start, count);
+
+ Log.d("URL Called", call.request().url() + "");
+
+ call.enqueue(new Callback() {
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response 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 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);
+ }
+ });
+
+ }
}
diff --git a/app/src/main/java/net/schueller/peertube/activity/SettingsActivity.java b/app/src/main/java/net/schueller/peertube/activity/SettingsActivity.java
index 3d7352d..6f79d93 100644
--- a/app/src/main/java/net/schueller/peertube/activity/SettingsActivity.java
+++ b/app/src/main/java/net/schueller/peertube/activity/SettingsActivity.java
@@ -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();
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java
index f851b73..8a68ce6 100644
--- a/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java
+++ b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java
@@ -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;
}
diff --git a/app/src/main/java/net/schueller/peertube/adapter/ServerAdapter.java b/app/src/main/java/net/schueller/peertube/adapter/ServerAdapter.java
new file mode 100644
index 0000000..0e3de08
--- /dev/null
+++ b/app/src/main/java/net/schueller/peertube/adapter/ServerAdapter.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright 2018 Stefan Schüller
+ *
+ * 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 .
+ */
+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 {
+
+
+ private ArrayList serverList;
+ private SelectServerActivity activity;
+ private String baseUrl;
+
+ public ServerAdapter(ArrayList 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 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);
+
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/net/schueller/peertube/helper/APIUrlHelper.java b/app/src/main/java/net/schueller/peertube/helper/APIUrlHelper.java
index 4a4c06a..3cc5a00 100644
--- a/app/src/main/java/net/schueller/peertube/helper/APIUrlHelper.java
+++ b/app/src/main/java/net/schueller/peertube/helper/APIUrlHelper.java
@@ -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;
+ }
}
diff --git a/app/src/main/java/net/schueller/peertube/model/Server.java b/app/src/main/java/net/schueller/peertube/model/Server.java
index 4d14404..2cc17e1 100644
--- a/app/src/main/java/net/schueller/peertube/model/Server.java
+++ b/app/src/main/java/net/schueller/peertube/model/Server.java
@@ -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;
}
diff --git a/app/src/main/res/layout/activity_select_server.xml b/app/src/main/res/layout/activity_select_server.xml
deleted file mode 100644
index 71beae8..0000000
--- a/app/src/main/res/layout/activity_select_server.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_server_selection.xml b/app/src/main/res/layout/activity_server_selection.xml
new file mode 100644
index 0000000..0abd720
--- /dev/null
+++ b/app/src/main/res/layout/activity_server_selection.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/row_server.xml b/app/src/main/res/layout/row_server.xml
new file mode 100644
index 0000000..97b7c0c
--- /dev/null
+++ b/app/src/main/res/layout/row_server.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/menu_top_videolist.xml b/app/src/main/res/menu/menu_top_videolist.xml
index 121e62d..3671565 100644
--- a/app/src/main/res/menu/menu_top_videolist.xml
+++ b/app/src/main/res/menu/menu_top_videolist.xml
@@ -26,4 +26,11 @@
android:textAppearance="@style/Base.TextAppearance.AppCompat.Caption"
app:showAsAction="ifRoom" />
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index 6596122..9bfb6b5 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -1,11 +1,9 @@
Thorium
-
VideoPlayActivity
সেটিংস
সাইন ইন
-
সার্ভার
ইমেল / ইয়ুজারনেম
@@ -16,37 +14,26 @@
পাসওয়ার্ড খুব ছোট
ভুল পাসওয়ার্ড
এটি জরুরি ফিল্ড
- "Contacts permissions are needed for providing email
- completions."
-
-
+ Grant contact permission for email completion.
সার্চ
সেটিং
লগ আউট
-
হোম
"Trending"
Subscriptions
একাউন্ট
-
1.0.0-alpha.7
-
https://troll.tv
PeerTube Server
-
-
\u0020-\u0020
\u0020Views
\@
-
-
Video Thumbnail
Account Avatar
-
NSFW দেখাও
NSFW content will be shown if enabled.
ভাষা ফিলটার
@@ -63,12 +50,11 @@
আরও
শেয়ার
PeerTube
- Invalid Url!
+ Invalid URL.
ডার্ক মোড
Restart App for Dark Mode to take effect.
App Theme
- Restart App for theme to take effect.
-
+ Restart app for theme to take effect.
Abkhazian
Afar
Afrikaans
@@ -261,7 +247,6 @@
Yoruba
Zhuang
Zulu
-
লাল
গোলাপি
বেগুনি
@@ -284,8 +269,6 @@
Normal
1.5x
2x
-
-
{faw-check}
{faw-expand}
{faw-compress}
@@ -295,18 +278,15 @@
{faw-share}
{faw-download}
{faw-save}
-
Background Playback
If enabled, continues to play video in background.
Local
-
একাউন্ট
রিপোর্ট
Blacklist
Can not download video without write permission
Rating Failed
এই সেবা ব্যবহারের জন্য লগ ইন করুন
-
শেয়ার
ডাউনলোড
Privacy
@@ -314,8 +294,6 @@
License
ভাষা
Tags
-
-
pref_token_access
pref_token_refresh
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
new file mode 100644
index 0000000..372a832
--- /dev/null
+++ b/app/src/main/res/values-de/strings.xml
@@ -0,0 +1,40 @@
+
+
+ Einstellungen
+ Anmelden
+ Server
+ Kontoname
+ Passwort
+ Anmelden
+ Anmelden
+ Ungültige E-Mail-Adresse
+ Suche
+ Abmelden
+ Konto
+ Übersicht
+ Lokal
+ Abos
+ Konto
+ PeerTube Server
+ VideoPlayActivity
+ Dieses Passwort ist zu kurz
+ Dieses Passwort ist falsch
+ Einstellungen
+ Aktuell
+ " Abrufe"
+ Video Vorschaubild
+ Konto Avatar
+ NSFW Inhalt
+ Zeigen NSFW Inhalt
+ Sprachfilter
+ Lizenz
+ Version
+ PeerTube durchsuchen
+ Suche
+ Keine Ergebnisse
+ Mehr
+ Teilen
+ Ungültige URL.
+ Dunkler Modus
+ Farbschema
+
\ No newline at end of file
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
new file mode 100644
index 0000000..0490530
--- /dev/null
+++ b/app/src/main/res/values-sv/strings.xml
@@ -0,0 +1,293 @@
+
+
+ Inställningar
+ Logga in
+ Server
+ E-post / Användarnamn
+ Lösenord
+ Logga in
+ Logga in
+ E-postadressen är inte giltig
+ Lösenordet är för kort
+ Lösenordet stämmer inte
+ Obligatoriskt fält
+ Sök
+ Inställningar
+ Logga ut
+ Konto
+ Översikt
+ Populärt
+ Nyligen tillagt
+ Lokalt
+ Prenumerationer
+ Konto
+ PeerTube-server
+ " Visningar"
+ Videominiatyr
+ Kontoavatar
+ Känsligt innehåll
+ Visa känsligt innehåll
+ Språkfilter
+ Välj ett språk för att inte visa videor på samtliga språk.
+ Torrent-videospelare
+ Videouppspelning via en torrent-ström. Detta kräver lagringsåtkomst. (Alfa-version, inte stabilt!)
+ Licens
+ Version
+ Sök på PeerTube
+ Sök
+ Inga resultat
+ Mer
+ Dela
+ Ogiltig webbadress.
+ Mörkt tema
+ Starta om appen för att visa med mörkt tema.
+ App-tema
+ Starta om appen för att ladda in det nya temat.
+ Abchaziska
+ Afar
+ Afrikaans
+ Akan
+ Albanska
+ Amerikanskt teckenspråk
+ Amhariska
+ Arabiska
+ Aragonska
+ Armeniska
+ Assamesiska
+ Avariska
+ Aymara
+ Azerbajdzjanska
+ Bambara
+ Basjkiriska
+ Baskiska
+ Vitryska
+ Bengali
+ Bislama
+ Bosniska
+ Brasilianskt teckenspråk
+ Bretonska
+ Brittiskt teckenspråk
+ Bulgariska
+ Burmesiska
+ Katalanska
+ Chamorro
+ Tjetjenska
+ Kinesiska
+ Kinesiskt teckenspråk
+ Tjuvasjiska
+ Korniska
+ Korsikanska
+ Cree
+ Kroatiska
+ Tjeckiska
+ Tjeckiskt teckenspråk
+ Danska
+ Danskt teckenspråk
+ Divehi
+ Nederländska
+ Dzongkha
+ Engelska
+ Esperanto
+ Estniska
+ Ewe
+ Färöiska
+ Fijianska
+ Finska
+ Franska
+ Franskt teckenspråk
+ Fula
+ Galiciska
+ Luganda
+ Georgiska
+ Tyska
+ Tyskt teckenspråk
+ Guaraní
+ Gujarati
+ Haitisk kreol
+ Hausa
+ Hebreiska
+ Herero
+ Hindi
+ Hiri motu
+ Ungerska
+ Isländska
+ Igbo
+ Indonesiska
+ Inuktitut
+ Iñupiaq
+ Iriska
+ Italienska
+ Japanska
+ Japanskt teckenspråk
+ Javanesiska
+ Grönländska
+ Kannada
+ Kanuri
+ Kashmiri
+ Kazakiska
+ Khmer
+ Kikuyu
+ Rwanda
+ Kirgiziska
+ Klingon
+ Komi
+ Kikongo
+ Koreanska
+ Kotava
+ Kwanyama
+ Kurdiska
+ Lao
+ Lettiska
+ Limburgiska
+ Lingala
+ Litauiska
+ Lojban
+ Luba-Katanga
+ Luxemburgiska
+ Makedonska
+ Malagassiska
+ Malajiska
+ Malayalam
+ Maltesiska
+ Manx
+ Maori
+ Marathi
+ Marshallesiska
+ Modern grekiska (1453–)
+ Mongoliska
+ Nauruanska
+ Navajo
+ Ndonga
+ Nepali
+ Nordndebele
+ Nordsamiska
+ Norska
+ Bokmål
+ Nynorska
+ Chichewa
+ Occitanska
+ Ojibwa
+ Oriya
+ Oromo
+ Ossetiska
+ Pakistanskt teckenspråk
+ Punjabi
+ Persiska
+ Polska
+ Portugisiska
+ Pashto
+ Quechua
+ Rumänska
+ Rätoromanska
+ Kirundi
+ Ryska
+ Ryskt teckenspråk
+ Samoanska
+ Sango
+ Sardiska
+ Saudiskt teckenspråk
+ Skotsk gäliska
+ Serbiska
+ Serbokroatiska
+ Shona
+ Nuosu
+ Sindhi
+ Singalesiska
+ Slovakiska
+ Slovenska
+ Somaliska
+ Sydafrikanskt teckenspråk
+ Sydndebele
+ Sesotho
+ Spanska
+ Sundanesiska
+ Swahili
+ SiSwati
+ Svenska
+ Svenskt teckenspråk
+ Tagalog
+ Tahitiska
+ Tadzjikiska
+ Tamil
+ Tatariska
+ Telugu
+ Thai
+ Tibetanska
+ Tigrinska
+ Tonganska
+ Tsonga
+ Setswana
+ Turkiska
+ Turkmeniska
+ Twi
+ Uiguriska
+ Ukrainska
+ Urdu
+ Uzbekiska
+ Venda
+ Vietnamesiska
+ Vallonska
+ Kymriska
+ Västfrisiska
+ Wolof
+ Xhosa
+ Jiddisch
+ Yoruba
+ Zhuang
+ Zulu
+ Röd
+ Rosa
+ Lila
+ Mörklila
+ Indigo
+ Blå
+ Ljusblå
+ Cyan
+ Turkos
+ Grön
+ Ljusgrön
+ Gulgrön
+ Gul
+ Gulorange
+ Orange
+ Mörkorange
+ Brun
+ Grå
+ Gråblå
+ 0,5×
+ Normal
+ 1,5×
+ 2×
+ Spela upp i bakgrunden
+ Konto
+ Rapportera
+ Svartlista
+ Kan inte ladda ner video utan skrivbehörighet
+ Bedömningen kunde inte genomföras
+ Du måste logga in för att använda den här tjänsten
+ Dela
+ Ladda ner
+ Hantering av personuppgifter
+ Kategori
+ Licens
+ Språk
+ Taggar
+ Uppspelningshastighet
+ Kvalitet
+ Videor
+ Kanaler
+ Om
+ Konto:
+ Prenumeranter:
+ Beskrivning:
+ Gick med:
+ Någonting gick snett, försök gärna igen om en stund!
+ VideoPlayActivity
+ Ge åtkomst till kontakter för komplettering av e-postadresser.
+ UrlVideoPlayActivity
+
+\nGNU Affero General Public License v3.0
+\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.
+ Videor kommer fortsätta spelas i bakgrunden om detta aktiveras.
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 6bbce80..0b14789 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -1,11 +1,9 @@
- Thorium
İzleti Oynatma Etkinliği
Ayarlar
Oturum aç
-
Sunucu
E-posta / Kullanıcı adı
@@ -16,40 +14,30 @@
Bu şifre çok kısa
Bu şifre yanlış
Bu alan gereklidir
- "E-posta tanımlamaları için Rehber izinleri gerekir."
-
-
+ E-posta tanımlamaları için Rehber izni verin.
Arama
Ayarlar
Çıkış yap
-
Ev
Eğilimler
Abonelikler
Hesap
-
1.0.0-alpha.7
-
https://troll.tv
PeerTube Sunucusu
-
-
\u0020-\u0020
\u0020 Görüntüleme
\@
-
-
İzleti Küçük Resmi
Hesap Resmi
-
Ahlaksız İçerik
Ahlaksız içeriği göster
Dil süzgeci
- Gösterilmesi gereken izleti dillerini seçin. Hiçbiri seçili değilse tüm izletileri tüm dillerde gösterecek.
+ Tüm izletileri tüm dillerde göstermek yerine bir izleti dili seçin.
URL İzleti Oynatma Etkinliği
Torrent İzleti Oynatıcı
Bir torrent akışı üzerinden izleti oynatma. Bu Depolama İzinlerini gerektirir. (Deneyseldir, kararlı değil!)
@@ -62,12 +50,11 @@
Daha
Paylaş
PeerTube
- Geçersiz bağlantı!
+ Geçersiz bağlantı.
Karanlık Kipi
Karanlık kipin etkinleşmesi için uygulamayı yeniden başlatın.
Uygulama Teması
Temanın etkinleşmesi için uygulamayı yeniden başlatın.
-
Abhazca
Afar
Afrikanca
@@ -260,7 +247,6 @@
Yorubaca
Zhuangca
Zuluca
-
Kırmızı
Pembe
Mor
@@ -284,7 +270,6 @@
Normal
1.5x
2x
-
{faw-play-circle}
{faw-cog}
{faw-check}
@@ -297,18 +282,15 @@
{faw-share}
{faw-download}
{faw-save}
-
Arkaplanda Oynatma
Etkinleştirilirse, arka planda izleti oynatmaya devam eder.
Yerel
-
Hesap
Rapor
Karaliste
Yazma izni olmadan video indirilemiyor
Değerlendirme Başarısız
Bu hizmeti kullanmak için giriş yapmalısınız
-
Paylaş
İndir
Gizlilik
@@ -316,10 +298,8 @@
Lisans
Dil
Etiketler
-
Oynatma hızı
Kalite
-
pref_token_access
pref_token_refresh
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 87c7c7b..b6407f8 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -63,4 +63,12 @@
视频通过一个种子下载,此选项需要存储权限(实验阶段,不稳定!)
退出
中文
+ 视频播放Activity
+ 本字段必填
+ 账户
+ 最近
+ 视频缩略图
+ 账号头像
+ Url视频播放Activity
+ 出故障了,请稍候再试
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 5d28cbe..525a0a5 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -1,5 +1,6 @@
-影片播放活動
+
+ 影片播放活動
設定
登入
伺服器
@@ -11,8 +12,7 @@
這個密碼太短了
這個密碼不正確
這個欄位為必填
- "聯絡人權限是電子郵件
-\n 完成功能所必須。"
+ 授予連絡人電子郵件完成權限。
搜尋
設定
登出
@@ -30,7 +30,7 @@
NSFW 內容
顯示 NSFW 內容
語言過濾器
- 選取要顯示的影片語言。若未選取則將會顯示所有語言的所有影片。
+ 選取所要的影片語言,而不是以所有的語言顯示全部影片。
Url影片播放活動
種子影片播放器
透過種子串流播放影片。這需要儲存權限。(Alpha 版,不穩定!)
@@ -45,7 +45,7 @@
沒有結果
更多
分享
- 無效的 Url!
+ 無效的 URL。
深色模式
重新啟動應用程式以讓深色模式生效。
應用程式主題
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 930170c..d61f6fc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,9 +1,10 @@
Thorium
- VideoPlayActivity
+ VideoPlayActivity
Settings
Sign in
+
Server
Email / Username
@@ -15,11 +16,13 @@
This password is incorrect
This field is required
Grant contact permission for e-mail completion.
+
Search
Settings
Log out
Account
+
Overview
Trending
@@ -28,25 +31,15 @@
Subscriptions
Account
- 1.0.0-alpha.7
- https://troll.tv
- PeerTube Server
+
\u0020-\u0020
\u0020Views
\@
Video Thumbnail
Account Avatar
- NSFW Content
- Show NSFW content
- Language filter
- Select a video language, instead of showing all videos in all languages.
UrlVideoPlayActivity
- Torrent Video Player
- Video playback via a torrent stream. This requires Storage Permissions. (Alpha, not stable!)
- License
- \nGNU Affero General Public License v3.0\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.
- Version
+
Search PeerTube
Search
No Results
@@ -54,10 +47,29 @@
Share
PeerTube
Invalid URL.
+
+
+
Dark Mode
Restart App for Dark Mode to take effect.
App Theme
Restart app for theme to take effect.
+ Torrent Video Player
+ Video playback via a torrent stream. This requires Storage Permissions. (Alpha, not stable!)
+ License
+ \nGNU Affero General Public License v3.0\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.
+ Version
+ NSFW Content
+ Show NSFW content
+ Language filter
+ Select a video language, instead of showing all videos in all languages.
+ https://troll.tv
+ PeerTube Server
+ Background Playback
+ If enabled, continues to play video in background.
+
+
+
Abkhazian
Afar
Afrikaans
@@ -250,6 +262,8 @@
Yoruba
Zhuang
Zulu
+
+
Red
Pink
Purple
@@ -269,10 +283,12 @@
Brown
Gray
Bluegray
+
0.5x
Normal
1.5x
2x
+
{faw-play-circle}
{faw-cog}
{faw-check}
@@ -285,8 +301,16 @@
{faw-share}
{faw-download}
{faw-save}
- Background Playback
- If enabled, continues to play video in background.
+
+ Select Server
+ Signup Allowed: %s
+ Yes
+ No
+ Server set to: %s
+ Select a Server from the list below or enter it directly.
+ PeerTube Server URL
+
+
Account
Report
Blacklist
@@ -310,6 +334,10 @@
Description:
Joined:
Something went wrong, please try later!
+
+ Select Server
+
+
pref_token_access
pref_token_refresh
@@ -320,4 +348,6 @@
none
like
dislike
+ 1.0.0-alpha.7
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml
index 56eaa7a..3b1e6a1 100644
--- a/app/src/main/res/xml/pref_general.xml
+++ b/app/src/main/res/xml/pref_general.xml
@@ -1,13 +1,7 @@
-
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
new file mode 100644
index 0000000..bf2f133
--- /dev/null
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -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.
diff --git a/Screenshot_1546780555.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png
similarity index 100%
rename from Screenshot_1546780555.png
rename to fastlane/metadata/android/en-US/images/phoneScreenshots/shot_01.png
diff --git a/Screenshot_1546780637.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png
similarity index 100%
rename from Screenshot_1546780637.png
rename to fastlane/metadata/android/en-US/images/phoneScreenshots/shot_02.png
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
new file mode 100644
index 0000000..9faf711
--- /dev/null
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -0,0 +1 @@
+A PeerTube player
\ No newline at end of file