diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java index 6e73403e4..26186d927 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java @@ -31,7 +31,7 @@ public class KeepAdapter extends RecyclerView.Adapter { private void setLayoutSize() { int space = ResUtil.dp2px(48) + ResUtil.dp2px(16 * (Product.getColumn() - 1)); - int base = ResUtil.getScreenWidthPx() - space; + int base = ResUtil.getScreenWidth() - space; width = base / Product.getColumn(); height = (int) (width / 0.75f); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java index d2adfb98a..808fcd4a4 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java @@ -62,7 +62,7 @@ public class ConfigDialog implements DialogInterface.OnDismissListener { private void initDialog() { WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); - params.width = (int) (ResUtil.getScreenWidthPx() * 0.55f); + params.width = (int) (ResUtil.getScreenWidth() * 0.55f); dialog.getWindow().setAttributes(params); dialog.getWindow().setDimAmount(0); dialog.setOnDismissListener(this); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/HistoryDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/HistoryDialog.java index 12f79b47f..7b2258992 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/HistoryDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/HistoryDialog.java @@ -52,7 +52,7 @@ public class HistoryDialog implements ConfigAdapter.OnClickListener { private void setDialog() { if (adapter.getItemCount() == 0) return; WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); - params.width = (int) (ResUtil.getScreenWidthPx() * 0.4f); + params.width = (int) (ResUtil.getScreenWidth() * 0.4f); dialog.getWindow().setAttributes(params); dialog.getWindow().setDimAmount(0); dialog.show(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/LiveDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/LiveDialog.java index 2b772b517..93582f517 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/LiveDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/LiveDialog.java @@ -48,7 +48,7 @@ public class LiveDialog implements LiveAdapter.OnClickListener { private void setDialog() { if (adapter.getItemCount() == 0) return; WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); - params.width = (int) (ResUtil.getScreenWidthPx() * 0.4f); + params.width = (int) (ResUtil.getScreenWidth() * 0.4f); dialog.getWindow().setAttributes(params); dialog.getWindow().setDimAmount(0); dialog.show(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java index eba419e2a..2979843ad 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java @@ -71,8 +71,8 @@ public class SiteDialog implements SitePresenter.OnClickListener { private void setDialog() { if (adapter.size() == 0) return; WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); - params.width = (int) (ResUtil.getScreenWidthPx() * width); - params.height = (int) (ResUtil.getScreenHeightPx() * 0.745f); + params.width = (int) (ResUtil.getScreenWidth() * width); + params.height = (int) (ResUtil.getScreenHeight() * 0.745f); dialog.getWindow().setAttributes(params); dialog.getWindow().setDimAmount(0); dialog.show(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java index 555796c22..b7b37cad2 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java @@ -45,7 +45,7 @@ public class HistoryPresenter extends Presenter { private void setLayoutSize() { int space = ResUtil.dp2px(48) + ResUtil.dp2px(16 * (Product.getColumn() - 1)); - int base = ResUtil.getScreenWidthPx() - space; + int base = ResUtil.getScreenWidth() - space; width = base / Product.getColumn(); height = (int) (width / 0.75f); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SearchPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SearchPresenter.java index 62c9e903f..606f540c2 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SearchPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SearchPresenter.java @@ -22,7 +22,7 @@ public class SearchPresenter extends Presenter { private void setLayoutSize() { int space = ResUtil.dp2px(24) + ResUtil.dp2px(8 * 5); - int base = ResUtil.getScreenWidthPx() - space; + int base = ResUtil.getScreenWidth() - space; width = base / 5; } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java index fcba7e9e8..0bcac2fa7 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java @@ -31,7 +31,7 @@ public class VodPresenter extends Presenter { private void setLayoutSize() { int space = ResUtil.dp2px(48) + ResUtil.dp2px(16 * (Product.getColumn() - 1)); - int base = ResUtil.getScreenWidthPx() - space; + int base = ResUtil.getScreenWidth() - space; width = base / Product.getColumn(); height = (int) (width / 0.75f); } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java index 3043914bb..7044b97cb 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java @@ -114,7 +114,7 @@ public final class TrackDialog extends BaseDialog implements TrackAdapter.OnClic @Override public void onResume() { super.onResume(); - getDialog().getWindow().setLayout((int) (ResUtil.getScreenWidthPx() * 0.8f), -1); + getDialog().getWindow().setLayout((int) (ResUtil.getScreenWidth() * 0.8f), -1); } public interface Listener { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java index ecd12677d..52b6417d5 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java @@ -73,8 +73,8 @@ public class ImgUtil { } public static byte[] resize(byte[] bytes) { - int width = ResUtil.getScreenWidthPx(); - int height = ResUtil.getScreenHeightPx(); + int width = ResUtil.getScreenWidth(); + int height = ResUtil.getScreenHeight(); Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); if (bitmap.getWidth() < width && bitmap.getHeight() < height) return bytes; Matrix matrix = new Matrix(); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java index 721d83d61..de9c5e555 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java @@ -3,9 +3,18 @@ package com.fongmi.android.tv.utils; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.Point; import android.graphics.drawable.Drawable; +import android.os.Build; import android.util.DisplayMetrics; import android.util.TypedValue; +import android.view.Display; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.ViewConfiguration; +import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; @@ -23,18 +32,52 @@ public class ResUtil { return App.get().getResources().getDisplayMetrics(); } - public static int getScreenWidthPx(Context context) { - return context.getResources().getDisplayMetrics().widthPixels; + public static WindowManager getWindowManager(Context context) { + return (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); } - public static int getScreenWidthPx() { + public static boolean hasNavigationBar(Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + Display display = getWindowManager(context).getDefaultDisplay(); + Point size = new Point(); + Point realSize = new Point(); + display.getSize(size); + display.getRealSize(realSize); + return realSize.x != size.x || realSize.y != size.y; + } else { + boolean menu = ViewConfiguration.get(context).hasPermanentMenuKey(); + boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); + return !(menu || back); + } + } + + public static int getNavigationBarHeight(Context context) { + if (!hasNavigationBar(context)) return 0; + Resources resources = context.getResources(); + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + return resources.getDimensionPixelSize(resourceId); + } + + public static int getScreenWidth() { return getDisplayMetrics().widthPixels; } - public static int getScreenHeightPx() { + public static int getScreenWidthNav() { + return getDisplayMetrics().widthPixels + getNavigationBarHeight(App.get()); + } + + public static int getScreenHeight() { return getDisplayMetrics().heightPixels; } + public static int getScreenHeightNav() { + return getDisplayMetrics().heightPixels + getNavigationBarHeight(App.get()); + } + + public static boolean isEdge(MotionEvent e, int edge) { + return e.getRawX() < edge || e.getRawX() > getScreenWidthNav() - edge || e.getRawY() < edge || e.getRawY() > getScreenHeightNav() - edge; + } + public static boolean isLand(Activity activity) { return activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; } @@ -44,7 +87,7 @@ public class ResUtil { } public static int getEms() { - return Math.min(getScreenWidthPx() / sp2px(24), 35); + return Math.min(getScreenWidth() / sp2px(24), 35); } public static int sp2px(int sp) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/Product.java b/app/src/mobile/java/com/fongmi/android/tv/Product.java index dcd352122..670e21536 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/Product.java +++ b/app/src/mobile/java/com/fongmi/android/tv/Product.java @@ -1,7 +1,5 @@ package com.fongmi.android.tv; -import android.content.Context; - import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; @@ -14,12 +12,12 @@ public class Product { public static void bootLive() { } - public static int[] getSpec(Context context) { - return getSpec(context, ResUtil.dp2px(32) + ResUtil.dp2px(16 * (getColumn() - 1)), getColumn()); + public static int[] getSpec() { + return getSpec(ResUtil.dp2px(32) + ResUtil.dp2px(16 * (getColumn() - 1)), getColumn()); } - public static int[] getSpec(Context context, int space, int column) { - int base = ResUtil.getScreenWidthPx(context) - space; + public static int[] getSpec(int space, int column) { + int base = ResUtil.getScreenWidth() - space; int width = base / column; int height = (int) (width / 0.75f); return new int[]{width, height}; diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java index e64c9bd6c..cc0f13398 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java @@ -127,7 +127,7 @@ public class CollectActivity extends BaseActivity implements SiteCallback, WordA mBinding.recordRecycler.setHasFixedSize(true); mBinding.recordRecycler.setLayoutManager(new GridLayoutManager(this, 2)); mBinding.recordRecycler.setAdapter(mRecordAdapter = new RecordAdapter(this)); - mVodAdapter.setSize(Product.getSpec(getActivity(), ResUtil.dp2px(64), 3)); + mVodAdapter.setSize(Product.getSpec(ResUtil.dp2px(64), 3)); } private void setLayoutSize() { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index f17117a97..0f3186309 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -188,7 +188,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override protected void initView(Bundle savedInstanceState) { - mKeyDown = CustomKeyDownVod.create(this); + mKeyDown = CustomKeyDownVod.create(this, mBinding.video); mFrameParams = mBinding.video.getLayoutParams(); mPlayers = new Players().init(); mR1 = this::hideControl; @@ -437,6 +437,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void onLock() { setLock(!isLock()); setRequestedOrientation(getLockOrient()); + mKeyDown.setLock(isLock()); checkLockImg(); showControl(); } @@ -989,7 +990,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override public void onSpeedUp() { - if (isLock()) return; mPlayers.setSpeed(3.0f); showState(R.drawable.ic_widget_forward); showTime(); @@ -997,7 +997,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override public void onSpeedReset() { - if (isLock()) return; mPlayers.setSpeed(1.0f); App.removeCallbacks(mR4); hideState(); @@ -1005,14 +1004,12 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override public void onSeeking(int time) { - if (isLock()) return; showState(time > 0 ? R.drawable.ic_widget_forward : R.drawable.ic_widget_rewind, time); hideProgress(); } @Override public void onSeekTo(int time) { - if (isLock()) return; mPlayers.seekTo(time); showProgress(); onPlay(); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java index 115215b2c..ffe130234 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java @@ -1,8 +1,11 @@ package com.fongmi.android.tv.ui.custom; import android.content.Context; +import android.media.AudioManager; import android.view.GestureDetector; import android.view.MotionEvent; +import android.view.View; +import android.view.WindowManager; import androidx.annotation.NonNull; @@ -13,58 +16,78 @@ import com.fongmi.android.tv.utils.ResUtil; public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener { private final GestureDetector detector; + private final AudioManager manager; private final Listener listener; - private Runnable runnable; + private final Runnable runnable; + private final View videoView; + private boolean changeBright; + private boolean changeVolume; + private boolean changeSpeed; + private boolean changeTime; private boolean touch; - private boolean speed; - private boolean seek; + private boolean lock; + private float bright; + private float volume; private int time; - public static CustomKeyDownVod create(Context context) { - return new CustomKeyDownVod(context); + public static CustomKeyDownVod create(Context context, View videoView) { + return new CustomKeyDownVod(context, videoView); } - private CustomKeyDownVod(Context context) { - this.listener = (Listener) context; + private CustomKeyDownVod(Context context, View videoView) { + this.manager = (AudioManager) App.get().getSystemService(Context.AUDIO_SERVICE); this.detector = new GestureDetector(context, this); + this.listener = (Listener) context; + this.runnable = this::subTime; + this.videoView = videoView; } public boolean onTouchEvent(MotionEvent e) { - if (seek && e.getAction() == MotionEvent.ACTION_UP) seekTo(); - if (speed && e.getAction() == MotionEvent.ACTION_UP) listener.onSpeedReset(); + if (changeTime && e.getAction() == MotionEvent.ACTION_UP) seekTo(); + if (changeSpeed && e.getAction() == MotionEvent.ACTION_UP) listener.onSpeedReset(); return detector.onTouchEvent(e); } + public void setLock(boolean lock) { + this.lock = lock; + } + + private boolean isEdge(MotionEvent e) { + return ResUtil.isEdge(e, ResUtil.dp2px(40)); + } + @Override public boolean onDown(@NonNull MotionEvent e) { - int width = ResUtil.getScreenWidthPx(); - float downX = e.getX() > width ? width : e.getX(); - float edgeX = Math.abs(downX - width); - touch = e.getX() > 100 && edgeX > 0; - speed = false; - seek = false; + if (isEdge(e) || lock) return true; + volume = manager.getStreamVolume(AudioManager.STREAM_MUSIC); + bright = App.activity().getWindow().getAttributes().screenBrightness; + changeBright = false; + changeVolume = false; + changeSpeed = false; + changeTime = false; + touch = true; return true; } @Override public void onLongPress(@NonNull MotionEvent e) { - int base = ResUtil.getScreenWidthPx() / 3; - seek = e.getX() > 0 && e.getX() < base; - speed = e.getX() > base * 2 && e.getX() < base * 3; - if (seek) App.post(runnable = this::subTime, 0); - if (speed) listener.onSpeedUp(); + if (isEdge(e) || lock) return; + int base = ResUtil.getScreenWidthNav() / 3; + changeTime = e.getX() > 0 && e.getX() < base; + changeSpeed = e.getX() > base * 2 && e.getX() < base * 3; + if (changeTime) App.post(runnable, 0); + if (changeSpeed) listener.onSpeedUp(); } @Override public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) { - int deltaX = (int) (e2.getX() - e1.getX()); - if (touch) { - seek = Math.abs(distanceX) >= Math.abs(distanceY); - touch = false; - } - if (seek) { - listener.onSeeking(time = deltaX * 50); - } + if (isEdge(e1) || lock) return true; + float deltaX = e2.getX() - e1.getX(); + float deltaY = e1.getY() - e2.getY(); + if (touch) checkFunc(distanceX, distanceY, e2); + if (changeTime) listener.onSeeking(time = (int) deltaX * 50); + if (changeBright) setBright(deltaY); + if (changeVolume) setVolume(deltaY); return true; } @@ -95,10 +118,48 @@ public class CustomKeyDownVod extends GestureDetector.SimpleOnGestureListener { private void seekTo() { App.removeCallbacks(runnable); listener.onSeekTo(time); - seek = false; + changeTime = false; time = 0; } + private void checkFunc(float distanceX, float distanceY, MotionEvent e2) { + changeTime = Math.abs(distanceX) >= Math.abs(distanceY); + if (!changeTime) checkSide(e2); + touch = false; + } + + private void checkSide(MotionEvent e2) { + int half = ResUtil.getScreenWidthNav() / 2; + if (e2.getX() > half) { + changeVolume = true; + } else { + changeBright = true; + } + } + + private void setBright(float deltaY) { + int height = videoView.getMeasuredHeight(); + if (bright == -1.0f) bright = 0.5f; + float brightness = deltaY * 2 / height + bright; + if (brightness < 0) brightness = 0f; + if (brightness > 1.0f) brightness = 1.0f; + WindowManager.LayoutParams attributes = App.activity().getWindow().getAttributes(); + attributes.screenBrightness = brightness; + App.activity().getWindow().setAttributes(attributes); + int percent = (int) (brightness * 100); + } + + private void setVolume(float deltaY) { + int height = videoView.getMeasuredHeight(); + int maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); + float deltaV = deltaY * 2 / height * maxVolume; + float index = volume + deltaV; + if (index > maxVolume) index = maxVolume; + if (index < 0) index = 0; + manager.setStreamVolume(AudioManager.STREAM_MUSIC, (int) index, 0); + int percent = (int) (index / maxVolume * 100); + } + public interface Listener { void onSpeedUp(); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java index a8b70fefc..e80c8449d 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java @@ -78,8 +78,8 @@ public class HomeFragment extends BaseFragment implements VodAdapter.OnClickList mBinding.recommend.setHasFixedSize(true); mBinding.recommend.setLayoutManager(new GridLayoutManager(getContext(), Product.getColumn())); mBinding.recommend.setAdapter(mVodAdapter = new VodAdapter(this)); - mHistoryAdapter.setSize(Product.getSpec(getActivity())); - mVodAdapter.setSize(Product.getSpec(getActivity())); + mHistoryAdapter.setSize(Product.getSpec()); + mVodAdapter.setSize(Product.getSpec()); } private void setViewModel() { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java index 2990c3932..bc8ffab4f 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java @@ -93,7 +93,7 @@ public class TypeFragment extends BaseFragment implements CustomScroller.Callbac mBinding.recycler.setHasFixedSize(true); mBinding.recycler.setAdapter(mVodAdapter = new VodAdapter(this)); mBinding.recycler.setLayoutManager(new GridLayoutManager(getContext(), Product.getColumn())); - mVodAdapter.setSize(Product.getSpec(getActivity())); + mVodAdapter.setSize(Product.getSpec()); } private void setViewModel() {