Support material you

fongmi
FongMi 5 days ago
parent 40324d49f4
commit 23727ffc2a
  1. 0
      app/src/leanback/res/color/text.xml
  2. 2
      app/src/leanback/res/values/styles.xml
  3. 2
      app/src/main/java/com/fongmi/android/tv/App.java
  4. 8
      app/src/main/java/com/fongmi/android/tv/setting/Setting.java
  5. 6
      app/src/main/java/com/fongmi/android/tv/utils/Util.java
  6. 3
      app/src/main/res/values-zh-rCN/strings.xml
  7. 3
      app/src/main/res/values-zh-rTW/strings.xml
  8. 3
      app/src/main/res/values/strings.xml
  9. 14
      app/src/mobile/AndroidManifest.xml
  10. 70
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/ThemeAdapter.java
  11. 10
      app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseActivity.java
  12. 47
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/ThemeDialog.java
  13. 7
      app/src/mobile/res/color-night-v31/text.xml
  14. 7
      app/src/mobile/res/color-v31/text.xml
  15. 2
      app/src/mobile/res/color/nav.xml
  16. 7
      app/src/mobile/res/color/text.xml
  17. 13
      app/src/mobile/res/drawable-v31/shape_vod_remark.xml
  18. 10
      app/src/mobile/res/drawable/ic_action_check.xml
  19. 20
      app/src/mobile/res/layout/adapter_theme.xml
  20. 11
      app/src/mobile/res/layout/dialog_theme.xml
  21. 27
      app/src/mobile/res/layout/fragment_setting.xml
  22. 3
      app/src/mobile/res/layout/fragment_vod.xml
  23. 5
      app/src/mobile/res/values-v31/styles.xml
  24. 7
      app/src/mobile/res/values/styles.xml
  25. 4
      gradle/libs.versions.toml

@ -1,9 +1,7 @@
<resources>
<style name="Theme.Base" parent="Theme.Material3.Dark.NoActionBar">
<item name="colorAccent">@color/white</item>
<item name="colorPrimary">@color/white</item>
<item name="colorPrimaryDark">@color/white</item>
<item name="colorOnSurface">@color/white</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowTranslucentStatus">true</item>

@ -15,7 +15,6 @@ import androidx.core.os.HandlerCompat;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.hook.Hook;
import com.github.catvod.Init;
import com.google.android.material.color.DynamicColors;
import com.google.gson.Gson;
public class App extends Application implements Application.ActivityLifecycleCallbacks {
@ -84,7 +83,6 @@ public class App extends Application implements Application.ActivityLifecycleCal
super.onCreate();
Notify.createChannel();
registerActivityLifecycleCallbacks(this);
DynamicColors.applyToActivitiesIfAvailable(this);
}
@Override

@ -107,4 +107,12 @@ public class Setting {
public static void putZhuyin(boolean zhuyin) {
Prefers.put("zhuyin", zhuyin);
}
public static int getThemeColor() {
return Prefers.getInt("theme_color", 0);
}
public static void putThemeColor(int color) {
Prefers.put("theme_color", color);
}
}

@ -22,8 +22,6 @@ import com.fongmi.android.tv.App;
import com.fongmi.android.tv.BuildConfig;
import com.fongmi.android.tv.R;
import com.github.catvod.utils.Shell;
import com.google.android.material.color.DynamicColors;
import java.net.NetworkInterface;
import java.util.Formatter;
import java.util.Locale;
@ -34,10 +32,6 @@ public class Util {
private static final Pattern EPISODE = Pattern.compile("(?i)(?:ep|第|e|[\\-\\.\\s])\\s?(\\d{1,4})");
public static Context wrapContext(Context context) {
return DynamicColors.wrapContextIfAvailable(context);
}
public static void toggleFullscreen(Activity activity, boolean fullscreen) {
if (fullscreen) hideSystemUI(activity);
else showSystemUI(activity);

@ -118,6 +118,9 @@
<string name="setting_player">播放设置</string>
<string name="setting_danmaku">弹幕设置</string>
<string name="setting_incognito">无痕模式</string>
<string name="setting_theme_color">主题色彩</string>
<string name="setting_auto">自动</string>
<string name="setting_custom">自定义</string>
<string name="setting_size">图片尺寸</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>

@ -118,6 +118,9 @@
<string name="setting_player">播放設定</string>
<string name="setting_danmaku">彈幕設定</string>
<string name="setting_incognito">無痕模式</string>
<string name="setting_theme_color">主題色彩</string>
<string name="setting_auto">自動</string>
<string name="setting_custom">自訂</string>
<string name="setting_size">圖片尺寸</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>

@ -119,6 +119,9 @@
<string name="setting_player">Player setting</string>
<string name="setting_danmaku">Danmaku setting</string>
<string name="setting_incognito">Incognito mode</string>
<string name="setting_theme_color">Theme color</string>
<string name="setting_auto">Auto</string>
<string name="setting_custom">Custom</string>
<string name="setting_size">Image size</string>
<string name="setting_doh">DoH</string>
<string name="setting_proxy">Proxy</string>

@ -12,7 +12,7 @@
<activity
android:name=".ui.activity.HomeActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|uiMode|orientation"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:exported="true"
android:launchMode="singleTop"
android:screenOrientation="fullUser"
@ -75,28 +75,28 @@
<activity
android:name=".ui.activity.SearchActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|uiMode"
android:configChanges="screenSize|smallestScreenSize|screenLayout"
android:screenOrientation="fullUser"
android:windowSoftInputMode="adjustPan" />
<activity
android:name=".ui.activity.FileActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|uiMode"
android:configChanges="screenSize|smallestScreenSize|screenLayout"
android:screenOrientation="fullUser" />
<activity
android:name=".ui.activity.FolderActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|uiMode"
android:configChanges="screenSize|smallestScreenSize|screenLayout"
android:screenOrientation="fullUser" />
<activity
android:name=".ui.activity.HistoryActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|uiMode"
android:configChanges="screenSize|smallestScreenSize|screenLayout"
android:screenOrientation="fullUser" />
<activity
android:name=".ui.activity.KeepActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|uiMode"
android:configChanges="screenSize|smallestScreenSize|screenLayout"
android:screenOrientation="fullUser" />
<activity
@ -110,7 +110,7 @@
<activity
android:name=".ui.activity.ScanActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|uiMode"
android:configChanges="screenSize|smallestScreenSize|screenLayout"
android:screenOrientation="fullUser" />
<activity

@ -0,0 +1,70 @@
package com.fongmi.android.tv.ui.adapter;
import android.graphics.drawable.GradientDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.databinding.AdapterThemeBinding;
public class ThemeAdapter extends RecyclerView.Adapter<ThemeAdapter.ViewHolder> {
private final OnClickListener listener;
private final int[] mItems;
private int selected;
public ThemeAdapter(OnClickListener listener, int[] items, int selected) {
this.listener = listener;
this.mItems = items;
this.selected = selected;
}
public interface OnClickListener {
void onItemClick(int color);
}
public void setSelected(int color) {
selected = color;
notifyItemRangeChanged(0, getItemCount());
}
@Override
public int getItemCount() {
return mItems.length;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(AdapterThemeBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
int color = mItems[position];
GradientDrawable circle = new GradientDrawable();
circle.setShape(GradientDrawable.OVAL);
if (color == 0) {
circle.setColors(new int[]{0xFFE53935, 0xFF2196F3, 0xFF4CAF50, 0xFFE53935});
circle.setGradientType(GradientDrawable.SWEEP_GRADIENT);
} else {
circle.setColor(color);
}
holder.binding.circle.setBackground(circle);
holder.binding.check.setVisibility(selected == color ? View.VISIBLE : View.INVISIBLE);
holder.binding.getRoot().setOnClickListener(v -> listener.onItemClick(color));
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final AdapterThemeBinding binding;
ViewHolder(@NonNull AdapterThemeBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
}

@ -16,8 +16,11 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentActivity;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.setting.Setting;
import com.fongmi.android.tv.ui.custom.CustomWallView;
import com.fongmi.android.tv.utils.ResUtil;
import com.google.android.material.color.DynamicColors;
import com.google.android.material.color.DynamicColorsOptions;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@ -31,6 +34,7 @@ public abstract class BaseActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
enableEdgeToEdge();
enableDynamicColor();
setContentView(getBinding().getRoot());
EventBus.getDefault().register(this);
initView(savedInstanceState);
@ -104,6 +108,12 @@ public abstract class BaseActivity extends AppCompatActivity {
}
}
private void enableDynamicColor() {
DynamicColors.applyToActivityIfAvailable(this);
int color = Setting.getThemeColor();
if (color != 0) DynamicColors.applyToActivityIfAvailable(this, new DynamicColorsOptions.Builder().setContentBasedSource(color).build());
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onSubscribe(Object o) {
}

@ -0,0 +1,47 @@
package com.fongmi.android.tv.ui.dialog;
import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.databinding.DialogThemeBinding;
import com.fongmi.android.tv.setting.Setting;
import com.fongmi.android.tv.ui.adapter.ThemeAdapter;
public class ThemeDialog extends BaseAlertDialog implements ThemeAdapter.OnClickListener {
private static final int[] COLORS = {0, 0xFF6750A4, 0xFF3949AB, 0xFF1E88E5, 0xFF00ACC1, 0xFF00897B, 0xFF43A047, 0xFF7CB342, 0xFFFB8C00, 0xFFE53935, 0xFFD81B60, 0xFF8E24AA, 0xFF6D4C41,};
private DialogThemeBinding binding;
public static void show(Fragment fragment) {
new ThemeDialog().show(fragment.getChildFragmentManager(), null);
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
setBinding();
initView();
return builder().setTitle(R.string.setting_theme_color).setView(binding.getRoot()).create();
}
private void setBinding() {
binding = DialogThemeBinding.inflate(getLayoutInflater());
}
private void initView() {
binding.recycler.setAdapter(new ThemeAdapter(this, COLORS, Setting.getThemeColor()));
}
@Override
public void onItemClick(int color) {
Setting.putThemeColor(color);
requireActivity().recreate();
dismiss();
}
}

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorPrimary" android:state_activated="true" />
<item android:color="?attr/colorPrimary" android:state_selected="true" />
<item android:color="?attr/colorPrimary" android:state_checked="true" />
<item android:color="@color/white" />
</selector>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorPrimaryContainer" android:state_activated="true" />
<item android:color="?attr/colorPrimaryContainer" android:state_selected="true" />
<item android:color="?attr/colorPrimaryContainer" android:state_checked="true" />
<item android:color="@color/white" />
</selector>

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="?attr/colorControlActivated" android:state_checked="true" />
<item android:color="?attr/colorPrimary" android:state_checked="true" />
<item android:color="@color/white" android:state_checked="false" />
</selector>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/yellow_500" android:state_activated="true" />
<item android:color="@color/yellow_500" android:state_selected="true" />
<item android:color="@color/yellow_500" android:state_checked="true" />
<item android:color="@color/white" />
</selector>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="?attr/colorPrimaryContainer" />
<padding
android:bottom="4dp"
android:left="4dp"
android:right="4dp"
android:top="4dp" />
</shape>

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z" />
</vector>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp">
<View
android:id="@+id/circle"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/check"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:src="@drawable/ic_action_check" />
</FrameLayout>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="horizontal"
android:padding="24dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

@ -255,6 +255,33 @@
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/themeColor"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/shape_item"
android:orientation="horizontal">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_theme_color"
android:textColor="@color/white"
android:textSize="16sp" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/themeColorText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="16sp"
tools:text="Auto" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/size"
android:layout_width="match_parent"

@ -68,6 +68,7 @@
android:visibility="gone" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
style="@style/Widget.App.Fab"
android:id="@+id/filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -80,6 +81,7 @@
tools:visibility="visible" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
style="@style/Widget.App.Fab"
android:id="@+id/link"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -91,6 +93,7 @@
tools:visibility="visible" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
style="@style/Widget.App.Fab"
android:id="@+id/top"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

@ -0,0 +1,5 @@
<resources>
<style name="Widget.App.Fab" parent="Widget.Material3.FloatingActionButton.Primary" />
</resources>

@ -1,6 +1,6 @@
<resources>
<style name="Theme.Base" parent="Theme.Material3.DayNight.NoActionBar">
<style name="Theme.Base" parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
<item name="colorPrimary">@color/blue_500</item>
<item name="android:statusBarColor">@color/transparent</item>
<item name="android:navigationBarColor">@color/transparent</item>
@ -19,6 +19,11 @@
<item name="android:windowBackground">@color/grey_700</item>
</style>
<style name="Widget.App.Fab" parent="Widget.Material3.FloatingActionButton.Primary">
<item name="backgroundTint">@color/blue_500</item>
<item name="tint">@color/white</item>
</style>
<style name="Control">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>

@ -11,7 +11,7 @@ biometric = "1.1.0"
desugar = "2.1.5"
leanback = "1.2.0"
lifecycleService = "2.10.0"
media = "1.7.1"
media = "1.8.0"
preference = "1.2.1"
recyclerview = "1.4.0"
room = "2.8.4"
@ -34,7 +34,7 @@ jupnp = "3.0.4"
juniversalchardet = "1.0.3"
logger = "2.2.0"
lottie = "6.7.1"
material = "1.14.0-beta01"
material = "1.14.0-rc01"
materialdesigncolors = "1.0.0"
nanohttpd = "2.3.1"
newpipeextractor = "v0.26.1"

Loading…
Cancel
Save