[mobile] support volume and brightness

pull/123/head
FongMi 3 years ago
parent 99d35b8a4d
commit 28d4b5c5b0
  1. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/KeepAdapter.java
  2. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java
  3. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/HistoryDialog.java
  4. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/LiveDialog.java
  5. 4
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SiteDialog.java
  6. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/HistoryPresenter.java
  7. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SearchPresenter.java
  8. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/presenter/VodPresenter.java
  9. 2
      app/src/main/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java
  10. 4
      app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java
  11. 53
      app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java
  12. 10
      app/src/mobile/java/com/fongmi/android/tv/Product.java
  13. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java
  14. 7
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  15. 119
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java
  16. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/HomeFragment.java
  17. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/child/TypeFragment.java

@ -31,7 +31,7 @@ public class KeepAdapter extends RecyclerView.Adapter<KeepAdapter.ViewHolder> {
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);
}

@ -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);

@ -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();

@ -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();

@ -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();

@ -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);
}

@ -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;
}

@ -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);
}

@ -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 {

@ -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();

@ -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) {

@ -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};

@ -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() {

@ -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();

@ -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();

@ -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() {

@ -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() {

Loading…
Cancel
Save