From cbe2bb45e30455635b316c01846aa4df14ee0a89 Mon Sep 17 00:00:00 2001 From: lishoujun Date: Tue, 1 Jan 2019 12:40:46 +0800 Subject: [PATCH 01/12] update dependence. minor change --- app/build.gradle | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8b69e35..a317844 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,6 +9,11 @@ android { versionCode 1019 versionName "1.0.19" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + ext { + libVersions = [ + exoplayer: '2.9.3' + ] + } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) @@ -41,13 +46,13 @@ android { // implementation "com.github.TorrentStream:TorrentStreamServer-Android:1.0.1" // implementation 'org.webrtc:google-webrtc:1.0.+' - // video player - implementation 'com.google.android.exoplayer:exoplayer-core:2.9.2' - implementation 'com.google.android.exoplayer:exoplayer-dash:2.9.2' - implementation 'com.google.android.exoplayer:exoplayer-ui:2.9.2' - implementation 'com.google.android.exoplayer:exoplayer-hls:2.9.2' - implementation 'com.google.android.exoplayer:exoplayer-smoothstreaming:2.9.2' - implementation 'com.google.android.exoplayer:extension-mediasession:2.9.2' + // video player repo:jcenter() + implementation "com.google.android.exoplayer:exoplayer-core:$libVersions.exoplayer" + implementation "com.google.android.exoplayer:exoplayer-dash:$libVersions.exoplayer" + implementation "com.google.android.exoplayer:exoplayer-ui:$libVersions.exoplayer" + implementation "com.google.android.exoplayer:exoplayer-hls:$libVersions.exoplayer" + implementation "com.google.android.exoplayer:exoplayer-smoothstreaming:$libVersions.exoplayer" + implementation "com.google.android.exoplayer:extension-mediasession:$libVersions.exoplayer" // testing testImplementation 'junit:junit:4.12' From c190b5f46cd334998fd31d75cf1c8f6b92c7dbaa Mon Sep 17 00:00:00 2001 From: Rex_sa <13156001+rex07@users.noreply.github.com> Date: Wed, 2 Jan 2019 07:11:34 +0300 Subject: [PATCH 02/12] update ar --- app/src/main/res/values-ar/strings.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ab8ed73..37a45b8 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -45,6 +45,8 @@ عرض NSFW عند التنشيط سيتم عرض محتويات NSFW + عرض اللغات + أختيار لغة ليتم عرضها. UrlVideoPlayActivity مشغل فيديو التورنت تشغيل الفيديو عبر بث التورنت . يتطلب هذا أذونات التخزين. (ألفا ، غير مستقر!) @@ -64,7 +66,10 @@ أعد تشغيل التطبيق لتنشيط الوضع الداكن. مظهر التطبيق أعد تشغيل التطبيق لتفعيل التعديلات التي طرأت على المظهر. - + + الإنجليزية + الفرنسية + أحمر وردي بنفسجي From 92396200e2e531fce0811eb92cca25766b8675de Mon Sep 17 00:00:00 2001 From: lishoujun Date: Thu, 3 Jan 2019 01:12:17 +0800 Subject: [PATCH 03/12] I think torrentStream should be stoped when activity onDestroy. add some log to debug. handle nullpointer --- .../peertube/activity/VideoPlayActivity.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java index b8f0699..118f175 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java @@ -66,6 +66,7 @@ import net.schueller.peertube.fragment.VideoOptionsFragment; import net.schueller.peertube.helper.APIUrlHelper; import net.schueller.peertube.helper.MetaDataHelper; import net.schueller.peertube.intents.Intents; +import net.schueller.peertube.model.Account; import net.schueller.peertube.model.Avatar; import net.schueller.peertube.model.Video; import net.schueller.peertube.network.GetVideoDataService; @@ -89,7 +90,7 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere private Context context = this; private TextView fullscreenButton; private Boolean isFullscreen = false; - + private TorrentStream torrentStream; boolean mBound = false; VideoPlayerService mService; @@ -296,7 +297,16 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere String baseUrl = APIUrlHelper.getUrl(context); - Avatar avatar = video.getAccount().getAvatar(); + if(video == null){ + Toast.makeText(VideoPlayActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show(); + return; + } + Account account = video.getAccount(); + if(account == null){ + Toast.makeText(VideoPlayActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show(); + return; + } + Avatar avatar = account.getAvatar(); if (avatar != null) { String avatarPath = avatar.getPath(); Picasso.with(context) @@ -349,6 +359,7 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere videoOptionsFragment.show(getSupportFragmentManager(), "video_options_fragment"); }); + Log.v(TAG, "url : " + video.getFiles().get(0).getFileUrl()); mService.setCurrentStreamUrl(video.getFiles().get(0).getFileUrl()); @@ -357,11 +368,13 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere if (sharedPref.getBoolean("pref_torrent_player", false)) { String stream = video.getFiles().get(0).getTorrentUrl(); - TorrentStream torrentStream = setupTorrentStream(); + Log.v(TAG, "getTorrentUrl : " + video.getFiles().get(0).getTorrentUrl()); + torrentStream = setupTorrentStream(); torrentStream.startStream(stream); } else { startPlayer(); } + Log.v(TAG,"end of load Video"); } @@ -414,6 +427,10 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere protected void onDestroy() { super.onDestroy(); simpleExoPlayerView.setPlayer(null); + if (torrentStream != null){ + torrentStream.stopStream(); + } + Log.v(TAG, "onDestroy..."); } @Override From ba0db9c3db099b62c17ce7d5d2392de967b8d0d2 Mon Sep 17 00:00:00 2001 From: lishoujun Date: Thu, 3 Jan 2019 09:51:28 +0800 Subject: [PATCH 04/12] fix crash --- .../java/net/schueller/peertube/activity/VideoPlayActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java index 118f175..b747553 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java @@ -425,11 +425,11 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere @Override protected void onDestroy() { - super.onDestroy(); simpleExoPlayerView.setPlayer(null); if (torrentStream != null){ torrentStream.stopStream(); } + super.onDestroy(); Log.v(TAG, "onDestroy..."); } From 811134588a6dba898059acee7e8b7d3cb2d31521 Mon Sep 17 00:00:00 2001 From: lishoujun Date: Thu, 3 Jan 2019 22:40:24 +0800 Subject: [PATCH 05/12] translate zh. some string should not be translate add translatable false mark. --- app/src/main/res/values-zh-rCN/strings.xml | 8 ++++++++ app/src/main/res/values/strings.xml | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6b184a3..d1ba83b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -56,4 +56,12 @@ 灰色 蓝灰色 次观看 + 本地 + 帐号 + 按语言过滤 + 选择你使用的语言,不勾选时所有语言的视频都会显示 + 使用种子播放 + 视频通过一个种子下载,此选项需要存储权限(实验阶段,不稳定!) + 退出 + 中文 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 959ad98..ddc7190 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - PeerTube + PeerTube VideoPlayActivity Settings @@ -31,16 +31,16 @@ Account - 1.0.0-alpha.7 + 1.0.0-alpha.7 - https://troll.tv + https://troll.tv PeerTube Server - \u0020-\u0020 + \u0020-\u0020 \u0020Views - \@ + \@ Video Thumbnail @@ -61,7 +61,7 @@ No Results More Share - PeerTube + PeerTube Invalid Url! Dark Mode Restart App for Dark Mode to take effect. From a5cc3f29b20bc4c8386901e44da0394959fbdb8e Mon Sep 17 00:00:00 2001 From: lishoujun Date: Thu, 3 Jan 2019 23:41:39 +0800 Subject: [PATCH 06/12] change the super class to CommonActivity. Put common thing like NightMode or Apptheme in CommonActivity. So the business activity will be more clean. --- .../peertube/activity/CommonActivity.java | 32 +++++++++++++++++++ .../peertube/activity/VideoListActivity.java | 14 +------- 2 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/net/schueller/peertube/activity/CommonActivity.java diff --git a/app/src/main/java/net/schueller/peertube/activity/CommonActivity.java b/app/src/main/java/net/schueller/peertube/activity/CommonActivity.java new file mode 100644 index 0000000..6d01f9b --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/activity/CommonActivity.java @@ -0,0 +1,32 @@ +package net.schueller.peertube.activity; + +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; + +import static net.schueller.peertube.helper.Constants.DEFAULT_THEME; +import static net.schueller.peertube.helper.Constants.THEME_PREF_KEY; + +public class CommonActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Set Night Mode + SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); + AppCompatDelegate.setDefaultNightMode(sharedPref.getBoolean("pref_dark_mode", false) ? + AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO); + + // Set theme + setTheme(getResources().getIdentifier( + sharedPref.getString(THEME_PREF_KEY, DEFAULT_THEME), + "style", + getPackageName()) + ); + } + +} 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 df82443..641757d 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoListActivity.java @@ -71,7 +71,7 @@ import retrofit2.Response; import static net.schueller.peertube.helper.Constants.DEFAULT_THEME; import static net.schueller.peertube.helper.Constants.THEME_PREF_KEY; -public class VideoListActivity extends AppCompatActivity { +public class VideoListActivity extends CommonActivity { private String TAG = "VideoListActivity"; @@ -98,18 +98,6 @@ public class VideoListActivity extends AppCompatActivity { super.onCreate(savedInstanceState); - // Set Night Mode - SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); - AppCompatDelegate.setDefaultNightMode(sharedPref.getBoolean("pref_dark_mode", false) ? - AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO); - - // Set theme - setTheme(getResources().getIdentifier( - sharedPref.getString(THEME_PREF_KEY, DEFAULT_THEME), - "style", - getPackageName()) - ); - setContentView(R.layout.activity_video_list); filter = null; From c10c3c01a7e725ffc26876cb9e2262ed2ad88981 Mon Sep 17 00:00:00 2001 From: "ferhad.necef" <30929712+ferhadnecef@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:30:58 +0300 Subject: [PATCH 07/12] Updated ru (Russian) translation --- app/src/main/res/values-ru/strings.xml | 268 +++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 app/src/main/res/values-ru/strings.xml diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..eae63df --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,268 @@ + + + Настройки + Вход + + + Сервер + Почта + Пароль + Войти + Войти + Этот адрес электронной почты недействителен + Этот пароль слишком короткий + Неверный пароль + Это поле обязательно к заполнению + «Разрешения на контакты необходимы для предоставления электронных писем». + + + Поиск + Настройки + Выйти + + + Домашняя + Популярные + Подписки + Аккаунт + + + + Сервер PeerTube + + + + + + Миниатюра видео + Аватар + + Показ NSFW ( контекст сексуального характера) + Содержание NSFW ( контекст сексульного характера) будет показано, если включено. + Фильтр языков + Выберите языки видео, которые вы хотите видеть. Ни один из выбранных покажет все видео на всех языках. + Торрент видео плеер + Воспроизведение видео через торрент поток. Это требует разрешения на хранение. (Альфа, не стабильный!) + Лицензия + Универсальная общественная лицензия GNU Affero v3.0. Разрешения этой самой мощной лицензии с авторским левом обусловлены предоставлением полного исходного кода лицензированных произведений и модификаций, которые включают в себя более крупные произведения с использованием лицензированных произведений, по той же лицензии. Уведомления об авторских правах и лицензии должны быть сохранены. Авторы предоставляют явное предоставление патентных прав. Когда измененная версия используется для предоставления услуги по сети, должен быть доступен полный исходный код модифицированной версии. + Версия + Поиск PeerTube + Поиск + Нет результатов + Другое + Поделиться + Неверная ссылка! + Темный режим + Перезапустите приложение для того чтобы изменение вступило в силу. + Тема приложения + Перезапустите приложение, чтобы тема вступила в силу. + + Абхазия + Афар + Африканский + Акан + Албанский + Английский США + Амхарик + Арабский + Арагонский + Америкаский + Ассамский + Аварский + Аймара + Азербайджанский + Бамбара + Башкирский + Баскский + Беларусский + Бенгальский + Бислама + Боснийский + Бразильский язык ввода + Бретонский + Английский ВБ + Болгарский + Бирманский + Каталонский + Чаморро + Чешский + Китайский + Китайский язык ввода + Чувашский + Корнуоллский + Корсиканский + Cree + Хорватский + Чешия + Чешский язык ввода + Дания + Датский язык ввода + Мальдивский + Голландский + Dzongkha + Английский + Esperanto + Эстонский + Ewe + Фарерская + Fijian + Финский + Французский + Французский язык ввода + Fulah + Галицкая + Ганда + Грузинский + Германия + Немецкий язык ввода + Гуарани + Гуджарати + Гаитянский + Хауса + Иврит + Гереро + Хинди + Хири Моту + Венгерский + Исландский + Игбо + Индонезийский + Инуктитут + Инупиак + Ирландский + Итальянский + Японский + Японский язык знаков + Яванский + Гренландский + Каннада + Канури + Кашмирский + Казахский + Кхмерский + Кикуйю + Киньяруанда + Киргизский + Клингон + Коми + Конго + Корейский + Котава + Kuanyama + Курдский + Лао + Латышский + Лимбурган + Лингала + Литовский + Ложбан + Луба-Катанга + Люксембургский + Македонский + Малагасийский + Малайский (макроязык) + Мальтийский + Острова Мэн + Маори + Маратхи + Грецкий + Монгольский + Науру + Навахо + Непальский (макроязык) + Северный ндебеле + Северный саам + Норвежский + Норвежский букмол + Норвежский Нюнорск + Оджибва + Ория (макроязык) + Осетинский + Пакистанский язык знаков + Персидский + Польский + Португальский + Нажмите, чтобы + Кечуа + Румынский + Ретороманский диалект + Рунди + Русский + Русский язык знаков + Санго + Сардинский + Саудовская Аравия Арабский Язык знаков + Шотландский гэльский + Сербский + Сербско-хорватский + Сычуань Йи + Словацкий + Словенский + Сомалийский + Южноафриканский язык жестов + Южный Ндебеле + Южный Сото + Испанский + Суданский + Суахили (макроязык) + Свати + Шведский + Шведский язык жестов + Тагальский + Таитянский + Таджикский + Тамильский + Татарский + Телугу + Тайски + Тибетский + Тигринья + Тонга (Острова Тонга) + Тсонга + Турецкий + Туркменский + Уйгурский + Украинский + Урду + Узбекский + Вьетнамский + Валлонский + Валлийский + Западно-фризский + Идиш + Йоруба + Чжуан + + Красный + Розовый + Пурпурный + Темно-фиолетовый + Индиго + Синий + Светло-синий + Сиан + Зелёный + Светло-зеленый + Лайм + Желтый + Янтарный + Оранжевый + Темно-оранжевый + Коричневый + Серый + Серо-голубой + 0.5x + Нормальный + 1.5x + 2x + + + Фоновое воспроизведение + Если включено, продолжает воспроизводить видео в фоновом режиме. + Локаль + + Аккаунт + + + + From 875cb0fd5498f158e1088a06f54c0c4dfe80101e Mon Sep 17 00:00:00 2001 From: lishoujun Date: Fri, 4 Jan 2019 23:52:09 +0800 Subject: [PATCH 08/12] add log to debug #86 --- .../schueller/peertube/activity/VideoPlayActivity.java | 5 +++-- .../schueller/peertube/service/VideoPlayerService.java | 9 ++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java index b747553..9b2f471 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java @@ -183,8 +183,9 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere torrentStream.addListener(new TorrentListener() { @Override public void onStreamReady(Torrent torrent) { - Log.d(TAG, "Ready"); - mService.setCurrentStreamUrl(Uri.fromFile(torrent.getVideoFile()).toString()); + String videopath = Uri.fromFile(torrent.getVideoFile()).toString(); + Log.d(TAG, "Ready! torrentStream videopath:" + videopath); + mService.setCurrentStreamUrl(videopath); startPlayer(); } diff --git a/app/src/main/java/net/schueller/peertube/service/VideoPlayerService.java b/app/src/main/java/net/schueller/peertube/service/VideoPlayerService.java index bc62ddb..b477948 100644 --- a/app/src/main/java/net/schueller/peertube/service/VideoPlayerService.java +++ b/app/src/main/java/net/schueller/peertube/service/VideoPlayerService.java @@ -35,6 +35,7 @@ import androidx.annotation.Nullable; import android.support.v4.media.MediaDescriptionCompat; import android.support.v4.media.session.MediaSessionCompat; import android.util.Log; +import android.widget.Toast; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayerFactory; @@ -82,6 +83,8 @@ public class VideoPlayerService extends Service { @Override public void onCreate() { + Log.v(TAG, "onCreate..."); + super.onCreate(); player = ExoPlayerFactory.newSimpleInstance(getApplicationContext(), new DefaultTrackSelector()); @@ -136,7 +139,11 @@ public class VideoPlayerService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { + Context context = this; Log.v(TAG, "onStartCommand..."); + if(currentStreamUrl == null){ + Toast.makeText(context, "currentStreamUrl must not null", Toast.LENGTH_SHORT).show(); + } playVideo(); return START_STICKY; } @@ -150,7 +157,7 @@ public class VideoPlayerService extends Service { public void setCurrentStreamUrl(String streamUrl) { - Log.v(TAG, "setCurrentStreamUrl..."); + Log.v(TAG, "setCurrentStreamUrl..." + streamUrl); currentStreamUrl = streamUrl; } From 10f3daf60baf5bdd185b3506331e0d7ab99b63ab Mon Sep 17 00:00:00 2001 From: "ferhad.necef" <30929712+ferhadnecef@users.noreply.github.com> Date: Fri, 4 Jan 2019 17:30:58 +0300 Subject: [PATCH 09/12] Updated ru (Russian) translation --- app/src/main/res/values-ru/strings.xml | 268 +++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 app/src/main/res/values-ru/strings.xml diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..eae63df --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,268 @@ + + + Настройки + Вход + + + Сервер + Почта + Пароль + Войти + Войти + Этот адрес электронной почты недействителен + Этот пароль слишком короткий + Неверный пароль + Это поле обязательно к заполнению + «Разрешения на контакты необходимы для предоставления электронных писем». + + + Поиск + Настройки + Выйти + + + Домашняя + Популярные + Подписки + Аккаунт + + + + Сервер PeerTube + + + + + + Миниатюра видео + Аватар + + Показ NSFW ( контекст сексуального характера) + Содержание NSFW ( контекст сексульного характера) будет показано, если включено. + Фильтр языков + Выберите языки видео, которые вы хотите видеть. Ни один из выбранных покажет все видео на всех языках. + Торрент видео плеер + Воспроизведение видео через торрент поток. Это требует разрешения на хранение. (Альфа, не стабильный!) + Лицензия + Универсальная общественная лицензия GNU Affero v3.0. Разрешения этой самой мощной лицензии с авторским левом обусловлены предоставлением полного исходного кода лицензированных произведений и модификаций, которые включают в себя более крупные произведения с использованием лицензированных произведений, по той же лицензии. Уведомления об авторских правах и лицензии должны быть сохранены. Авторы предоставляют явное предоставление патентных прав. Когда измененная версия используется для предоставления услуги по сети, должен быть доступен полный исходный код модифицированной версии. + Версия + Поиск PeerTube + Поиск + Нет результатов + Другое + Поделиться + Неверная ссылка! + Темный режим + Перезапустите приложение для того чтобы изменение вступило в силу. + Тема приложения + Перезапустите приложение, чтобы тема вступила в силу. + + Абхазия + Афар + Африканский + Акан + Албанский + Английский США + Амхарик + Арабский + Арагонский + Америкаский + Ассамский + Аварский + Аймара + Азербайджанский + Бамбара + Башкирский + Баскский + Беларусский + Бенгальский + Бислама + Боснийский + Бразильский язык ввода + Бретонский + Английский ВБ + Болгарский + Бирманский + Каталонский + Чаморро + Чешский + Китайский + Китайский язык ввода + Чувашский + Корнуоллский + Корсиканский + Cree + Хорватский + Чешия + Чешский язык ввода + Дания + Датский язык ввода + Мальдивский + Голландский + Dzongkha + Английский + Esperanto + Эстонский + Ewe + Фарерская + Fijian + Финский + Французский + Французский язык ввода + Fulah + Галицкая + Ганда + Грузинский + Германия + Немецкий язык ввода + Гуарани + Гуджарати + Гаитянский + Хауса + Иврит + Гереро + Хинди + Хири Моту + Венгерский + Исландский + Игбо + Индонезийский + Инуктитут + Инупиак + Ирландский + Итальянский + Японский + Японский язык знаков + Яванский + Гренландский + Каннада + Канури + Кашмирский + Казахский + Кхмерский + Кикуйю + Киньяруанда + Киргизский + Клингон + Коми + Конго + Корейский + Котава + Kuanyama + Курдский + Лао + Латышский + Лимбурган + Лингала + Литовский + Ложбан + Луба-Катанга + Люксембургский + Македонский + Малагасийский + Малайский (макроязык) + Мальтийский + Острова Мэн + Маори + Маратхи + Грецкий + Монгольский + Науру + Навахо + Непальский (макроязык) + Северный ндебеле + Северный саам + Норвежский + Норвежский букмол + Норвежский Нюнорск + Оджибва + Ория (макроязык) + Осетинский + Пакистанский язык знаков + Персидский + Польский + Португальский + Нажмите, чтобы + Кечуа + Румынский + Ретороманский диалект + Рунди + Русский + Русский язык знаков + Санго + Сардинский + Саудовская Аравия Арабский Язык знаков + Шотландский гэльский + Сербский + Сербско-хорватский + Сычуань Йи + Словацкий + Словенский + Сомалийский + Южноафриканский язык жестов + Южный Ндебеле + Южный Сото + Испанский + Суданский + Суахили (макроязык) + Свати + Шведский + Шведский язык жестов + Тагальский + Таитянский + Таджикский + Тамильский + Татарский + Телугу + Тайски + Тибетский + Тигринья + Тонга (Острова Тонга) + Тсонга + Турецкий + Туркменский + Уйгурский + Украинский + Урду + Узбекский + Вьетнамский + Валлонский + Валлийский + Западно-фризский + Идиш + Йоруба + Чжуан + + Красный + Розовый + Пурпурный + Темно-фиолетовый + Индиго + Синий + Светло-синий + Сиан + Зелёный + Светло-зеленый + Лайм + Желтый + Янтарный + Оранжевый + Темно-оранжевый + Коричневый + Серый + Серо-голубой + 0.5x + Нормальный + 1.5x + 2x + + + Фоновое воспроизведение + Если включено, продолжает воспроизводить видео в фоновом режиме. + Локаль + + Аккаунт + + + + From f61eeb5eca52f16790c025c1008e05b52e062763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Schu=CC=88ller?= Date: Fri, 4 Jan 2019 23:19:10 +0100 Subject: [PATCH 10/12] - Moved video metadata into fragment --- .../peertube/activity/VideoPlayActivity.java | 72 +--- .../fragment/VideoMetaDataFragment.java | 240 +++++++++++ .../peertube/network/GetVideoDataService.java | 12 + .../main/res/layout/activity_video_play.xml | 83 +--- .../main/res/layout/fragment_video_meta.xml | 375 ++++++++++++++++++ app/src/main/res/menu/menu_video_more.xml | 9 + app/src/main/res/values/strings.xml | 28 +- 7 files changed, 670 insertions(+), 149 deletions(-) create mode 100644 app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java create mode 100644 app/src/main/res/layout/fragment_video_meta.xml create mode 100644 app/src/main/res/menu/menu_video_more.xml diff --git a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java index b747553..6fba30d 100644 --- a/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java +++ b/app/src/main/java/net/schueller/peertube/activity/VideoPlayActivity.java @@ -62,6 +62,7 @@ import com.google.android.exoplayer2.video.VideoRendererEventListener; import com.mikepenz.iconics.Iconics; import com.squareup.picasso.Picasso; import net.schueller.peertube.R; +import net.schueller.peertube.fragment.VideoMetaDataFragment; import net.schueller.peertube.fragment.VideoOptionsFragment; import net.schueller.peertube.helper.APIUrlHelper; import net.schueller.peertube.helper.MetaDataHelper; @@ -282,83 +283,22 @@ public class VideoPlayActivity extends AppCompatActivity implements VideoRendere // TODO: remove this code duplication, similar code as in video list rows - TextView videoName = findViewById(R.id.name); - TextView videoDescription = findViewById(R.id.description); - TextView videoOwner = findViewById(R.id.videoOwner); - TextView videoMeta = findViewById(R.id.videoMeta); - ImageView avatarView = findViewById(R.id.avatar); - TextView moreButton = findViewById(R.id.moreButton); - TextView videoOptions = findViewById(R.id.exo_more); - Video video = response.body(); mService.setCurrentVideo(video); - String baseUrl = APIUrlHelper.getUrl(context); - - if(video == null){ + if (video == null){ Toast.makeText(VideoPlayActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show(); return; } - Account account = video.getAccount(); - if(account == null){ - Toast.makeText(VideoPlayActivity.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show(); - return; - } - Avatar avatar = account.getAvatar(); - if (avatar != null) { - String avatarPath = avatar.getPath(); - Picasso.with(context) - .load(baseUrl + avatarPath) - .into(avatarView); - } - videoName.setText(video.getName()); - videoMeta.setText( - MetaDataHelper.getMetaString( - video.getCreatedAt(), - video.getViews(), - getBaseContext() - ) - ); - videoOwner.setText( - MetaDataHelper.getOwnerString(video.getAccount().getName(), - video.getAccount().getHost(), - context - ) - ); - videoDescription.setText(video.getDescription()); + VideoMetaDataFragment videoMetaDataFragment = (VideoMetaDataFragment) + getSupportFragmentManager().findFragmentById(R.id.video_meta_data_fragment); - moreButton.setText(R.string.video_more_icon); - new Iconics.IconicsBuilder().ctx(context).on(moreButton).build(); + assert videoMetaDataFragment != null; + videoMetaDataFragment.updateVideoMeta(video, mService); - moreButton.setOnClickListener(v -> { - PopupMenu popup = new PopupMenu(context, v); - popup.setOnMenuItemClickListener(menuItem -> { - switch (menuItem.getItemId()) { - case R.id.menu_share: - Intents.Share(context, video); - return true; - default: - return false; - } - }); - popup.inflate(R.menu.menu_video_row_mode); - popup.show(); - }); - - // video player options - videoOptions.setText(R.string.video_more_icon); - new Iconics.IconicsBuilder().ctx(context).on(videoOptions).build(); - - videoOptions.setOnClickListener(v -> { - - VideoOptionsFragment videoOptionsFragment = - VideoOptionsFragment.newInstance(mService); - videoOptionsFragment.show(getSupportFragmentManager(), - "video_options_fragment"); - }); Log.v(TAG, "url : " + video.getFiles().get(0).getFileUrl()); mService.setCurrentStreamUrl(video.getFiles().get(0).getFileUrl()); diff --git a/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java b/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java new file mode 100644 index 0000000..6184bcd --- /dev/null +++ b/app/src/main/java/net/schueller/peertube/fragment/VideoMetaDataFragment.java @@ -0,0 +1,240 @@ +package net.schueller.peertube.fragment; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.util.ArrayMap; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.mikepenz.fontawesome_typeface_library.FontAwesome; +import com.mikepenz.iconics.Iconics; +import com.mikepenz.iconics.IconicsDrawable; +import com.squareup.picasso.Picasso; + +import net.schueller.peertube.R; +import net.schueller.peertube.activity.VideoPlayActivity; +import net.schueller.peertube.helper.APIUrlHelper; +import net.schueller.peertube.helper.MetaDataHelper; +import net.schueller.peertube.intents.Intents; +import net.schueller.peertube.model.Account; +import net.schueller.peertube.model.Avatar; +import net.schueller.peertube.model.Video; +import net.schueller.peertube.network.GetVideoDataService; +import net.schueller.peertube.network.RetrofitInstance; +import net.schueller.peertube.network.Session; +import net.schueller.peertube.service.VideoPlayerService; + +import org.json.JSONObject; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.PopupMenu; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class VideoMetaDataFragment extends Fragment { + + private static final String TAG = "VideoMetaDataFragment"; + + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_video_meta, container, false); + } + + public void updateVideoMeta(Video video, VideoPlayerService mService) { + + Context context = getContext(); + Activity activity = getActivity(); + + + // Thumbs up + Button thumbsUpButton = activity.findViewById(R.id.video_thumbs_up); + thumbsUpButton.setText(R.string.video_thumbs_up_icon); + new Iconics.IconicsBuilder().ctx(context).on(thumbsUpButton).build(); + thumbsUpButton.setOnClickListener(v -> { + + if (Session.getInstance().isLoggedIn()) { + + RequestBody body = RequestBody.create( + okhttp3.MediaType.parse("application/json; charset=utf-8"), + "{rating: \"none\"}" + ); + + String apiBaseURL = APIUrlHelper.getUrlWithVersion(context); + GetVideoDataService service = RetrofitInstance.getRetrofitInstance(apiBaseURL).create(GetVideoDataService.class); + + Call call = service.rateVideo(video.getId(), body); + + call.enqueue(new Callback() { + + @Override + public void onResponse(Call call, Response response) { + + Log.v(TAG, response.toString() ); + + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(context, "Rating Failed", Toast.LENGTH_SHORT).show(); + } + }); + } else { + Toast.makeText(context, "You must login to use this service", Toast.LENGTH_SHORT).show(); + + } + + }); + + TextView thumbsUpButtonTotal = activity.findViewById(R.id.video_thumbs_up_total); + thumbsUpButtonTotal.setText(video.getLikes().toString()); + + // Thumbs Down + TextView thumbsDownButton = activity.findViewById(R.id.video_thumbs_down); + thumbsDownButton.setText(R.string.video_thumbs_down_icon); + new Iconics.IconicsBuilder().ctx(context).on(thumbsDownButton).build(); + thumbsDownButton.setOnClickListener(v -> Toast.makeText(context, "Not Implemented", Toast.LENGTH_SHORT).show()); + + TextView thumbsDownButtonTotal = activity.findViewById(R.id.video_thumbs_down_total); + thumbsDownButtonTotal.setText(video.getDislikes().toString()); + + // Share + TextView videoShareButton = activity.findViewById(R.id.video_share); + videoShareButton.setText(R.string.video_share_icon); + new Iconics.IconicsBuilder().ctx(context).on(videoShareButton).build(); + videoShareButton.setOnClickListener(v -> Intents.Share(context, video)); + + // Download + TextView videoDownloadButton = activity.findViewById(R.id.video_download); + videoDownloadButton.setText(R.string.video_download_icon); + new Iconics.IconicsBuilder().ctx(context).on(videoDownloadButton).build(); + videoDownloadButton.setOnClickListener(v -> Toast.makeText(context, "Not Implemented", Toast.LENGTH_SHORT).show()); + + // add to playlist + TextView videoSaveButton = activity.findViewById(R.id.video_save); + videoSaveButton.setText(R.string.video_save_icon); + new Iconics.IconicsBuilder().ctx(context).on(videoSaveButton).build(); + videoSaveButton.setOnClickListener(v -> Toast.makeText(context, "Not Implemented", Toast.LENGTH_SHORT).show()); + + + Account account = video.getAccount(); + + // owner / creator Avatar + Avatar avatar = account.getAvatar(); + if (avatar != null) { + ImageView avatarView = activity.findViewById(R.id.avatar); + String baseUrl = APIUrlHelper.getUrl(context); + String avatarPath = avatar.getPath(); + Picasso.with(context) + .load(baseUrl + avatarPath) + .into(avatarView); + } + + + // title / name + TextView videoName = activity.findViewById(R.id.name); + videoName.setText(video.getName()); + + // created at / views + TextView videoMeta = activity.findViewById(R.id.videoMeta); + videoMeta.setText( + MetaDataHelper.getMetaString( + video.getCreatedAt(), + video.getViews(), + context + ) + ); + + // owner / creator + TextView videoOwner = activity.findViewById(R.id.videoOwner); + videoOwner.setText( + MetaDataHelper.getOwnerString(video.getAccount().getName(), + video.getAccount().getHost(), + context + ) + ); + + // description + TextView videoDescription = activity.findViewById(R.id.description); + videoDescription.setText(video.getDescription()); + + + // video privacy + TextView videoPrivacy = activity.findViewById(R.id.video_privacy); + videoPrivacy.setText(video.getPrivacy().getLabel()); + + // video category + TextView videoCategory = activity.findViewById(R.id.video_category); + videoCategory.setText(video.getCategory().getLabel()); + + // video privacy + TextView videoLicense = activity.findViewById(R.id.video_license); + videoLicense.setText(video.getLicence().getLabel()); + + // video langauge + TextView videoLanguage = activity.findViewById(R.id.video_language); + videoLanguage.setText(video.getLanguage().getLabel()); + + // video privacy + TextView videoTags = activity.findViewById(R.id.video_tags); + videoTags.setText(android.text.TextUtils.join(", ", video.getTags())); + + + // more button + TextView moreButton = activity.findViewById(R.id.moreButton); + moreButton.setText(R.string.video_more_icon); + new Iconics.IconicsBuilder().ctx(context).on(moreButton).build(); + + moreButton.setOnClickListener(v -> { + PopupMenu popup = new PopupMenu(context, v); + popup.setOnMenuItemClickListener(menuItem -> { + switch (menuItem.getItemId()) { + case R.id.video_more_report: + Log.v(TAG, "Report" ); + Toast.makeText(context, "Not Implemented", Toast.LENGTH_SHORT).show(); + return true; + case R.id.video_more_blacklist: + Log.v(TAG, "Blacklist" ); + Toast.makeText(context, "Not Implemented", Toast.LENGTH_SHORT).show(); + return true; + default: + return false; + } + }); + popup.inflate(R.menu.menu_video_more); + popup.show(); + }); + + // video player options + TextView videoOptions = activity.findViewById(R.id.exo_more); + videoOptions.setText(R.string.video_more_icon); + new Iconics.IconicsBuilder().ctx(context).on(videoOptions).build(); + + videoOptions.setOnClickListener(v -> { + + VideoOptionsFragment videoOptionsFragment = + VideoOptionsFragment.newInstance(mService); + videoOptionsFragment.show(getActivity().getSupportFragmentManager(), + "video_options_fragment"); + }); + + } + +} diff --git a/app/src/main/java/net/schueller/peertube/network/GetVideoDataService.java b/app/src/main/java/net/schueller/peertube/network/GetVideoDataService.java index 2159070..e88afbc 100644 --- a/app/src/main/java/net/schueller/peertube/network/GetVideoDataService.java +++ b/app/src/main/java/net/schueller/peertube/network/GetVideoDataService.java @@ -22,8 +22,13 @@ import net.schueller.peertube.model.VideoList; import java.util.Set; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.Field; import retrofit2.http.GET; +import retrofit2.http.PUT; import retrofit2.http.Path; import retrofit2.http.Query; @@ -53,4 +58,11 @@ public interface GetVideoDataService { @Query("filter") String filter, @Query("languageOneOf") Set languages ); + + @PUT("videos/{id}/rate") + Call rateVideo( + @Path(value = "id", encoded = true) Integer id, + @Body RequestBody params + ); + } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_video_play.xml b/app/src/main/res/layout/activity_video_play.xml index 2a2d293..efd7e37 100644 --- a/app/src/main/res/layout/activity_video_play.xml +++ b/app/src/main/res/layout/activity_video_play.xml @@ -18,8 +18,8 @@ android:layout_width="match_parent" android:layout_height="250dp" android:background="@color/videoBackgroundColor" - app:resize_mode="fixed_width" app:controller_layout_id="@layout/video_playback_controls" + app:resize_mode="fixed_width" /> @@ -32,89 +32,26 @@ android:indeterminate="false" android:max="100" /> + - - - - - - - - - - - + android:layout_height="match_parent"> + + - diff --git a/app/src/main/res/layout/fragment_video_meta.xml b/app/src/main/res/layout/fragment_video_meta.xml new file mode 100644 index 0000000..6032ba7 --- /dev/null +++ b/app/src/main/res/layout/fragment_video_meta.xml @@ -0,0 +1,375 @@ + + + + + + + + + + + + + + + + + + + +