diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 6db677ca6..f17d3a73e 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.view.KeyEvent; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -263,7 +264,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void setWidth(Live live) { int padding = ResUtil.dp2px(48); if (live.getWidth() == 0) for (Group item : live.getGroups()) live.setWidth(Math.max(live.getWidth(), ResUtil.getTextWidth(item.getName(), 16))); - mBinding.group.getLayoutParams().width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4); + int width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4); + setWidth(mBinding.group, width); } private Group setWidth(Group group) { @@ -271,8 +273,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick int padding = ResUtil.dp2px(60); if (group.isKeep()) group.setWidth(0); if (group.getWidth() == 0) for (Channel item : group.getChannel()) group.setWidth(Math.max(group.getWidth(), (item.getLogo().isEmpty() ? 0 : logo) + ResUtil.getTextWidth(item.getNumber() + item.getName(), 16))); - mBinding.channel.post(() -> mBinding.channel.getLayoutParams().width = group.getWidth() == 0 ? 0 : Math.min(group.getWidth() + padding, ResUtil.getScreenWidth() / 2)); - mBinding.channel.post(() -> mBinding.channel.requestLayout()); + int width = group.getWidth() == 0 ? 0 : Math.min(group.getWidth() + padding, ResUtil.getScreenWidth() / 2); + setWidth(mBinding.channel, width); return group; } @@ -281,7 +283,17 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick if (epg.getList().isEmpty()) return; int minWidth = ResUtil.getTextWidth(epg.getList().get(0).getTime(), 16); if (epg.getWidth() == 0) for (EpgData item : epg.getList()) epg.setWidth(Math.max(epg.getWidth(), ResUtil.getTextWidth(item.getTitle(), 16))); - mBinding.epgData.getLayoutParams().width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2); + int width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2); + setWidth(mBinding.epgData, width); + } + + private void setWidth(View view, int width) { + view.post(() -> { + ViewGroup.LayoutParams params = view.getLayoutParams(); + if (params.width == width) return; + params.width = width; + view.setLayoutParams(params); + }); } private void setPosition(int[] position) { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java index cf3c02ee6..f3a619a54 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SearchActivity.java @@ -74,6 +74,7 @@ public class SearchActivity extends BaseActivity implements WordAdapter.OnClickL else getSuggest(s.toString()); } }); + mBinding.mic.setOnClickListener(v -> mBinding.mic.start()); mBinding.mic.setListener(this, new CustomTextListener() { @Override public void onEndOfSpeech() { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java index 901fc5af2..eb21d6b93 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java @@ -75,7 +75,7 @@ public abstract class BaseActivity extends AppCompatActivity { } protected void notifyItemChanged(RecyclerView view, ArrayObjectAdapter adapter) { - if (!view.isComputingLayout()) adapter.notifyArrayItemRangeChanged(0, adapter.size()); + view.post(() -> adapter.notifyArrayItemRangeChanged(0, adapter.size())); } private void setBackCallback() { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java index 3e584f44b..adb97ddac 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomMic.java @@ -57,10 +57,12 @@ public class CustomMic extends AppCompatImageView { } } - private void start() { - startListening(); - requestFocus(); - updateUI(true); + public void start() { + PermissionUtil.requestAudio(activity, allGranted -> { + startListening(); + requestFocus(); + updateUI(true); + }); } public boolean stop() { @@ -84,10 +86,8 @@ public class CustomMic extends AppCompatImageView { @Override protected void onFocusChanged(boolean gainFocus, int direction, @Nullable Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); - if (!gainFocus) stop(); - else PermissionUtil.requestAudio(activity, allGranted -> { - if (allGranted) start(); - }); + if (gainFocus) start(); + else stop(); } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 3e7652b50..44616f230 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -9,6 +9,7 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -16,6 +17,7 @@ import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.media3.common.C; import androidx.media3.common.Player; +import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; import com.bumptech.glide.request.transition.Transition; @@ -270,7 +272,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener private void setWidth(Live live) { int padding = ResUtil.dp2px(48); if (live.getWidth() == 0) for (Group item : live.getGroups()) live.setWidth(Math.max(live.getWidth(), ResUtil.getTextWidth(item.getName(), 14))); - mBinding.group.getLayoutParams().width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4); + int width = live.getWidth() == 0 ? 0 : Math.min(live.getWidth() + padding, ResUtil.getScreenWidth() / 4); + setWidth(mBinding.group, width); } @Override @@ -279,7 +282,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener int padding = ResUtil.dp2px(60); if (group.isKeep()) group.setWidth(0); if (group.getWidth() == 0) for (Channel item : group.getChannel()) group.setWidth(Math.max(group.getWidth(), (item.getLogo().isEmpty() ? 0 : logo) + ResUtil.getTextWidth(item.getNumber() + item.getName(), 14))); - mBinding.channel.getLayoutParams().width = group.getWidth() == 0 ? 0 : Math.min(group.getWidth() + padding, ResUtil.getScreenWidth() / 2); + int width = group.getWidth() == 0 ? 0 : Math.min(group.getWidth() + padding, ResUtil.getScreenWidth() / 2); + setWidth(mBinding.channel, width); } private void setWidth(Epg epg) { @@ -287,7 +291,15 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener if (epg.getList().isEmpty()) return; int minWidth = ResUtil.getTextWidth(epg.getList().get(0).getTime(), 14); if (epg.getWidth() == 0) for (EpgData item : epg.getList()) epg.setWidth(Math.max(epg.getWidth(), ResUtil.getTextWidth(item.getTitle(), 14))); - mBinding.epgData.getLayoutParams().width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2); + int width = epg.getWidth() == 0 ? 0 : Math.min(Math.max(epg.getWidth(), minWidth) + padding, ResUtil.getScreenWidth() / 2); + setWidth(mBinding.epgData, width); + } + + private void setWidth(View view, int width) { + ViewGroup.LayoutParams params = view.getLayoutParams(); + if (params.width == width) return; + params.width = width; + view.setLayoutParams(params); } private void setPosition(int[] position) { @@ -308,8 +320,8 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener if (change) mGroupAdapter.setSelected(position); if (change) mChannelAdapter.addAll(mGroup.getChannel()); if (change) mChannelAdapter.setSelected(mGroup.getPosition()); - mBinding.channel.scrollToPosition(mGroup.getPosition()); - mBinding.group.scrollToPosition(position); + scrollToPosition(mBinding.channel, mGroup.getPosition()); + scrollToPosition(mBinding.group, position); } private void onBack() { @@ -431,7 +443,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener private void showEpg(Channel item) { if (mChannel == null || mChannel.getData().getList().isEmpty() || mEpgDataAdapter.getItemCount() == 0 || !mChannel.equals(item) || !mChannel.getGroup().equals(mGroup)) return; - mBinding.epgData.scrollToPosition(item.getData().getSelected()); + scrollToPosition(mBinding.epgData, item.getData().getSelected()); mBinding.epgData.setVisibility(View.VISIBLE); mBinding.channel.setVisibility(View.GONE); mBinding.group.setVisibility(View.GONE); @@ -544,7 +556,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener mGroupAdapter.setSelected(mGroup = item); mChannelAdapter.addAll(item.getChannel()); mChannelAdapter.setSelected(item.getPosition()); - mBinding.channel.scrollToPosition(Math.max(item.getPosition(), 0)); + scrollToPosition(mBinding.channel, Math.max(item.getPosition(), 0)); if (!item.isKeep() || ++count < 5 || mHides.isEmpty()) return; if (Biometric.enable()) Biometric.show(this); else PassDialog.create().show(this); @@ -925,6 +937,10 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener this.lock = lock; } + private void scrollToPosition(RecyclerView view, int position) { + view.post(() -> view.scrollToPosition(position)); + } + @Override public void onCasted() { } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java index 9bf5d72fb..87a739ea1 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/VideoActivity.java @@ -556,7 +556,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo public void onItemClick(Flag item) { if (item.isActivated()) return; mFlagAdapter.setActivated(item); - mBinding.flag.scrollToPosition(mFlagAdapter.getPosition()); + scrollToPosition(mBinding.flag, mFlagAdapter.getPosition()); setEpisodeAdapter(item.getEpisodes()); setQualityVisible(false); seamless(item); @@ -566,8 +566,8 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo public void onItemClick(Episode item) { if (shouldEnterFullscreen(item)) return; mFlagAdapter.toggle(item); - notifyItemChanged(mEpisodeAdapter); - mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition()); + notifyItemChanged(mBinding.episode, mEpisodeAdapter); + scrollToPosition(mBinding.episode, mEpisodeAdapter.getPosition()); if (isFullscreen()) Notify.show(getString(R.string.play_ready, item.getName())); onRefresh(); } @@ -596,7 +596,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void setParse(Parse item) { VodConfig.get().setParse(item); - notifyItemChanged(mParseAdapter); + notifyItemChanged(mBinding.control.parse, mParseAdapter); if (mControlDialog != null && mControlDialog.isVisible()) mControlDialog.updateParse(); } @@ -626,7 +626,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void reverseEpisode(boolean scroll) { mFlagAdapter.reverse(); setEpisodeAdapter(getFlag().getEpisodes()); - if (scroll) mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition()); + if (scroll) scrollToPosition(mBinding.episode, mEpisodeAdapter.getPosition()); } private void onName() { @@ -874,7 +874,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo private void enterFullscreen() { if (isFullscreen()) return; if (isLand()) setTransition(); - mBinding.video.postDelayed(() -> mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)), 50); + mBinding.video.postDelayed(() -> mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)), 100); setRequestedOrientation(mPlayers.isPortrait() ? ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); mBinding.control.title.setVisibility(View.VISIBLE); setRotate(mPlayers.isPortrait(), true); @@ -888,7 +888,7 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo if (!isFullscreen()) return; if (isLand()) setTransition(); setRequestedOrientation(isPort() ? ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT : ActivityInfo.SCREEN_ORIENTATION_FULL_USER); - mBinding.episode.postDelayed(() -> mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition()), 50); + mBinding.episode.postDelayed(() -> mBinding.episode.scrollToPosition(mEpisodeAdapter.getPosition()), 100); mBinding.control.title.setVisibility(View.INVISIBLE); mBinding.video.setLayoutParams(mFrameParams); mPlayers.setDanmakuSize(0.8f); @@ -1460,8 +1460,12 @@ public class VideoActivity extends BaseActivity implements Clock.Callback, Custo this.lock = lock; } - private void notifyItemChanged(RecyclerView.Adapter adapter) { - adapter.notifyItemRangeChanged(0, adapter.getItemCount()); + private void notifyItemChanged(RecyclerView view, RecyclerView.Adapter adapter) { + view.post(() -> adapter.notifyItemRangeChanged(0, adapter.getItemCount())); + } + + private void scrollToPosition(RecyclerView view, int position) { + view.post(() -> view.scrollToPosition(position)); } @Override