[mobile] support shortcut

okjack
FongMi 2 years ago
parent 16974282b4
commit f0a6f761dc
  1. 18
      app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java
  2. 8
      app/src/mobile/AndroidManifest.xml
  3. 18
      app/src/mobile/java/com/fongmi/android/tv/receiver/ShortcutReceiver.java
  4. 32
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  5. 14
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java
  6. 1
      app/src/mobile/res/values-zh-rCN/strings.xml
  7. 1
      app/src/mobile/res/values-zh-rTW/strings.xml
  8. 1
      app/src/mobile/res/values/strings.xml
  9. 4
      app/src/mobile/res/values/styles.xml

@ -73,19 +73,19 @@ public class LiveConfig {
public LiveConfig init() {
this.home = null;
this.config = Config.live();
this.lives = new ArrayList<>();
return this;
}
public LiveConfig config(Config config) {
this.config = config;
if (config.getUrl() == null) return this;
this.same = config.getUrl().equals(ApiConfig.getUrl());
return this;
}
public LiveConfig clear() {
this.home = null;
this.lives.clear();
getLives().clear();
return this;
}
@ -118,8 +118,8 @@ public class LiveConfig {
private void parseText(String text, Callback callback) {
Live live = new Live(config.getUrl()).sync();
LiveParser.text(live, text);
lives.remove(live);
lives.add(live);
getLives().remove(live);
getLives().add(live);
setHome(live, true);
App.post(callback::success);
}
@ -144,13 +144,13 @@ public class LiveConfig {
private void parseConfig(JsonObject object, Callback callback) {
if (!object.has("lives")) return;
for (JsonElement element : Json.safeListElement(object, "lives")) add(Live.objectFrom(element).check());
for (Live live : lives) if (live.getName().equals(config.getHome())) setHome(live, true);
if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0), true);
for (Live live : getLives()) if (live.getName().equals(config.getHome())) setHome(live, true);
if (home == null) setHome(getLives().isEmpty() ? new Live() : getLives().get(0), true);
if (callback != null) App.post(callback::success);
}
private void add(Live live) {
if (!lives.contains(live)) lives.add(live.sync());
if (!getLives().contains(live)) getLives().add(live.sync());
}
private void bootLive() {
@ -212,7 +212,7 @@ public class LiveConfig {
}
public List<Live> getLives() {
return lives;
return lives == null ? lives = new ArrayList<>() : lives;
}
public Config getConfig() {
@ -231,7 +231,7 @@ public class LiveConfig {
this.home = home;
this.home.setActivated(true);
config.home(home.getName()).update();
for (Live item : lives) item.setActivated(home);
for (Live item : getLives()) item.setActivated(home);
if (check) if (home.isBoot() || Setting.isBootLive()) App.post(this::bootLive);
}
}

@ -96,10 +96,12 @@
<activity
android:name=".ui.activity.LiveActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:exported="true"
android:launchMode="singleTop"
android:resizeableActivity="true"
android:screenOrientation="sensorLandscape"
android:supportsPictureInPicture="true" />
android:supportsPictureInPicture="true"
android:theme="@style/AppTheme.Live" />
<activity
android:name=".ui.activity.ScanActivity"
@ -120,6 +122,10 @@
android:configChanges="screenSize|smallestScreenSize|screenLayout"
android:screenOrientation="fullUser" />
<receiver
android:name=".receiver.ShortcutReceiver"
android:exported="false" />
<service
android:name="com.android.cast.dlna.dmc.DLNACastService"
android:exported="false" />

@ -0,0 +1,18 @@
package com.fongmi.android.tv.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.utils.Notify;
public class ShortcutReceiver extends BroadcastReceiver {
public static final String ACTION = ShortcutReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
Notify.show(R.string.shortcut);
}
}

@ -31,6 +31,7 @@ import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.api.LiveConfig;
import com.fongmi.android.tv.bean.Channel;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.bean.Epg;
import com.fongmi.android.tv.bean.Group;
import com.fongmi.android.tv.bean.Keep;
@ -41,6 +42,7 @@ import com.fongmi.android.tv.databinding.ActivityLiveBinding;
import com.fongmi.android.tv.event.ActionEvent;
import com.fongmi.android.tv.event.ErrorEvent;
import com.fongmi.android.tv.event.PlayerEvent;
import com.fongmi.android.tv.impl.Callback;
import com.fongmi.android.tv.impl.LiveCallback;
import com.fongmi.android.tv.impl.PassCallback;
import com.fongmi.android.tv.impl.SubtitleCallback;
@ -105,7 +107,11 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
private PiP mPiP;
public static void start(Context context) {
if (!LiveConfig.isEmpty()) context.startActivity(new Intent(context, LiveActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
if (!LiveConfig.isEmpty()) context.startActivity(new Intent(context, LiveActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).putExtra("empty", false));
}
private boolean isEmpty() {
return getIntent().getBooleanExtra("empty", true);
}
private PlayerView getExo() {
@ -162,7 +168,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
setRecyclerView();
setVideoView();
setViewModel();
getLive();
checkLive();
}
@Override
@ -248,6 +254,28 @@ public class LiveActivity extends BaseActivity implements CustomKeyDownLive.List
});
}
private void checkLive() {
if (isEmpty()) {
LiveConfig.load(Config.live(), getCallback());
} else {
getLive();
}
}
private Callback getCallback() {
return new Callback() {
@Override
public void success() {
getLive();
}
@Override
public void error(String msg) {
Notify.show(msg);
}
};
}
private void getLive() {
mBinding.control.action.home.setText(getHome().getName());
mPlayers.setPlayer(getPlayerType(-1));

@ -1,13 +1,18 @@
package com.fongmi.android.tv.ui.activity;
import android.Manifest;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;
import androidx.fragment.app.Fragment;
import androidx.viewbinding.ViewBinding;
@ -24,6 +29,7 @@ import com.fongmi.android.tv.event.RefreshEvent;
import com.fongmi.android.tv.event.ServerEvent;
import com.fongmi.android.tv.impl.Callback;
import com.fongmi.android.tv.player.Source;
import com.fongmi.android.tv.receiver.ShortcutReceiver;
import com.fongmi.android.tv.server.Server;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.custom.FragmentStateManager;
@ -67,6 +73,7 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt
@Override
protected void initEvent() {
mBinding.navigation.setOnItemSelectedListener(this);
mBinding.navigation.findViewById(R.id.live).setOnLongClickListener(this::addShortcut);
}
private void checkAction(Intent intent) {
@ -148,6 +155,13 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt
return false;
}
private boolean addShortcut(View view) {
ShortcutInfoCompat info = new ShortcutInfoCompat.Builder(this, getString(R.string.nav_live)).setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher)).setIntent(new Intent(Intent.ACTION_VIEW, null, this, LiveActivity.class)).setShortLabel(getString(R.string.nav_live)).build();
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, ShortcutReceiver.class).setAction(ShortcutReceiver.ACTION), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
ShortcutManagerCompat.requestPinShortcut(this, info, pendingIntent.getIntentSender());
return true;
}
private void setConfirm() {
confirm = true;
Notify.show(R.string.app_exit);

@ -37,6 +37,7 @@
<!-- Hint -->
<string name="copied">已复制</string>
<string name="shortcut"> 已于主萤幕新增捷径。</string>
<string-array name="select_background">
<item>关闭</item>

@ -37,6 +37,7 @@
<!-- Hint -->
<string name="copied">已複製</string>
<string name="shortcut"> 已於主螢幕新增捷徑。</string>
<string-array name="select_background">
<item>關閉</item>

@ -37,6 +37,7 @@
<!-- Hint -->
<string name="copied">Copied</string>
<string name="shortcut">Shortcut has been added.</string>
<string-array name="select_background">
<item>Off</item>

@ -4,6 +4,10 @@
<item name="android:windowTranslucentStatus">true</item>
</style>
<style name="AppTheme.Live" parent="AppTheme">
<item name="android:windowBackground">@color/black</item>
</style>
<style name="AppTheme.Detail" parent="AppTheme">
<item name="android:statusBarColor">@color/black</item>
<item name="android:windowTranslucentStatus">false</item>

Loading…
Cancel
Save