[mobile] update dev

pull/123/head
FongMi 3 years ago
parent 49921153a1
commit c3fbc726fa
  1. 2
      app/build.gradle
  2. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/CollectActivity.java
  3. 18
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  4. 2
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/CustomTextListener.java
  5. 65
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java
  6. 10
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/dialog/ConfigDialog.java
  7. 44
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java
  8. 10
      app/src/mobile/res/drawable/ic_config_choose.xml
  9. 55
      app/src/mobile/res/layout/adapter_vod_folder.xml
  10. 6
      app/src/mobile/res/layout/dialog_config.xml
  11. 236
      app/src/mobile/res/layout/dialog_control.xml

@ -22,7 +22,7 @@ android {
mobile {
dimension "mode"
versionCode 8
versionName "20230321#2"
versionName "20230327#1"
}
java {
dimension = "api"

@ -34,7 +34,7 @@ import com.fongmi.android.tv.ui.adapter.RecordAdapter;
import com.fongmi.android.tv.ui.adapter.VodAdapter;
import com.fongmi.android.tv.ui.adapter.WordAdapter;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.custom.CustomListener;
import com.fongmi.android.tv.ui.custom.CustomTextListener;
import com.fongmi.android.tv.ui.custom.ViewType;
import com.fongmi.android.tv.ui.custom.dialog.SiteDialog;
import com.fongmi.android.tv.utils.PauseThreadPoolExecutor;
@ -106,7 +106,7 @@ public class CollectActivity extends BaseActivity implements SiteCallback, WordA
if (actionId == EditorInfo.IME_ACTION_DONE) search();
return true;
});
mBinding.keyword.addTextChangedListener(new CustomListener() {
mBinding.keyword.addTextChangedListener(new CustomTextListener() {
@Override
public void afterTextChanged(Editable s) {
if (s.toString().isEmpty()) getHot();

@ -39,14 +39,14 @@ import com.fongmi.android.tv.event.RefreshEvent;
import com.fongmi.android.tv.model.SiteViewModel;
import com.fongmi.android.tv.player.ExoUtil;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.receiver.PipReceiver;
import com.fongmi.android.tv.receiver.PiPReceiver;
import com.fongmi.android.tv.ui.adapter.EpisodeAdapter;
import com.fongmi.android.tv.ui.adapter.FlagAdapter;
import com.fongmi.android.tv.ui.adapter.ParseAdapter;
import com.fongmi.android.tv.ui.adapter.SearchAdapter;
import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.custom.CustomKeyDownVod;
import com.fongmi.android.tv.ui.custom.Pip;
import com.fongmi.android.tv.utils.PiP;
import com.fongmi.android.tv.ui.custom.SpaceItemDecoration;
import com.fongmi.android.tv.ui.custom.ViewType;
import com.fongmi.android.tv.ui.custom.dialog.ControlDialog;
@ -85,7 +85,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
private ExecutorService mExecutor;
private SiteViewModel mViewModel;
private FlagAdapter mFlagAdapter;
private PipReceiver mReceiver;
private PiPReceiver mReceiver;
private History mHistory;
private Players mPlayers;
private boolean fullscreen;
@ -100,7 +100,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
private Runnable mR2;
private Runnable mR3;
private String mKey;
private Pip mPip;
private PiP mPiP;
public static void push(Activity activity, String url) {
start(activity, "push_agent", url, url);
@ -186,12 +186,12 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mKeyDown = CustomKeyDownVod.create(this, mBinding.video);
mFrameParams = mBinding.video.getLayoutParams();
mBinding.progressLayout.showProgress();
mReceiver = new PipReceiver(mBinding);
mReceiver = new PiPReceiver(mBinding);
mPlayers = new Players().init();
mR1 = this::hideControl;
mR2 = this::setTraffic;
mR3 = this::setOrient;
mPip = new Pip();
mPiP = new PiP();
mKey = getKey();
setRecyclerView();
setVideoView();
@ -255,7 +255,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mBinding.control.action.player.setText(mPlayers.getPlayerText());
getExo().setVisibility(mPlayers.isExo() ? View.VISIBLE : View.GONE);
getIjk().setVisibility(mPlayers.isIjk() ? View.VISIBLE : View.GONE);
mBinding.video.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> mPip.update(getActivity(), view));
mBinding.video.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> mPiP.update(getActivity(), view));
}
private void setDecodeView() {
@ -732,7 +732,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
private void checkPlayImg(boolean playing) {
mBinding.control.play.setImageResource(playing ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play);
mPip.update(this, playing);
mPiP.update(this, playing);
}
private void checkLockImg() {
@ -1091,7 +1091,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
mPip.enter(this, getScale() == 2);
mPiP.enter(this, getScale() == 2);
if (isLock()) App.post(this::onLock, 500);
}

@ -3,7 +3,7 @@ package com.fongmi.android.tv.ui.custom;
import android.text.Editable;
import android.text.TextWatcher;
public class CustomListener implements TextWatcher {
public class CustomTextListener implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

@ -1,65 +0,0 @@
package com.fongmi.android.tv.ui.custom;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.PictureInPictureParams;
import android.app.RemoteAction;
import android.content.Intent;
import android.graphics.Rect;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.util.Rational;
import android.view.View;
import com.fongmi.android.tv.utils.Utils;
import java.util.ArrayList;
import java.util.List;
public class Pip {
public static final String ACTION_MEDIA_CONTROL = "media_control";
public static final String EXTRA_CONTROL_TYPE = "control_type";
public static final int CONTROL_TYPE_PREV = 1;
public static final int CONTROL_TYPE_NEXT = 2;
public static final int CONTROL_TYPE_PLAY = 3;
public static final int CONTROL_TYPE_PAUSE = 4;
private PictureInPictureParams.Builder builder;
public Pip() {
if (!Utils.hasPIP()) return;
this.builder = new PictureInPictureParams.Builder();
}
public void update(Activity activity, View view) {
if (!Utils.hasPIP()) return;
Rect sourceRectHint = new Rect();
view.getGlobalVisibleRect(sourceRectHint);
builder.setSourceRectHint(sourceRectHint);
activity.setPictureInPictureParams(builder.build());
}
public void update(Activity activity, boolean play) {
if (!Utils.hasPIP()) return;
List<RemoteAction> actions = new ArrayList<>();
int icon = play ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play;
actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_PREV, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PREV), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)));
actions.add(new RemoteAction(Icon.createWithResource(activity, icon), "", "", PendingIntent.getBroadcast(activity, play ? CONTROL_TYPE_PAUSE : CONTROL_TYPE_PLAY, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, play ? CONTROL_TYPE_PAUSE : CONTROL_TYPE_PLAY), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)));
actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_next), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_NEXT, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_NEXT), PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE)));
activity.setPictureInPictureParams(builder.setActions(actions).build());
}
public void enter(Activity activity, boolean four) {
try {
if (!Utils.hasPIP() || activity.isInPictureInPictureMode()) return;
builder.setAspectRatio(new Rational(four ? 4 : 16, four ? 3 : 9));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) builder.setAutoEnterEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) builder.setSeamlessResizeEnabled(true);
activity.enterPictureInPictureMode(builder.build());
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -2,6 +2,7 @@ package com.fongmi.android.tv.ui.custom.dialog;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import androidx.appcompat.app.AlertDialog;
@ -14,6 +15,7 @@ import com.fongmi.android.tv.api.WallConfig;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.databinding.DialogConfigBinding;
import com.fongmi.android.tv.impl.ConfigCallback;
import com.fongmi.android.tv.utils.FileChooser;
import com.fongmi.android.tv.utils.Utils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@ -21,6 +23,7 @@ public class ConfigDialog {
private final DialogConfigBinding binding;
private final ConfigCallback callback;
private final Fragment fragment;
private AlertDialog dialog;
private String url;
private int type;
@ -35,6 +38,7 @@ public class ConfigDialog {
}
public ConfigDialog(Fragment fragment) {
this.fragment = fragment;
this.callback = (ConfigCallback) fragment;
this.binding = DialogConfigBinding.inflate(LayoutInflater.from(fragment.getContext()));
}
@ -54,6 +58,7 @@ public class ConfigDialog {
private void initView() {
binding.text.setText(url = getUrl());
binding.text.setSelection(url.length());
binding.input.setEndIconOnClickListener(this::onChoose);
}
private void initEvent() {
@ -76,6 +81,11 @@ public class ConfigDialog {
}
}
private void onChoose(View view) {
FileChooser.from(fragment).show();
dialog.dismiss();
}
private void onPositive(DialogInterface dialog, int which) {
String text = Utils.checkClan(binding.text.getText().toString().trim());
if (text.isEmpty()) Config.delete(url, type);

@ -1,6 +1,8 @@
package com.fongmi.android.tv.ui.fragment;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.ViewGroup;
@ -28,6 +30,8 @@ import com.fongmi.android.tv.ui.custom.dialog.ConfigDialog;
import com.fongmi.android.tv.ui.custom.dialog.HistoryDialog;
import com.fongmi.android.tv.ui.custom.dialog.LiveDialog;
import com.fongmi.android.tv.ui.custom.dialog.SiteDialog;
import com.fongmi.android.tv.utils.FileChooser;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.Prefers;
import com.fongmi.android.tv.utils.ResUtil;
@ -38,7 +42,7 @@ import com.permissionx.guolindev.PermissionX;
public class SettingFragment extends BaseFragment implements ConfigCallback, SiteCallback, LiveCallback {
private FragmentSettingBinding mBinding;
private Config config;
private int type;
public static SettingFragment newInstance() {
return new SettingFragment();
@ -66,11 +70,11 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
protected void initEvent() {
mBinding.vodHome.setOnClickListener(view -> SiteDialog.create(this).all().show());
mBinding.liveHome.setOnClickListener(view -> LiveDialog.create(this).show());
mBinding.vod.setOnClickListener(view -> ConfigDialog.create(this).type(0).show());
mBinding.live.setOnClickListener(view -> ConfigDialog.create(this).type(1).show());
mBinding.wall.setOnClickListener(view -> ConfigDialog.create(this).type(2).show());
mBinding.vodHistory.setOnClickListener(view -> HistoryDialog.create(this).type(0).show());
mBinding.liveHistory.setOnClickListener(view -> HistoryDialog.create(this).type(1).show());
mBinding.vod.setOnClickListener(view -> ConfigDialog.create(this).type(type = 0).show());
mBinding.live.setOnClickListener(view -> ConfigDialog.create(this).type(type = 1).show());
mBinding.wall.setOnClickListener(view -> ConfigDialog.create(this).type(type = 2).show());
mBinding.vodHistory.setOnClickListener(view -> HistoryDialog.create(this).type(type = 0).show());
mBinding.liveHistory.setOnClickListener(view -> HistoryDialog.create(this).type(type = 1).show());
mBinding.wallDefault.setOnClickListener(view -> setWallDefault());
mBinding.wallRefresh.setOnClickListener(view -> setWallRefresh());
mBinding.version.setOnLongClickListener(view -> onVersion(true));
@ -84,38 +88,37 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
@Override
public void setConfig(Config config) {
this.config = config;
checkPermission();
checkPermission(config);
}
private void checkPermission() {
private void checkPermission(Config config) {
if (config.getUrl().startsWith("file") && !Utils.hasPermission(getActivity())) {
PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> loadConfig());
PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> load(config));
} else {
loadConfig();
load(config);
}
}
private void loadConfig() {
private void load(Config config) {
switch (config.getType()) {
case 0:
Notify.progress(getActivity(), true);
mBinding.vodUrl.setText(config.getUrl());
ApiConfig.get().clear().config(config).load(getCallback());
ApiConfig.get().clear().config(config).load(getCallback(config));
break;
case 1:
Notify.progress(getActivity(), true);
mBinding.liveUrl.setText(config.getUrl());
LiveConfig.get().clear().config(config).load(getCallback());
LiveConfig.get().clear().config(config).load(getCallback(config));
break;
case 2:
mBinding.wallUrl.setText(config.getUrl());
WallConfig.get().clear().config(config).load(getCallback());
WallConfig.get().clear().config(config).load(getCallback(config));
break;
}
}
private Callback getCallback() {
private Callback getCallback(Config config) {
return new Callback() {
@Override
public void success() {
@ -132,7 +135,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
}
private void setConfig() {
switch (config.getType()) {
switch (type) {
case 0:
Notify.dismiss();
RefreshEvent.video();
@ -218,4 +221,11 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
private void setWallRefresh() {
WallConfig.get().load();
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK || requestCode != FileChooser.REQUEST_PICK_FILE) return;
setConfig(Config.find("file:/" + FileChooser.getPathFromUri(getContext(), data.getData()).replace(FileUtil.getRootPath(), ""), type));
}
}

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/grey_500"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M20,6h-8l-1.41,-1.41C10.21,4.21 9.7,4 9.17,4L4,4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,8c0,-1.1 -0.9,-2 -2,-2zM19,18L5,18c-0.55,0 -1,-0.45 -1,-1L4,9c0,-0.55 0.45,-1 1,-1h14c0.55,0 1,0.45 1,1v8c0,0.55 -0.45,1 -1,1z" />
</vector>

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="?android:attr/selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<com.google.android.material.imageview.ShapeableImageView
android:id="@+id/image"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginEnd="12dp"
android:scaleType="fitCenter"
app:shapeAppearanceOverlay="@style/Vod.Grid"
tools:src="@drawable/ic_img_error" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:shadowColor="@color/grey_200"
android:shadowDx="1"
android:shadowDy="1"
android:shadowRadius="0.5"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="蜘蛛人" />
<TextView
android:id="@+id/remark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:shadowColor="@color/grey_200"
android:shadowDx="1"
android:shadowDy="1"
android:shadowRadius="0.5"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="12sp"
tools:text="1080p" />
</LinearLayout>
</LinearLayout>

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
@ -9,9 +10,12 @@
android:paddingBottom="16dp">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/dialog_config_hint">
android:hint="@string/dialog_config_hint"
app:endIconDrawable="@drawable/ic_config_choose"
app:endIconMode="custom">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/text"

@ -0,0 +1,236 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="倍速"
android:textColor="@color/black"
android:textSize="16sp" />
<com.google.android.material.slider.Slider
android:id="@+id/speed"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/accent"
android:stepSize="0.25"
android:valueFrom="1"
android:valueTo="5"
app:haloColor="@color/blue_500"
app:thumbColor="@color/blue_500"
app:tickColor="@color/transparent"
app:trackColorActive="@color/blue_500"
app:trackColorInactive="@color/blue_50" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:text="縮放"
android:textColor="@color/black"
android:textSize="16sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/scale_0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:tag="0"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="預設" />
<TextView
android:id="@+id/scale_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:tag="1"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="16:9" />
<TextView
android:id="@+id/scale_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:tag="2"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="4:3" />
<TextView
android:id="@+id/scale_3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:tag="3"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="填充" />
<TextView
android:id="@+id/scale_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:tag="4"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="裁剪" />
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:text="播放"
android:textColor="@color/black"
android:textSize="16sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/player"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="EXO" />
<TextView
android:id="@+id/decode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="硬解" />
<TextView
android:id="@+id/opening"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="片頭" />
<TextView
android:id="@+id/ending"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="0dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:textColor="@color/white"
android:textSize="14sp"
tools:text="片尾" />
</LinearLayout>
<TextView
android:id="@+id/track"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:text="軌道"
android:textColor="@color/black"
android:textSize="16sp"
android:visibility="gone"
tools:visibility="visible" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:tag="3"
android:text="@string/play_track_text"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:tag="1"
android:text="@string/play_track_audio"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_accent"
android:foreground="?android:attr/selectableItemBackground"
android:gravity="center"
android:tag="2"
android:text="@string/play_track_video"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:visibility="visible" />
</LinearLayout>
</LinearLayout>
Loading…
Cancel
Save