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