From dae14c33ff3eb684d7dc410431e22d6e954fb518 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 14 Jul 2022 23:56:18 +0800 Subject: [PATCH] Add play controller - part 1 --- .../com/fongmi/bear/impl/KeyDownImpl.java | 20 +++ .../java/com/fongmi/bear/player/Player.java | 19 ++- .../bear/ui/activity/DetailActivity.java | 7 +- .../fongmi/bear/ui/activity/PlayActivity.java | 77 ++++++++++- .../java/com/fongmi/bear/utils/KeyDown.java | 52 ++++++++ app/src/main/res/drawable/selector_site.xml | 6 - app/src/main/res/drawable/selector_text.xml | 6 + .../main/res/drawable/shape_controller.xml | 11 ++ ...activated.xml => shape_text_activated.xml} | 0 ...ite_focused.xml => shape_text_focused.xml} | 0 ..._site_normal.xml => shape_text_normal.xml} | 0 app/src/main/res/layout/activity_play.xml | 9 +- app/src/main/res/layout/adapter_site.xml | 2 +- app/src/main/res/layout/view_controller.xml | 124 ++++++++++++++++++ app/src/main/res/values/colors.xml | 11 ++ 15 files changed, 329 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java create mode 100644 app/src/main/java/com/fongmi/bear/utils/KeyDown.java delete mode 100644 app/src/main/res/drawable/selector_site.xml create mode 100644 app/src/main/res/drawable/selector_text.xml create mode 100644 app/src/main/res/drawable/shape_controller.xml rename app/src/main/res/drawable/{shape_site_activated.xml => shape_text_activated.xml} (100%) rename app/src/main/res/drawable/{shape_site_focused.xml => shape_text_focused.xml} (100%) rename app/src/main/res/drawable/{shape_site_normal.xml => shape_text_normal.xml} (100%) create mode 100644 app/src/main/res/layout/view_controller.xml diff --git a/app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java b/app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java new file mode 100644 index 000000000..7d4b2946f --- /dev/null +++ b/app/src/main/java/com/fongmi/bear/impl/KeyDownImpl.java @@ -0,0 +1,20 @@ +package com.fongmi.bear.impl; + +public interface KeyDownImpl { + + void onSeek(boolean forward); + + void onKeyVertical(boolean up); + + void onKeyLeft(); + + void onKeyRight(); + + void onKeyCenter(); + + void onKeyMenu(); + + void onKeyBack(); + + void onLongPress(); +} diff --git a/app/src/main/java/com/fongmi/bear/player/Player.java b/app/src/main/java/com/fongmi/bear/player/Player.java index ec24b5e9a..ba0a2177e 100644 --- a/app/src/main/java/com/fongmi/bear/player/Player.java +++ b/app/src/main/java/com/fongmi/bear/player/Player.java @@ -98,11 +98,24 @@ public class Player implements com.google.android.exoplayer2.Player.Listener { @Override public void onPlaybackStateChanged(int state) { - if (state != com.google.android.exoplayer2.Player.STATE_READY) return; - callback.onPrepared(); + switch (state) { + case com.google.android.exoplayer2.Player.STATE_BUFFERING: + callback.onBuffering(); + break; + case com.google.android.exoplayer2.Player.STATE_READY: + callback.onReady(); + break; + case com.google.android.exoplayer2.Player.STATE_ENDED: + break; + case com.google.android.exoplayer2.Player.STATE_IDLE: + break; + } } public interface Callback { - void onPrepared(); + + void onBuffering(); + + void onReady(); } } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java index 6719cefb6..192d8371e 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/DetailActivity.java @@ -168,7 +168,12 @@ public class DetailActivity extends BaseActivity implements Player.Callback { } @Override - public void onPrepared() { + public void onBuffering() { + mBinding.progress.getRoot().setVisibility(View.VISIBLE); + } + + @Override + public void onReady() { mBinding.progress.getRoot().setVisibility(View.GONE); } diff --git a/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java b/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java index fb7ed3112..9ea5e4ec5 100644 --- a/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java +++ b/app/src/main/java/com/fongmi/bear/ui/activity/PlayActivity.java @@ -2,15 +2,21 @@ package com.fongmi.bear.ui.activity; import android.app.Activity; import android.content.Intent; +import android.view.KeyEvent; +import android.view.View; import androidx.viewbinding.ViewBinding; import com.fongmi.bear.databinding.ActivityPlayBinding; +import com.fongmi.bear.impl.KeyDownImpl; import com.fongmi.bear.player.Player; +import com.fongmi.bear.utils.KeyDown; +import com.fongmi.bear.utils.Utils; -public class PlayActivity extends BaseActivity { +public class PlayActivity extends BaseActivity implements Player.Callback, KeyDownImpl { private ActivityPlayBinding mBinding; + private KeyDown mKeyDown; public static void newInstance(Activity activity) { activity.startActivityForResult(new Intent(activity, PlayActivity.class), 1000); @@ -23,10 +29,77 @@ public class PlayActivity extends BaseActivity { @Override protected void initView() { - mBinding.video.setPlayer(Player.get().exo()); + mKeyDown = KeyDown.create(this); + mBinding.video.setPlayer(Player.get().callback(this).exo()); } @Override protected void initEvent() { + + } + + @Override + public void onBuffering() { + mBinding.progress.getRoot().setVisibility(View.VISIBLE); + } + + @Override + public void onReady() { + mBinding.progress.getRoot().setVisibility(View.GONE); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (!mBinding.video.isControllerVisible() && Utils.hasEvent(event)) return mKeyDown.onKeyDown(event); + else return super.dispatchKeyEvent(event); + } + + @Override + public void onSeek(boolean forward) { + + } + + @Override + public void onKeyVertical(boolean up) { + + } + + @Override + public void onKeyLeft() { + + } + + @Override + public void onKeyRight() { + + } + + @Override + public void onKeyCenter() { + mBinding.video.showController(); + } + + @Override + public void onKeyMenu() { + + } + + @Override + public void onKeyBack() { + onBackPressed(); + } + + @Override + public void onLongPress() { + + } + + @Override + public void onBackPressed() { + if (mBinding.video.isControllerVisible()) { + mBinding.video.hideController(); + } else { + super.onBackPressed(); + } } } diff --git a/app/src/main/java/com/fongmi/bear/utils/KeyDown.java b/app/src/main/java/com/fongmi/bear/utils/KeyDown.java new file mode 100644 index 000000000..a8be317e3 --- /dev/null +++ b/app/src/main/java/com/fongmi/bear/utils/KeyDown.java @@ -0,0 +1,52 @@ +package com.fongmi.bear.utils; + +import android.view.KeyEvent; + +import com.fongmi.bear.impl.KeyDownImpl; + +public class KeyDown { + + private final KeyDownImpl mKeyDown; + private boolean mPress; + + public static KeyDown create(KeyDownImpl keyDown) { + return new KeyDown(keyDown); + } + + private KeyDown(KeyDownImpl keyDown) { + this.mKeyDown = keyDown; + } + + public boolean onKeyDown(KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) { + mKeyDown.onKeyVertical(true); + } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isDownKey(event)) { + mKeyDown.onKeyVertical(false); + } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isLeftKey(event)) { + mKeyDown.onSeek(false); + } else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isRightKey(event)) { + mKeyDown.onSeek(true); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isLeftKey(event)) { + mKeyDown.onKeyLeft(); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isRightKey(event)) { + mKeyDown.onKeyRight(); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isBackKey(event)) { + mKeyDown.onKeyBack(); + } else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isMenuKey(event)) { + mKeyDown.onKeyMenu(); + } else if (Utils.isEnterKey(event)) { + checkPress(event); + } + return true; + } + + private void checkPress(KeyEvent event) { + if (event.isLongPress()) { + mPress = true; + mKeyDown.onLongPress(); + } else if (event.getAction() == KeyEvent.ACTION_UP) { + if (mPress) mPress = false; + else mKeyDown.onKeyCenter(); + } + } +} diff --git a/app/src/main/res/drawable/selector_site.xml b/app/src/main/res/drawable/selector_site.xml deleted file mode 100644 index 5e208f9fc..000000000 --- a/app/src/main/res/drawable/selector_site.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_text.xml b/app/src/main/res/drawable/selector_text.xml new file mode 100644 index 000000000..c6934619f --- /dev/null +++ b/app/src/main/res/drawable/selector_text.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_controller.xml b/app/src/main/res/drawable/shape_controller.xml new file mode 100644 index 000000000..bec4cc94b --- /dev/null +++ b/app/src/main/res/drawable/shape_controller.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_site_activated.xml b/app/src/main/res/drawable/shape_text_activated.xml similarity index 100% rename from app/src/main/res/drawable/shape_site_activated.xml rename to app/src/main/res/drawable/shape_text_activated.xml diff --git a/app/src/main/res/drawable/shape_site_focused.xml b/app/src/main/res/drawable/shape_text_focused.xml similarity index 100% rename from app/src/main/res/drawable/shape_site_focused.xml rename to app/src/main/res/drawable/shape_text_focused.xml diff --git a/app/src/main/res/drawable/shape_site_normal.xml b/app/src/main/res/drawable/shape_text_normal.xml similarity index 100% rename from app/src/main/res/drawable/shape_site_normal.xml rename to app/src/main/res/drawable/shape_text_normal.xml diff --git a/app/src/main/res/layout/activity_play.xml b/app/src/main/res/layout/activity_play.xml index 98eaa71e0..2620e36d7 100644 --- a/app/src/main/res/layout/activity_play.xml +++ b/app/src/main/res/layout/activity_play.xml @@ -10,7 +10,12 @@ android:id="@+id/video" android:layout_width="match_parent" android:layout_height="match_parent" - app:resize_mode="fill" - app:use_controller="false" /> + app:controller_layout_id="@layout/view_controller" + app:resize_mode="fill" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_site.xml b/app/src/main/res/layout/adapter_site.xml index 818a51a44..66fa920a7 100644 --- a/app/src/main/res/layout/adapter_site.xml +++ b/app/src/main/res/layout/adapter_site.xml @@ -4,7 +4,7 @@ android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/selector_site" + android:background="@drawable/selector_text" android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" diff --git a/app/src/main/res/layout/view_controller.xml b/app/src/main/res/layout/view_controller.xml new file mode 100644 index 000000000..09f2dce8f --- /dev/null +++ b/app/src/main/res/layout/view_controller.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index ff19659ff..7474ccd1a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -7,6 +7,8 @@ #FFFFFF #2196F3 + #E0E0E0 + #9E9E9E #616161 #212121 #66BB6A @@ -19,5 +21,14 @@ #99000000 #B3000000 #CC000000 + #1AFFFFFF + #33FFFFFF + #4DFFFFFF + #66FFFFFF + #80FFFFFF + #99FFFFFF + #B3FFFFFF + #CCFFFFFF + #E6FFFFFF \ No newline at end of file