Merge branch 'fongmi' into release

pull/594/head
jhengazuki 6 months ago
commit f6a70eda27
  1. 4
      app/build.gradle
  2. 2
      app/src/main/java/com/fongmi/android/tv/bean/Collect.java
  3. 21
      app/src/main/java/com/fongmi/android/tv/model/SiteViewModel.java
  4. 26
      app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java
  5. 16
      app/src/mobile/java/com/fongmi/android/tv/Product.java
  6. 12
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/HistoryActivity.java
  7. 12
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/KeepActivity.java
  8. 44
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/CollectFragment.java
  9. 3
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SearchFragment.java
  10. 2
      app/src/mobile/res/layout/fragment_collect.xml

@ -11,8 +11,8 @@ android {
applicationId "com.fongmi.android.tv"
minSdk 24
targetSdk 36
versionCode 436
versionName "4.3.6"
versionCode 437
versionName "4.3.7"
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation": "$projectDir/schemas".toString(), "eventBusIndex": "com.fongmi.android.tv.event.EventIndex"]

@ -65,7 +65,7 @@ public class Collect implements Parcelable, Diffable<Collect> {
public boolean equals(@Nullable Object obj) {
if (this == obj) return true;
if (!(obj instanceof Collect it)) return false;
return getSite().equals(it.getSite()) && activated == it.activated;
return getSite().equals(it.getSite());
}
@Override

@ -49,11 +49,20 @@ public class SiteViewModel extends ViewModel {
private ExecutorService executor;
public SiteViewModel() {
this.episode = new MutableLiveData<>();
this.result = new MutableLiveData<>();
this.player = new MutableLiveData<>();
this.search = new MutableLiveData<>();
this.action = new MutableLiveData<>();
episode = new MutableLiveData<>();
result = new MutableLiveData<>();
player = new MutableLiveData<>();
search = new MutableLiveData<>();
action = new MutableLiveData<>();
}
public SiteViewModel init() {
search.setValue(null);
result.setValue(null);
player.setValue(null);
action.setValue(null);
episode.setValue(null);
return this;
}
public void setEpisode(Episode value) {
@ -271,7 +280,7 @@ public class SiteViewModel extends ViewModel {
private void post(Site site, Result result) {
if (result.getList().isEmpty()) return;
for (Vod vod : result.getList()) vod.setSite(site);
this.search.postValue(result);
search.postValue(result);
}
private void execute(MutableLiveData<Result> result, Callable<Result> callable) {

@ -34,20 +34,21 @@ public class ResUtil {
return context.getResources().getDisplayMetrics();
}
public static WindowManager getWindowManager(Context context) {
return (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
}
public static int getScreenWidth() {
return getScreenWidth(App.get());
}
public static int getScreenWidth(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Rect rect = getWindowManager(context).getCurrentWindowMetrics().getBounds();
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (windowManager == null) {
return getDisplayMetrics(context).widthPixels;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Rect rect = windowManager.getCurrentWindowMetrics().getBounds();
return isLand(context) ? Math.max(rect.width(), rect.height()) : Math.min(rect.width(), rect.height());
} else {
return getDisplayMetrics(context).widthPixels;
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.widthPixels;
}
}
@ -56,11 +57,16 @@ public class ResUtil {
}
public static int getScreenHeight(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Rect rect = getWindowManager(context).getCurrentWindowMetrics().getBounds();
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
if (windowManager == null) {
return getDisplayMetrics(context).heightPixels;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Rect rect = windowManager.getCurrentWindowMetrics().getBounds();
return isLand(context) ? Math.min(rect.width(), rect.height()) : Math.max(rect.width(), rect.height());
} else {
return getDisplayMetrics(context).heightPixels;
DisplayMetrics displayMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.heightPixels;
}
}

@ -1,6 +1,8 @@
package com.fongmi.android.tv;
import android.content.Context;
import android.os.Build;
import android.view.DisplayCutout;
import com.fongmi.android.tv.bean.Style;
import com.fongmi.android.tv.utils.ResUtil;
@ -27,14 +29,11 @@ public class Product {
public static int[] getSpec(Context context, Style style) {
int column = getColumn(context, style);
int space = ResUtil.dp2px(32) + ResUtil.dp2px(16 * (column - 1));
int space = ResUtil.dp2px(32) + ResUtil.dp2px(16 * (column - 1)) + getCutout(context);
if (style.isOval()) space += ResUtil.dp2px(column * 16);
return getSpec(context, space, column, style);
}
public static int[] getSpec(Context context, int space, int column) {
return getSpec(context, space, column, Style.rect());
}
private static int[] getSpec(Context context, int space, int column, Style style) {
int base = ResUtil.getScreenWidth(context) - space;
@ -42,4 +41,13 @@ public class Product {
int height = (int) (width / style.getRatio());
return new int[]{width, height};
}
private static int getCutout(Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) return 0;
DisplayCutout cutout = ResUtil.getDisplay(context).getCutout();
if (cutout == null) return 0;
int left = cutout.getSafeInsetLeft();
int right = cutout.getSafeInsetRight();
return left | right;
}
}

@ -39,6 +39,12 @@ public class HistoryActivity extends BaseActivity implements HistoryAdapter.OnCl
return mBinding = ActivityHistoryBinding.inflate(getLayoutInflater());
}
@Override
public void setSupportActionBar(@Nullable Toolbar toolbar) {
super.setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
protected void initView(Bundle savedInstanceState) {
setSupportActionBar(mBinding.toolbar);
@ -46,12 +52,6 @@ public class HistoryActivity extends BaseActivity implements HistoryAdapter.OnCl
getHistory();
}
@Override
public void setSupportActionBar(@Nullable Toolbar toolbar) {
super.setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
private void setRecyclerView() {
mBinding.recycler.setHasFixedSize(true);
mBinding.recycler.setLayoutManager(new GridLayoutManager(this, Product.getColumn(this)));

@ -43,6 +43,12 @@ public class KeepActivity extends BaseActivity implements KeepAdapter.OnClickLis
return mBinding = ActivityKeepBinding.inflate(getLayoutInflater());
}
@Override
public void setSupportActionBar(@Nullable Toolbar toolbar) {
super.setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
protected void initView(Bundle savedInstanceState) {
setSupportActionBar(mBinding.toolbar);
@ -50,12 +56,6 @@ public class KeepActivity extends BaseActivity implements KeepAdapter.OnClickLis
getKeep();
}
@Override
public void setSupportActionBar(@Nullable Toolbar toolbar) {
super.setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
private void setRecyclerView() {
mBinding.recycler.setHasFixedSize(true);
mBinding.recycler.setLayoutManager(new GridLayoutManager(this, Product.getColumn(this)));

@ -13,6 +13,7 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.MenuProvider;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.api.config.VodConfig;
@ -88,21 +89,13 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle
mBinding.recycler.setHasFixedSize(true);
mBinding.recycler.addOnScrollListener(mScroller);
mBinding.recycler.setAdapter(mSearchAdapter = new SearchAdapter(this));
((GridLayoutManager) (mBinding.recycler.getLayoutManager())).setSpanCount(getCount());
}
private void setViewModel() {
mViewModel = new ViewModelProvider(this).get(SiteViewModel.class);
mViewModel.search.observe(this, result -> {
if (mCollectAdapter.getPosition() == 0) mSearchAdapter.addItems(result.getList());
mCollectAdapter.addItem(Collect.create(result.getList()));
mCollectAdapter.add(result.getList());
});
mViewModel.result.observe(this, result -> {
boolean same = !result.getList().isEmpty() && mCollectAdapter.getActivated().getSite().equals(result.getList().get(0).getSite());
if (same) mCollectAdapter.getActivated().getList().addAll(result.getList());
if (same) mSearchAdapter.addItems(result.getList());
mScroller.endLoading(result);
});
mViewModel = new ViewModelProvider(this).get(SiteViewModel.class).init();
mViewModel.search.observe(this, this::setCollect);
mViewModel.result.observe(this, this::setSearch);
}
private List<Site> getSites() {
@ -112,9 +105,11 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle
}
private void search() {
if (mExecutor != null) mExecutor.shutdownNow();
mExecutor = new PauseExecutor(20);
mCollectAdapter.setItems(List.of(Collect.all()));
for (Site site : getSites()) mExecutor.execute(() -> search(site, getKeyword()));
mCollectAdapter.setItems(List.of(Collect.all()), () -> {
for (Site site : getSites()) mExecutor.execute(() -> search(site, getKeyword()));
});
}
private void search(Site site, String keyword) {
@ -124,6 +119,27 @@ public class CollectFragment extends BaseFragment implements MenuProvider, Colle
}
}
private int getCount() {
int count = ResUtil.isLand(requireActivity()) ? 2 : 1;
if (ResUtil.isPad()) count++;
return count;
}
private void setCollect(Result result) {
if (result == null) return;
if (mCollectAdapter.getPosition() == 0) mSearchAdapter.addItems(result.getList());
mCollectAdapter.addItem(Collect.create(result.getList()));
mCollectAdapter.add(result.getList());
}
private void setSearch(Result result) {
if (result == null) return;
boolean same = !result.getList().isEmpty() && mCollectAdapter.getActivated().getSite().equals(result.getList().get(0).getSite());
if (same) mCollectAdapter.getActivated().getList().addAll(result.getList());
if (same) mSearchAdapter.addItems(result.getList());
mScroller.endLoading(result);
}
@Override
public void onItemClick(int position, Collect item) {
mSearchAdapter.setItems(item.getList(), () -> mBinding.recycler.scrollToPosition(0));

@ -120,7 +120,8 @@ public class SearchFragment extends BaseFragment implements MenuProvider, WordAd
}
private void checkKeyword() {
if (TextUtils.isEmpty(getKeyword())) Util.showKeyboard(mBinding.keyword);
boolean visible = requireActivity().getSupportFragmentManager().findFragmentByTag(CollectFragment.class.getSimpleName()) != null;
if (TextUtils.isEmpty(getKeyword())) if (!visible) Util.showKeyboard(mBinding.keyword);
else setKeyword(getKeyword());
}

@ -44,7 +44,7 @@
android:paddingStart="0dp"
android:paddingEnd="8dp"
android:paddingBottom="8dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
tools:listitem="@layout/adapter_search" />
</androidx.appcompat.widget.LinearLayoutCompat>

Loading…
Cancel
Save