From 897b364dafdf08f4411686c40c0648ecbce70f8d Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 9 Apr 2023 01:19:06 +0800 Subject: [PATCH] [mobile] support cast - part 3 --- app/build.gradle | 1 + .../android/tv/ui/activity/PushActivity.java | 2 +- .../tv/ui/custom/dialog/ConfigDialog.java | 2 +- .../com/fongmi/android/tv/bean/Device.java | 7 ++- .../com/fongmi/android/tv/db/AppDatabase.java | 17 +++++- .../fongmi/android/tv/event/RefreshEvent.java | 6 ++- .../com/fongmi/android/tv/server/Server.java | 8 ++- app/src/mobile/AndroidManifest.xml | 7 +++ .../tv/ui/activity/DetailActivity.java | 21 ++++---- .../android/tv/ui/activity/MainActivity.java | 1 + .../android/tv/ui/fragment/VodFragment.java | 3 ++ .../mobile/res/drawable/ic_cast_refresh.xml | 10 ++++ app/src/mobile/res/drawable/ic_cast_scan.xml | 40 ++++++++++++++ app/src/mobile/res/layout/activity_scan.xml | 13 +++++ app/src/mobile/res/layout/adapter_device.xml | 29 ++++++++++ app/src/mobile/res/layout/dialog_cast.xml | 53 +++++++++++++++++++ app/src/mobile/res/layout/view_scanner.xml | 25 +++++++++ app/src/mobile/res/values-zh-rCN/strings.xml | 6 ++- app/src/mobile/res/values-zh-rTW/strings.xml | 6 ++- app/src/mobile/res/values/strings.xml | 6 ++- 20 files changed, 237 insertions(+), 26 deletions(-) create mode 100644 app/src/mobile/res/drawable/ic_cast_refresh.xml create mode 100644 app/src/mobile/res/drawable/ic_cast_scan.xml create mode 100644 app/src/mobile/res/layout/activity_scan.xml create mode 100644 app/src/mobile/res/layout/adapter_device.xml create mode 100644 app/src/mobile/res/layout/dialog_cast.xml create mode 100644 app/src/mobile/res/layout/view_scanner.xml diff --git a/app/build.gradle b/app/build.gradle index 52929ed73..e696a8457 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -110,6 +110,7 @@ dependencies { leanbackImplementation 'androidx.leanback:leanback:1.2.0-alpha02' leanbackImplementation 'me.jessyan:autosize:1.2.1' mobileImplementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + mobileImplementation('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } annotationProcessor 'androidx.room:room-compiler:2.5.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' } \ No newline at end of file diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/PushActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/PushActivity.java index 85e7bd588..13d087b04 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/PushActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/PushActivity.java @@ -29,7 +29,7 @@ public class PushActivity extends BaseActivity { @Override protected void initView() { - String address = Server.get().getAddress(false); + String address = Server.get().getAddress(); mBinding.code.setImageBitmap(QRCode.getBitmap(address, 250, 1)); mBinding.info.setText(ResUtil.getString(R.string.push_info, address)); mBinding.clip.setOnClickListener(this::onClip); 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 808fcd4a4..dc51342a1 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 @@ -70,7 +70,7 @@ public class ConfigDialog implements DialogInterface.OnDismissListener { } private void initView() { - String address = Server.get().getAddress(false); + String address = Server.get().getAddress(); binding.text.setText(url = getUrl()); binding.text.setSelection(url.length()); binding.code.setImageBitmap(QRCode.getBitmap(address, 200, 0)); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Device.java b/app/src/main/java/com/fongmi/android/tv/bean/Device.java index 8ba31c75e..4bb3e5be4 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Device.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Device.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.bean; +import android.net.Uri; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -32,7 +33,7 @@ public class Device { Device device = new Device(); device.setUuid(Utils.getDeviceId()); device.setName(Utils.getDeviceName()); - device.setIp(Server.get().getAddress(false)); + device.setIp(Server.get().getAddress()); return device; } @@ -72,6 +73,10 @@ public class Device { this.ip = ip; } + public String getHost() { + return Uri.parse(getIp()).getHost(); + } + public Device save() { AppDatabase.get().getDeviceDao().insertOrUpdate(this); return this; diff --git a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java index 4bc62befd..8848d4339 100644 --- a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java +++ b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java @@ -11,20 +11,22 @@ import androidx.sqlite.db.SupportSQLiteDatabase; import com.fongmi.android.tv.App; import com.fongmi.android.tv.bean.Config; +import com.fongmi.android.tv.bean.Device; import com.fongmi.android.tv.bean.History; import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Track; import com.fongmi.android.tv.db.dao.ConfigDao; +import com.fongmi.android.tv.db.dao.DeviceDao; import com.fongmi.android.tv.db.dao.HistoryDao; import com.fongmi.android.tv.db.dao.KeepDao; import com.fongmi.android.tv.db.dao.SiteDao; import com.fongmi.android.tv.db.dao.TrackDao; -@Database(entities = {Keep.class, Site.class, Track.class, Config.class, History.class}, version = AppDatabase.VERSION) +@Database(entities = {Keep.class, Site.class, Track.class, Config.class, Device.class, History.class}, version = AppDatabase.VERSION) public abstract class AppDatabase extends RoomDatabase { - public static final int VERSION = 20; + public static final int VERSION = 21; public static final String SYMBOL = "@@@"; private static volatile AppDatabase instance; @@ -45,6 +47,7 @@ public abstract class AppDatabase extends RoomDatabase { .addMigrations(MIGRATION_17_18) .addMigrations(MIGRATION_18_19) .addMigrations(MIGRATION_19_20) + .addMigrations(MIGRATION_20_21) .allowMainThreadQueries() .fallbackToDestructiveMigration() .build(); @@ -58,6 +61,8 @@ public abstract class AppDatabase extends RoomDatabase { public abstract ConfigDao getConfigDao(); + public abstract DeviceDao getDeviceDao(); + public abstract HistoryDao getHistoryDao(); static final Migration MIGRATION_11_12 = new Migration(11, 12) { @@ -126,4 +131,12 @@ public abstract class AppDatabase extends RoomDatabase { database.execSQL("ALTER TABLE Config ADD COLUMN name TEXT DEFAULT NULL"); } }; + + static final Migration MIGRATION_20_21 = new Migration(20, 21) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("CREATE TABLE IF NOT EXISTS `Device` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `uuid` TEXT, `name` TEXT, `ip` TEXT)"); + database.execSQL("CREATE UNIQUE INDEX IF NOT EXISTS `index_Device_uuid_name` ON `Device` (`uuid`, `name`)"); + } + }; } diff --git a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java index ef2cd8d0f..4034401e0 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java @@ -6,6 +6,10 @@ public class RefreshEvent { private final Type type; + public static void empty() { + EventBus.getDefault().post(new RefreshEvent(Type.EMPTY)); + } + public static void image() { EventBus.getDefault().post(new RefreshEvent(Type.IMAGE)); } @@ -39,6 +43,6 @@ public class RefreshEvent { } public enum Type { - IMAGE, VIDEO, HISTORY, KEEP, SIZE, WALL + EMPTY, IMAGE, VIDEO, HISTORY, KEEP, SIZE, WALL } } diff --git a/app/src/main/java/com/fongmi/android/tv/server/Server.java b/app/src/main/java/com/fongmi/android/tv/server/Server.java index f4a0121c6..3c093dedb 100644 --- a/app/src/main/java/com/fongmi/android/tv/server/Server.java +++ b/app/src/main/java/com/fongmi/android/tv/server/Server.java @@ -31,14 +31,18 @@ public class Server implements Nano.Listener { this.port = 9978; } - public String getAddress(boolean local) { - return "http://" + (local ? "127.0.0.1" : getIP()) + ":" + port; + public String getAddress() { + return getAddress(false); } public String getAddress(String path) { return getAddress(true) + "/" + path; } + public String getAddress(boolean local) { + return "http://" + (local ? "127.0.0.1" : getIP()) + ":" + port; + } + public void start() { if (nano != null) return; do { diff --git a/app/src/mobile/AndroidManifest.xml b/app/src/mobile/AndroidManifest.xml index d23547b23..410e8ce9c 100644 --- a/app/src/mobile/AndroidManifest.xml +++ b/app/src/mobile/AndroidManifest.xml @@ -2,6 +2,8 @@ + + + + \ No newline at end of file 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 b79721204..021dd8051 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 @@ -37,16 +37,16 @@ import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Track; import com.fongmi.android.tv.bean.Vod; -import com.fongmi.android.tv.cast.Cast; import com.fongmi.android.tv.databinding.ActivityDetailBinding; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.event.ErrorEvent; import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.model.SiteViewModel; +import com.fongmi.android.tv.pip.PiP; +import com.fongmi.android.tv.pip.Receiver; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; -import com.fongmi.android.tv.pip.Receiver; import com.fongmi.android.tv.ui.adapter.EpisodeAdapter; import com.fongmi.android.tv.ui.adapter.FlagAdapter; import com.fongmi.android.tv.ui.adapter.ParseAdapter; @@ -55,12 +55,12 @@ import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.CustomKeyDownVod; import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.ui.custom.ViewType; +import com.fongmi.android.tv.ui.custom.dialog.CastDialog; import com.fongmi.android.tv.ui.custom.dialog.ControlDialog; import com.fongmi.android.tv.ui.custom.dialog.EpisodeDialog; import com.fongmi.android.tv.ui.custom.dialog.TrackDialog; import com.fongmi.android.tv.utils.Clock; import com.fongmi.android.tv.utils.Notify; -import com.fongmi.android.tv.pip.PiP; import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Traffic; @@ -79,7 +79,7 @@ import java.util.concurrent.Executors; import tv.danmaku.ijk.media.player.ui.IjkVideoView; -public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, Cast.Listener, TrackDialog.Listener, ControlDialog.Listener, Clock.Callback, FlagAdapter.OnClickListener, EpisodeAdapter.OnClickListener, ParseAdapter.OnClickListener { +public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, CastDialog.Listener, TrackDialog.Listener, ControlDialog.Listener, Clock.Callback, FlagAdapter.OnClickListener, EpisodeAdapter.OnClickListener, ParseAdapter.OnClickListener { private ViewGroup.LayoutParams mFrameParams; private ActivityDetailBinding mBinding; @@ -450,8 +450,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void onCast() { - mBinding.control.cast.setEnabled(false); - Cast.create(this).url(ApiConfig.getUrl()).history(mHistory).start(); + for (Fragment fragment : getSupportFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) return; + CastDialog.create(this).url(ApiConfig.getUrl()).history(mHistory).show(getSupportFragmentManager(), null); } private void onKeep() { @@ -672,6 +672,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void showControl() { mBinding.control.cast.setVisibility(mHistory == null || isFullscreen() ? View.GONE : View.VISIBLE); + mBinding.control.keep.setVisibility(mHistory == null || isFullscreen() ? View.GONE : View.VISIBLE); mBinding.control.parse.setVisibility(isFullscreen() && isUseParse() ? View.VISIBLE : View.GONE); mBinding.control.rotate.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE); mBinding.control.back.setVisibility(isFullscreen() && !isLock() ? View.VISIBLE : View.GONE); @@ -679,7 +680,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.control.setting.setVisibility(isFullscreen() ? View.GONE : View.VISIBLE); mBinding.control.title.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE); mBinding.control.share.setVisibility(isFullscreen() ? View.GONE : View.VISIBLE); - mBinding.control.keep.setVisibility(isFullscreen() ? View.GONE : View.VISIBLE); mBinding.control.lock.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE); mBinding.control.size.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE); mBinding.control.center.setVisibility(isLock() ? View.GONE : View.VISIBLE); @@ -1033,16 +1033,13 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override public void onCastTo(Device device) { - Notify.show(getString(R.string.cast_device, device.getName())); - mBinding.control.cast.setEnabled(true); + Notify.show(getString(R.string.cast_to, device.getName())); checkPlayImg(false); mPlayers.pause(); } @Override - public void onCastError(int resId) { - mBinding.control.cast.setEnabled(true); - Notify.show(resId); + public void onCastError() { } @Override diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java index e5aeaed37..28698d099 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java @@ -91,6 +91,7 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt @Override public void error(int resId) { + RefreshEvent.empty(); Notify.show(resId); } }; diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index c8ade4cba..10dcbd2d1 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -208,6 +208,9 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal @Subscribe(threadMode = ThreadMode.MAIN) public void onRefreshEvent(RefreshEvent event) { switch (event.getType()) { + case EMPTY: + hideProgress(); + break; case VIDEO: case SIZE: homeContent(); diff --git a/app/src/mobile/res/drawable/ic_cast_refresh.xml b/app/src/mobile/res/drawable/ic_cast_refresh.xml new file mode 100644 index 000000000..0951177a6 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_cast_refresh.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/mobile/res/drawable/ic_cast_scan.xml b/app/src/mobile/res/drawable/ic_cast_scan.xml new file mode 100644 index 000000000..2488fbfc2 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_cast_scan.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/app/src/mobile/res/layout/activity_scan.xml b/app/src/mobile/res/layout/activity_scan.xml new file mode 100644 index 000000000..a3841f7bb --- /dev/null +++ b/app/src/mobile/res/layout/activity_scan.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/adapter_device.xml b/app/src/mobile/res/layout/adapter_device.xml new file mode 100644 index 000000000..9bfd41da9 --- /dev/null +++ b/app/src/mobile/res/layout/adapter_device.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/dialog_cast.xml b/app/src/mobile/res/layout/dialog_cast.xml new file mode 100644 index 000000000..f5b6ad7d6 --- /dev/null +++ b/app/src/mobile/res/layout/dialog_cast.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/view_scanner.xml b/app/src/mobile/res/layout/view_scanner.xml new file mode 100644 index 000000000..ce7936b67 --- /dev/null +++ b/app/src/mobile/res/layout/view_scanner.xml @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/app/src/mobile/res/values-zh-rCN/strings.xml b/app/src/mobile/res/values-zh-rCN/strings.xml index ed537b44e..3fae21624 100644 --- a/app/src/mobile/res/values-zh-rCN/strings.xml +++ b/app/src/mobile/res/values-zh-rCN/strings.xml @@ -21,8 +21,10 @@ 快搜“%s - 找不到装置 - 已投放至“%s + 找不到装置 + 选择装置 + 请扫描影视 QRCode 进行绑定 + 已投放至“%s 倍速 diff --git a/app/src/mobile/res/values-zh-rTW/strings.xml b/app/src/mobile/res/values-zh-rTW/strings.xml index 9f8fc8350..01d771d43 100644 --- a/app/src/mobile/res/values-zh-rTW/strings.xml +++ b/app/src/mobile/res/values-zh-rTW/strings.xml @@ -21,8 +21,10 @@ 快搜「%s - 找不到裝置 - 已投放至「%s + 找不到裝置 + 選擇裝置 + 請掃描影視 QRCode 進行綁定 + 已投放至「%s 倍速 diff --git a/app/src/mobile/res/values/strings.xml b/app/src/mobile/res/values/strings.xml index 474abae8c..0afd5519a 100644 --- a/app/src/mobile/res/values/strings.xml +++ b/app/src/mobile/res/values/strings.xml @@ -21,8 +21,10 @@ Searching %s - Could\'t find a device to cast - Cast to %s + Could\'t find a device to cast + Select devices + Please scan QR Code to bind + Cast to %s Speed