support live - part 6

pull/123/head
FongMi 4 years ago
parent 775ef92d88
commit 73c79ce4ea
  1. 8
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 92
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  3. 94
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownLive.java
  4. 26
      app/src/leanback/java/com/fongmi/android/tv/ui/custom/CustomKeyDownVod.java
  5. 3
      app/src/leanback/res/layout/activity_live.xml
  6. 10
      app/src/main/java/com/fongmi/android/tv/api/ApiConfig.java
  7. 42
      app/src/main/java/com/fongmi/android/tv/api/LiveConfig.java
  8. 38
      app/src/main/java/com/fongmi/android/tv/bean/Channel.java
  9. 4
      app/src/main/java/com/fongmi/android/tv/bean/Group.java
  10. 7
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  11. 9
      app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java
  12. 8
      app/src/main/java/com/fongmi/android/tv/utils/Prefers.java
  13. 4
      app/src/main/java/com/fongmi/android/tv/utils/Utils.java

@ -38,7 +38,7 @@ import com.fongmi.android.tv.net.Callback;
import com.fongmi.android.tv.net.OKHttp;
import com.fongmi.android.tv.player.ExoUtil;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.ui.custom.CustomKeyDown;
import com.fongmi.android.tv.ui.custom.CustomKeyDownVod;
import com.fongmi.android.tv.ui.custom.TrackSelectionDialog;
import com.fongmi.android.tv.ui.custom.dialog.DescDialog;
import com.fongmi.android.tv.ui.presenter.EpisodePresenter;
@ -66,7 +66,7 @@ import java.util.List;
import okhttp3.Call;
import okhttp3.Response;
public class DetailActivity extends BaseActivity implements CustomKeyDown.Listener, ArrayPresenter.OnClickListener, Clock.Callback {
public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, ArrayPresenter.OnClickListener, Clock.Callback {
private ActivityDetailBinding mBinding;
private ViewControllerBottomBinding mControl;
@ -78,8 +78,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
private ArrayObjectAdapter mPartAdapter;
private EpisodePresenter mEpisodePresenter;
private PartPresenter mPartPresenter;
private CustomKeyDownVod mKeyDown;
private SiteViewModel mViewModel;
private CustomKeyDown mKeyDown;
private boolean mFullscreen;
private Handler mHandler;
private History mHistory;
@ -136,7 +136,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDown.Listen
@Override
protected void initView() {
mKeyDown = CustomKeyDown.create(this);
mKeyDown = CustomKeyDownVod.create(this);
mHandler = new Handler(Looper.getMainLooper());
mFrameParams = mBinding.video.getLayoutParams();
mBinding.progressLayout.showProgress();

@ -4,6 +4,7 @@ import android.app.Activity;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.view.KeyEvent;
import android.view.View;
import androidx.annotation.NonNull;
@ -20,6 +21,7 @@ import com.fongmi.android.tv.bean.Group;
import com.fongmi.android.tv.databinding.ActivityLiveBinding;
import com.fongmi.android.tv.event.PlayerEvent;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.ui.custom.CustomKeyDownLive;
import com.fongmi.android.tv.ui.presenter.ChannelPresenter;
import com.fongmi.android.tv.ui.presenter.GroupPresenter;
import com.fongmi.android.tv.utils.Prefers;
@ -31,11 +33,12 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener {
public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, CustomKeyDownLive.Listener {
private ActivityLiveBinding mBinding;
private ArrayObjectAdapter mChannelAdapter;
private ArrayObjectAdapter mGroupAdapter;
private CustomKeyDownLive mKeyDown;
private Handler mHandler;
private Players mPlayers;
@ -55,8 +58,12 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
return (Channel) mChannelAdapter.get(mBinding.channel.getSelectedPosition());
}
private boolean isRecyclerVisible() {
return mBinding.recycler.getVisibility() == View.VISIBLE;
private boolean isVisible(View view) {
return view.getVisibility() == View.VISIBLE;
}
private boolean isGone(View view) {
return view.getVisibility() == View.GONE;
}
@Override
@ -67,6 +74,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
protected void initView() {
mHandler = new Handler(Looper.getMainLooper());
mKeyDown = CustomKeyDownLive.create(this);
mPlayers = new Players().init();
setRecyclerView();
setVideoView();
@ -89,17 +97,26 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
mBinding.channel.setAdapter(new ItemBridgeAdapter(mChannelAdapter = new ArrayObjectAdapter(new ChannelPresenter(this))));
}
private void getLive() {
mGroupAdapter.setItems(LiveConfig.get().getHome().getGroups(), null);
mBinding.channel.requestFocus();
}
private void setVideoView() {
getPlayerView().setPlayer(mPlayers.exo());
getPlayerView().setVisibility(View.VISIBLE);
getPlayerView().setResizeMode(AspectRatioFrameLayout.RESIZE_MODE_FILL);
}
private void getLive() {
int[] position = LiveConfig.get().getKeep();
mGroupAdapter.setItems(LiveConfig.get().getHome().getGroups(), null);
if (position[0] == -1) mBinding.recycler.setVisibility(View.VISIBLE);
else setKeep(position);
}
private void setKeep(int[] position) {
mBinding.group.setSelectedPosition(position[0]);
getGroup().setPosition(position[1]);
onItemClick(getGroup());
onItemClick(getChannel());
}
@Override
public void onItemClick(Group item) {
mChannelAdapter.setItems(item.getChannel(), null);
@ -109,9 +126,66 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
public void onItemClick(Channel item) {
getGroup().setPosition(mBinding.channel.getSelectedPosition());
LiveConfig.get().setKeep(getGroup(), item);
mBinding.recycler.setVisibility(View.GONE);
mPlayers.start(item);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (isGone(mBinding.recycler) && mKeyDown.hasEvent(event)) return mKeyDown.onKeyDown(event);
else return super.dispatchKeyEvent(event);
}
@Override
public void onShow(String number) {
}
@Override
public void onFind(String number) {
}
@Override
public void onKeyUp() {
int position = mBinding.channel.getSelectedPosition();
position = position > 0 ? --position : mChannelAdapter.size() - 1;
mBinding.channel.setSelectedPosition(position);
mBinding.channel.scrollToPosition(position);
onItemClick(getChannel());
}
@Override
public void onKeyDown() {
int position = mBinding.channel.getSelectedPosition();
position = position < mChannelAdapter.size() - 1 ? ++position : 0;
mBinding.channel.setSelectedPosition(position);
mBinding.channel.scrollToPosition(position);
onItemClick(getChannel());
}
@Override
public void onKeyLeft() {
}
@Override
public void onKeyRight() {
}
@Override
public void onKeyCenter() {
mBinding.recycler.setVisibility(View.VISIBLE);
mBinding.channel.requestFocus();
}
@Override
public void onLongPress() {
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPlayerEvent(PlayerEvent event) {
switch (event.getState()) {
@ -150,7 +224,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick
@Override
public void onBackPressed() {
if (isRecyclerVisible()) {
if (isVisible(mBinding.recycler)) {
mBinding.recycler.setVisibility(View.GONE);
} else {
super.onBackPressed();

@ -0,0 +1,94 @@
package com.fongmi.android.tv.ui.custom;
import android.os.Handler;
import android.view.KeyEvent;
import com.fongmi.android.tv.utils.Utils;
public class CustomKeyDownLive {
private final Listener listener;
private final StringBuilder text;
private final Handler handler;
private boolean press;
private final Runnable runnable = new Runnable() {
@Override
public void run() {
listener.onFind(text.toString());
text.setLength(0);
}
};
public static CustomKeyDownLive create(Listener listener) {
return new CustomKeyDownLive(listener);
}
private CustomKeyDownLive(Listener listener) {
this.listener = listener;
this.handler = new Handler();
this.text = new StringBuilder();
}
public void onKeyDown(int keyCode) {
if (text.length() >= 4) return;
text.append(getNumber(keyCode));
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, 1000);
listener.onShow(text.toString());
}
public boolean onKeyDown(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isUpKey(event)) {
listener.onKeyUp();
} else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isDownKey(event)) {
listener.onKeyDown();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isLeftKey(event)) {
listener.onKeyLeft();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isRightKey(event)) {
listener.onKeyRight();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isDigitKey(event)) {
onKeyDown(event.getKeyCode());
} else if (Utils.isEnterKey(event)) {
checkPress(event);
}
return true;
}
private void checkPress(KeyEvent event) {
if (event.isLongPress()) {
press = true;
listener.onLongPress();
} else if (event.getAction() == KeyEvent.ACTION_UP) {
if (press) press = false;
else listener.onKeyCenter();
}
}
public boolean hasEvent(KeyEvent event) {
return Utils.isEnterKey(event) || Utils.isUpKey(event) || Utils.isDownKey(event) || Utils.isLeftKey(event) || Utils.isRightKey(event) || Utils.isDigitKey(event) || event.isLongPress();
}
private int getNumber(int keyCode) {
return keyCode >= 144 ? keyCode - 144 : keyCode - 7;
}
public interface Listener {
void onShow(String number);
void onFind(String number);
void onKeyUp();
void onKeyDown();
void onKeyLeft();
void onKeyRight();
void onKeyCenter();
void onLongPress();
}
}

@ -4,30 +4,32 @@ import android.view.KeyEvent;
import com.fongmi.android.tv.utils.Utils;
public class CustomKeyDown {
public class CustomKeyDownVod {
private final Listener mListener;
private final Listener listener;
private int holdTime;
public static CustomKeyDown create(Listener listener) {
return new CustomKeyDown(listener);
public static CustomKeyDownVod create(Listener listener) {
return new CustomKeyDownVod(listener);
}
private CustomKeyDown(Listener listener) {
this.mListener = listener;
private CustomKeyDownVod(Listener listener) {
this.listener = listener;
}
public boolean onKeyDown(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN && (Utils.isLeftKey(event) || Utils.isRightKey(event))) {
mListener.onSeeking(Utils.isRightKey(event) ? addTime() : subTime());
if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isLeftKey(event)) {
listener.onSeeking(subTime());
} else if (event.getAction() == KeyEvent.ACTION_DOWN && Utils.isRightKey(event)) {
listener.onSeeking(addTime());
} else if (event.getAction() == KeyEvent.ACTION_UP && (Utils.isLeftKey(event) || Utils.isRightKey(event))) {
mListener.onSeekTo(holdTime);
listener.onSeekTo(holdTime);
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isUpKey(event)) {
mListener.onKeyUp();
listener.onKeyUp();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isDownKey(event)) {
mListener.onKeyDown();
listener.onKeyDown();
} else if (event.getAction() == KeyEvent.ACTION_UP && Utils.isEnterKey(event)) {
mListener.onKeyCenter();
listener.onKeyCenter();
}
return true;
}

@ -33,7 +33,8 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/shape_live"
android:orientation="horizontal">
android:orientation="horizontal"
android:visibility="gone">
<androidx.leanback.widget.VerticalGridView
android:id="@+id/group"

@ -6,7 +6,6 @@ import android.text.TextUtils;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.bean.Live;
import com.fongmi.android.tv.bean.Parse;
import com.fongmi.android.tv.bean.Site;
import com.fongmi.android.tv.net.Callback;
@ -68,6 +67,7 @@ public class ApiConfig {
}
public ApiConfig init() {
LiveConfig.get().init();
this.ads = new ArrayList<>();
this.sites = new ArrayList<>();
this.flags = new ArrayList<>();
@ -108,6 +108,7 @@ public class ApiConfig {
private void parseConfig(JsonObject object, Callback callback) {
try {
parseJson(object);
LiveConfig.get().parse(object);
jLoader.parseJar("", Json.safeString(object, "spider", ""));
handler.post(() -> callback.success(object.toString()));
} catch (Exception e) {
@ -128,14 +129,10 @@ public class ApiConfig {
if (parse.getName().equals(Prefers.getParse())) setParse(parse);
if (!parses.contains(parse)) parses.add(parse);
}
for (JsonElement element : Json.safeListElement(object, "lives")) {
LiveConfig.get().parse(Live.objectFrom(element));
}
if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0));
if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0));
flags.addAll(Json.safeListString(object, "flags"));
ads.addAll(Json.safeListString(object, "ads"));
LiveConfig.get().setHome();
}
private String parseExt(String ext) {
@ -219,13 +216,14 @@ public class ApiConfig {
}
public ApiConfig clear() {
this.home = null;
this.ads.clear();
this.sites.clear();
this.flags.clear();
this.parses.clear();
this.jLoader.clear();
this.pLoader.clear();
this.home = null;
LiveConfig.get().clear();
return this;
}
}

@ -5,9 +5,13 @@ import android.util.Base64;
import com.fongmi.android.tv.bean.Channel;
import com.fongmi.android.tv.bean.Group;
import com.fongmi.android.tv.bean.Live;
import com.fongmi.android.tv.db.AppDatabase;
import com.fongmi.android.tv.net.OKHttp;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Json;
import com.fongmi.android.tv.utils.Prefers;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.util.ArrayList;
import java.util.List;
@ -38,10 +42,6 @@ public class LiveConfig {
return home;
}
public void setHome() {
if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0));
}
public void setHome(Live home) {
this.home = home;
this.home.setActivated(true);
@ -49,13 +49,35 @@ public class LiveConfig {
for (Live item : lives) item.setActivated(home);
}
public void setKeep(Group group, Channel channel) {
Prefers.putKeep(getHome().getName() + AppDatabase.SYMBOL + group.getName() + AppDatabase.SYMBOL + channel.getName());
}
public int[] getKeep() {
String[] splits = Prefers.getKeep().split(AppDatabase.SYMBOL);
if (!getHome().getName().equals(splits[0])) return new int[]{-1, -1};
for (int i = 0; i < getHome().getGroups().size(); i++) {
Group group = getHome().getGroups().get(i);
if (group.getName().equals(splits[1])) {
int j = group.find(splits[2]);
if (j != -1) return new int[]{i, j};
}
}
return new int[]{-1, -1};
}
private boolean isProxy(Live live) {
return live.getGroup().equals("redirect") && live.getChannels().size() > 0 && live.getChannels().get(0).getUrls().size() > 0 && live.getChannels().get(0).getUrls().get(0).startsWith("proxy");
}
public void parse(JsonObject object) {
if (!object.has("lives")) return;
for (JsonElement element : Json.safeListElement(object, "lives")) parse(Live.objectFrom(element));
if (home == null) setHome(lives.isEmpty() ? new Live() : lives.get(0));
}
public void parse(Live live) {
try {
if (lives == null) init();
if (isProxy(live)) live = new Live(live.getChannels().get(0).getName(), live.getChannels().get(0).getUrl().split("ext=")[1]);
if (live.getType() == 0) parse(live, getTxt(live.getUrl()));
if (live.getGroups().size() > 0) getLives().add(live);
@ -73,6 +95,7 @@ public class LiveConfig {
}
private void parse(Live live, String txt) {
int number = 0;
for (String line : txt.split("\n")) {
String[] split = line.split(",");
if (split.length < 2) continue;
@ -81,11 +104,16 @@ public class LiveConfig {
}
if (split[1].contains("://")) {
Group group = live.getGroups().get(live.getGroups().size() - 1);
Channel channel = new Channel(group.getChannel().size() + 1, split[0], split[1].split("#"));
Channel channel = new Channel(split[0], split[1].split("#"));
int index = group.getChannel().indexOf(channel);
if (index != -1) group.getChannel().get(index).getUrls().addAll(channel.getUrls());
else group.getChannel().add(channel);
else group.getChannel().add(channel.setNumber(++number));
}
}
}
public void clear() {
this.lives.clear();
this.home = null;
}
}

@ -11,6 +11,7 @@ import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@ -26,8 +27,6 @@ public class Channel {
private String icon;
@SerializedName("name")
private String name;
@SerializedName("group")
private Group group;
@SerializedName("ua")
private String ua;
@ -38,20 +37,22 @@ public class Channel {
return new Gson().fromJson(element, Channel.class);
}
public static Channel create(String number) {
return new Channel(String.format(Locale.getDefault(), "%03d", Integer.valueOf(number)));
public static Channel create(int number) {
return new Channel().setNumber(number);
}
public Channel(String number) {
this.number = number;
public static Channel create(String name) {
return new Channel(name, Collections.emptyList());
}
public Channel() {
}
public Channel(int number, String name, String... urls) {
this(number, name, new ArrayList<>(Arrays.asList(urls)));
public Channel(String name, String... urls) {
this(name, new ArrayList<>(Arrays.asList(urls)));
}
public Channel(int number, String name, List<String> urls) {
this.number = String.format(Locale.getDefault(), "%03d", number);
public Channel(String name, List<String> urls) {
this.name = name;
this.urls = urls;
}
@ -65,7 +66,7 @@ public class Channel {
}
public String getNumber() {
return number;
return TextUtils.isEmpty(number) ? "" : number;
}
public void setNumber(String number) {
@ -88,14 +89,6 @@ public class Channel {
this.name = name;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public String getUa() {
return TextUtils.isEmpty(ua) ? "" : ua;
}
@ -132,6 +125,11 @@ public class Channel {
return getUrls().get(getIndex());
}
public Channel setNumber(int number) {
setNumber(String.format(Locale.getDefault(), "%03d", number));
return this;
}
public Map<String, String> getHeaders() {
HashMap<String, String> map = new HashMap<>();
if (getUa().isEmpty()) return map;
@ -144,6 +142,6 @@ public class Channel {
if (this == obj) return true;
if (!(obj instanceof Channel)) return false;
Channel it = (Channel) obj;
return getNumber().equals(it.getNumber()) || getName().equals(it.getName());
return getName().equals(it.getName()) || (!getNumber().isEmpty() && getNumber().equals(it.getNumber()));
}
}

@ -89,8 +89,8 @@ public class Group {
if (!getIcon().isEmpty()) ImgUtil.load(getIcon(), view);
}
public int find(String number) {
return getChannel().lastIndexOf(Channel.create(number));
public int find(String name) {
return getChannel().lastIndexOf(Channel.create(name));
}
@Override

@ -15,6 +15,7 @@ import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.analytics.AnalyticsListener;
import com.google.android.exoplayer2.audio.AudioAttributes;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.util.Util;
@ -41,9 +42,11 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca
private void setupPlayer() {
DefaultTrackSelector selector = new DefaultTrackSelector(App.get());
selector.setParameters(selector.getParameters().buildUpon().setPreferredTextLanguage("zh").build());
DefaultRenderersFactory factory = new DefaultRenderersFactory(App.get()).experimentalSetSynchronizeCodecInteractionsWithQueueingEnabled(true).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);
DefaultRenderersFactory factory = new DefaultRenderersFactory(App.get()).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON);
exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(new DefaultLoadControl()).setRenderersFactory(factory).setTrackSelector(selector).build();
exoPlayer.setAudioAttributes(AudioAttributes.DEFAULT, true);
exoPlayer.addAnalyticsListener(this);
exoPlayer.setPlayWhenReady(true);
exoPlayer.addListener(this);
}
@ -168,7 +171,6 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca
exoPlayer.setMediaSource(ExoUtil.getSource(result, errorCode));
PlayerEvent.state(0);
exoPlayer.prepare();
exoPlayer.play();
setErrorCode(0);
}
@ -176,7 +178,6 @@ public class Players implements Player.Listener, AnalyticsListener, ParseTask.Ca
exoPlayer.setMediaSource(ExoUtil.getSource(headers, url, errorCode));
PlayerEvent.state(0);
exoPlayer.prepare();
exoPlayer.play();
setErrorCode(0);
}

@ -36,9 +36,16 @@ public abstract class BaseActivity extends AppCompatActivity {
protected void initEvent() {
}
protected void hackResources() {
try {
AutoSizeCompat.autoConvertDensityOfGlobal(super.getResources());
} catch (Exception ignored) {
}
}
@Override
public Resources getResources() {
AutoSizeCompat.autoConvertDensityOfGlobal(super.getResources());
hackResources();
return super.getResources();
}

@ -76,6 +76,14 @@ public class Prefers {
put("live", live);
}
public static String getKeep() {
return getString("keep");
}
public static void putKeep(String keep) {
put("keep", keep);
}
public static int getRender() {
return getInt("render", 0);
}

@ -48,6 +48,10 @@ public class Utils {
return event.getKeyCode() == KeyEvent.KEYCODE_BACK;
}
public static boolean isDigitKey(KeyEvent event) {
return event.getKeyCode() >= KeyEvent.KEYCODE_0 && event.getKeyCode() <= KeyEvent.KEYCODE_9 || event.getKeyCode() >= KeyEvent.KEYCODE_NUMPAD_0 && event.getKeyCode() <= KeyEvent.KEYCODE_NUMPAD_9;
}
public static void hideSystemUI(Activity activity) {
int flags = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
activity.getWindow().getDecorView().setSystemUiVisibility(flags);

Loading…
Cancel
Save