适配竖屏

This commit is contained in:
sifacaii 2023-05-15 17:39:30 +08:00
parent fd5832a18e
commit 2dcf93f007
4 changed files with 542 additions and 22 deletions

View File

@ -4,11 +4,13 @@ import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.text.Html; import android.text.Html;
import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import com.google.android.material.tabs.TabLayout;
import com.owen.tvrecyclerview.widget.V7GridLayoutManager; import com.owen.tvrecyclerview.widget.V7GridLayoutManager;
import com.owen.tvrecyclerview.widget.V7LinearLayoutManager; import com.owen.tvrecyclerview.widget.V7LinearLayoutManager;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
@ -36,10 +38,10 @@ public class DetailActivity extends BaseActivity implements JAdapter.OnItemClick
private ImageView tvCover; private ImageView tvCover;
private TextView tvTitle; private TextView tvTitle;
private TextView tvDetails; private TextView tvDetails;
private ImageView tvPlay;
private JRecyclerView mGridView; private JRecyclerView mGridView;
private JRecyclerView mPeopleGridView; private JRecyclerView mPeopleGridView;
private LinearLayout tvPeopleLayout; private LinearLayout tvPeopleLayout;
private TabLayout tabContainer;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -58,10 +60,10 @@ public class DetailActivity extends BaseActivity implements JAdapter.OnItemClick
tvCover = findViewById(R.id.tvCover); tvCover = findViewById(R.id.tvCover);
tvTitle = findViewById(R.id.tvTitle); tvTitle = findViewById(R.id.tvTitle);
tvDetails = findViewById(R.id.tvDetails); tvDetails = findViewById(R.id.tvDetails);
tvPlay = findViewById(R.id.tvPlay);
mGridView = findViewById(R.id.mGridView); mGridView = findViewById(R.id.mGridView);
tvPeopleLayout = findViewById(R.id.tvPersonLayout); tvPeopleLayout = findViewById(R.id.tvPersonLayout);
mPeopleGridView = findViewById(R.id.mPersonGridView); mPeopleGridView = findViewById(R.id.mPersonGridView);
tabContainer = findViewById(R.id.tab_container);
Intent intent = getIntent(); Intent intent = getIntent();
ItemId = intent.getStringExtra("itemId"); ItemId = intent.getStringExtra("itemId");
@ -213,15 +215,45 @@ public class DetailActivity extends BaseActivity implements JAdapter.OnItemClick
} }
private void fillItems(List<Item> items) { private void fillItems(List<Item> items) {
JAdapter jAdapter = new JAdapter(items, false); for (Item item:items) {
V7LinearLayoutManager layoutManager = new V7LinearLayoutManager(mGridView.getContext()); TabLayout.Tab tab = tabContainer.newTab();
layoutManager.setOrientation(V7LinearLayoutManager.HORIZONTAL); tab.setText(item.getName());
jAdapter.setOnItemClickListener(this); tab.view.setTag(item);
mGridView.setVisibility(View.VISIBLE); tab.view.setOnClickListener(new View.OnClickListener() {
mGridView.setLayoutManager(layoutManager); @Override
mGridView.setAdapter(jAdapter); public void onClick(View view) {
Item it = (Item)view.getTag();
Log.d(TAG, "onClick: " + it.getName());
}
});
tabContainer.addTab(tab);
}
tabContainer.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
Log.d(TAG, "onTabSelected: " );
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
// JAdapter jAdapter = new JAdapter(items, false);
// V7LinearLayoutManager layoutManager = new V7LinearLayoutManager(mGridView.getContext());
// layoutManager.setOrientation(V7LinearLayoutManager.HORIZONTAL);
// jAdapter.setOnItemClickListener(this);
// mGridView.setVisibility(View.VISIBLE);
// mGridView.setLayoutManager(layoutManager);
// mGridView.setAdapter(jAdapter);
dismissLoadingDialog(); dismissLoadingDialog();
mGridView.requestFocus(); tabContainer.requestFocus();
// mGridView.requestFocus();
} }
/** /**
@ -284,7 +316,7 @@ public class DetailActivity extends BaseActivity implements JAdapter.OnItemClick
mGridView.setLayoutManager(layoutManager); mGridView.setLayoutManager(layoutManager);
mGridView.setAdapter(jAdapter); mGridView.setAdapter(jAdapter);
dismissLoadingDialog(); dismissLoadingDialog();
mGridView.requestFocus(); //mGridView.requestFocus();
} }
}, errcb); }, errcb);
} }

View File

@ -0,0 +1,367 @@
package org.sifacai.vlcjellyfin.Ui;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.owen.tvrecyclerview.widget.V7GridLayoutManager;
import com.owen.tvrecyclerview.widget.V7LinearLayoutManager;
import com.squareup.picasso.Picasso;
import org.sifacai.vlcjellyfin.Bean.ImageTags;
import org.sifacai.vlcjellyfin.Bean.Item;
import org.sifacai.vlcjellyfin.Bean.Items;
import org.sifacai.vlcjellyfin.Bean.MediaStreams;
import org.sifacai.vlcjellyfin.Bean.People;
import org.sifacai.vlcjellyfin.Bean.UserData;
import org.sifacai.vlcjellyfin.Component.JAdapter;
import org.sifacai.vlcjellyfin.Component.JRecyclerView;
import org.sifacai.vlcjellyfin.Player.Video;
import org.sifacai.vlcjellyfin.Player.VlcPlayerActivity;
import org.sifacai.vlcjellyfin.R;
import org.sifacai.vlcjellyfin.Utils.JfClient;
import org.sifacai.vlcjellyfin.Utils.Utils;
import java.util.ArrayList;
import java.util.List;
public class DetailActivityP extends BaseActivity implements JAdapter.OnItemClickListener {
private String TAG = "详情:";
private String ItemId;
private ImageView tvCover;
private TextView tvTitle;
private TextView tvDetails;
private ImageView tvPlay;
private JRecyclerView mGridView;
private JRecyclerView mPeopleGridView;
private LinearLayout tvPeopleLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_p);
getSupportActionBar().hide();
if (JfClient.UserId.equals("") || JfClient.AccessToken.equals("")) {
finish();
}
init();
}
private void init() {
tvCover = findViewById(R.id.tvCover);
tvTitle = findViewById(R.id.tvTitle);
tvDetails = findViewById(R.id.tvDetails);
tvPlay = findViewById(R.id.tvPlay);
mGridView = findViewById(R.id.mGridView);
tvPeopleLayout = findViewById(R.id.tvPersonLayout);
mPeopleGridView = findViewById(R.id.mPersonGridView);
Intent intent = getIntent();
ItemId = intent.getStringExtra("itemId");
if (ItemId.equals("")) {
finish();
} else {
showLoadingDialog("加载中……");
initData(ItemId);
}
}
private void initData(String itemId) {
JfClient.GetItemInfo(itemId, new JfClient.JJCallBack() {
@Override
public void onSuccess(Item item) {
fillDetails(item);
}
}, new JfClient.JJCallBack() {
@Override
public void onError(String str) {
errcb.onError(str);
finish();
}
});
}
private void fillDetails(Item details) {
String Id = details.getId();
String Name = details.getName();
String imgurl = JfClient.GetImgUrl(Id, details.getImageTags() == null ? "" : details.getImageTags().getPrimary());
Picasso.get()
.load(imgurl)
.placeholder(R.drawable.img_loading_placeholder)
.error(R.drawable.img_loading_placeholder)
.into(tvCover);
String Genres = String.join(",", details.getGenres());
tvTitle.setText(Name);
tvDetails.append(details.getProductionYear() == null ? "" : "年份:" + details.getProductionYear() + " ");
tvDetails.append(Genres.equals("") ? "" : "风格:" + Genres + "\n");
tvDetails.append(details.getCommunityRating() == null ? "" : "评分:" + details.getCommunityRating() + " ");
tvDetails.append(details.getOfficialRating() == null ? "" : "评级:" + details.getOfficialRating() + "\n");
if (details.getMediaStreams() != null) {
String video = "";
String audio = "";
String subtitle = "";
for (int i = 0; i < details.getMediaStreams().size(); i++) {
MediaStreams ms = details.getMediaStreams().get(i);
String mstype = ms.getType();
if (mstype.equals("Video")) {
video += ms.getDisplayTitle();
} else if (mstype.equals("Audio")) {
if (ms.getLanguage()!=null && !ms.getLanguage().equals("")) audio += ms.getLanguage() + "";
else audio += ms.getCodec() + "";
} else if (mstype.equals("Subtitle")) {
if (ms.getLanguage() != null && !ms.getLanguage().equals("")) subtitle += ms.getLanguage() + "";
else subtitle += ms.getCodec() + "";
}
}
tvDetails.append(video.equals("") ? "" : "视频:" + video + "\n");
tvDetails.append(audio.equals("") ? "" : "音频:" + audio + "\n");
tvDetails.append(subtitle.equals("") ? "" : "字幕:" + subtitle + "\n");
}
String overview = details.getOverview() == null ? "" : details.getOverview();
tvDetails.append("简介: " + Html.fromHtml(overview));
//填充列表
String type = details.getType();
if (type.equals("Series")) {
fillSeason(ItemId);
} else if (type.equals("Season")) {
String SeriesName = details.getSeriesName() == null ? "" : details.getSeriesName() + "-";
tvTitle.setText(SeriesName + details.getName());
String SeriesId = details.getSeriesId();
fillEpisodes(SeriesId, ItemId);
} else if (type.equals("Episode")) {
String SeriesName = details.getSeriesName() == null ? "" : details.getSeriesName() + "-";
String SeasonName = details.getSeasonName() == null ? "" : details.getSeasonName();
tvTitle.setText(SeriesName + SeasonName);
String SeriesId = details.getSeriesId();
String SeasonId = details.getSeasonId();
fillEpisodes(SeriesId, SeasonId);
} else if (type.equals("Movie")) {
fillMovie(details);
} else if (type.equals("Person")) {
tvDetails.append("\n出生日期" + Utils.UtcToLocal(details.getPremiereDate()) + "\n");
if(null != details.getProductionLocations()) {
tvDetails.append("出生地:" + String.join(",", details.getProductionLocations()));
}
fillItemsByPerson(Id);
}
List<People> Peoples = details.getPeople();
if (Peoples != null) {
if (Peoples.size() > 0) {
fillPeople(Peoples);
}
}
}
private void fillMovie(Item item) {
item.setName("播放: " + item.getName());
List<Item> plist = new ArrayList<>();
plist.add(item);
if (item.getPartCount() > 0) {
JfClient.GetAddPart(item.getId(), new JfClient.JJCallBack() {
@Override
public void onSuccess(Items parts) {
plist.addAll(parts.getItems());
fillItems(plist);
}
}, null);
} else {
fillItems(plist);
}
}
/**
* 填充季
*
* @param SeriesId
*/
private void fillSeason(String SeriesId) {
JfClient.GetSeasons(SeriesId, new JfClient.JJCallBack() {
@Override
public void onSuccess(Items seasons) {
fillItems(seasons.getItems());
}
}, errcb);
}
/**
* 填充集
*
* @param SeriesId
* @param SeasonId
* @return
*/
private void fillEpisodes(String SeriesId, String SeasonId) {
JfClient.GetEpisodes(SeriesId, SeasonId, new JfClient.JJCallBack() {
@Override
public void onSuccess(Items episodes) {
fillItems(episodes.getItems());
}
}, errcb);
}
private void fillItems(List<Item> items) {
JAdapter jAdapter = new JAdapter(items, false);
V7LinearLayoutManager layoutManager = new V7LinearLayoutManager(mGridView.getContext());
layoutManager.setOrientation(V7LinearLayoutManager.HORIZONTAL);
jAdapter.setOnItemClickListener(this);
mGridView.setVisibility(View.VISIBLE);
mGridView.setLayoutManager(layoutManager);
mGridView.setAdapter(jAdapter);
dismissLoadingDialog();
mGridView.requestFocus();
}
/**
* 填充演员表
*
* @param Peoples
*/
private void fillPeople(List<People> Peoples) {
List<Item> Pitems = new ArrayList<>();
for (People p : Peoples) {
Item it = new Item();
it.setId(p.getId());
if (p.getType().equals("Director")) {
it.setName("导演:" + p.getName());
} else if (p.getType().equals("Actor")) {
it.setName("演员:" + p.getName());
} else {
it.setName(p.getName());
}
it.setType(p.getType());
it.setImageTags(new ImageTags());
it.getImageTags().setPrimary(p.getPrimaryImageTag());
Pitems.add(it);
}
tvPeopleLayout.setVisibility(View.VISIBLE);
JAdapter jAdapter = new JAdapter(Pitems, false);
V7LinearLayoutManager layoutManager = new V7LinearLayoutManager(mPeopleGridView.getContext());
layoutManager.setOrientation(V7LinearLayoutManager.HORIZONTAL);
jAdapter.setOnItemClickListener(this);
mPeopleGridView.setLayoutManager(layoutManager);
mPeopleGridView.setAdapter(jAdapter);
}
/**
* 填充演员作品
*
* @param personid
*/
private void fillItemsByPerson(String personid) {
String Term = "&SortBy=DateCreated&SortOrder=Descending&PersonIds=" + personid;
Term += "&IncludeItemTypes=Movie,Series";
JfClient.GetItemsByTerm(Term, new JfClient.JJCallBack() {
@Override
public void onSuccess(Items iitems) {
((TextView) findViewById(R.id.tvListTitle)).setText("演员作品:");
List<Item> items = iitems.getItems();
JAdapter jAdapter = new JAdapter(items, false);
V7GridLayoutManager layoutManager = new V7GridLayoutManager(mGridView.getContext(), 4);
jAdapter.setOnItemClickListener(new JAdapter.OnItemClickListener() {
@Override
public void onClick(Item item) {
String itemId = item.getId();
Intent intent = new Intent(DetailActivityP.this, DetailActivityP.class);
intent.putExtra("itemId", itemId);
startActivity(intent);
}
});
mGridView.setVisibility(View.VISIBLE);
mGridView.setLayoutManager(layoutManager);
mGridView.setAdapter(jAdapter);
dismissLoadingDialog();
mGridView.requestFocus();
}
}, errcb);
}
@Override
public void onClick(Item item) {
String itemId = item.getId();
String type = item.getType();
Intent intent = null;
if (type.equals("Season")) {
intent = new Intent(this, DetailActivityP.class);
intent.putExtra("itemId", itemId);
startActivity(intent);
} else if (type.equals("Episode")) {
JfClient.playList.clear();
JAdapter JA = (JAdapter) mGridView.getAdapter();
List<Item> ja = JA.getData();
if (ja != null) {
for (int i = 0; i < ja.size(); i++) {
Video media = getMedia(ja.get(i));
JfClient.playList.add(media);
if (itemId.equals(media.Id)) {
JfClient.playIndex = i;
}
}
toVlcPlayer();
}
} else if (type.equals("Movie") || type.equals("Video")) {
JfClient.playList.clear();
JfClient.playList.add(getMedia(item));
JfClient.playIndex = 0;
toVlcPlayer();
} else if (type.equals("Actor") || type.equals("Director")) {
intent = new Intent(this, DetailActivityP.class);
intent.putExtra("itemId", itemId);
startActivity(intent);
}
}
/**
* 组合播放媒体
*
* @param item
* @return
*/
public Video getMedia(Item item) {
Video media = new Video();
media.Id = item.getId();
media.Name = item.getName();
media.cover = "";
media.Url = JfClient.GetPlayUrl(media.Id);
if (item.getUserData() != null) {
UserData userdata = item.getUserData();
media.startPositionTicks = userdata.getPlaybackPositionTicks();
}
return media;
}
public void toVlcPlayer() {
Intent intent;
if(JfClient.config.isExtensionPlayer()){
String videourl = JfClient.playList.get(JfClient.playIndex).Url;
Uri uri = Uri.parse(videourl);
intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(uri,"video/mp4");
}else{
intent = new Intent(this, VlcPlayerActivity.class);
}
this.startActivity(intent);
}
private JfClient.JJCallBack errcb = new JfClient.JJCallBack() {
@Override
public void onError(String str) {
ShowToask(str);
dismissLoadingDialog();
}
};
}

View File

@ -62,17 +62,13 @@
android:layout_marginTop="30dp" android:layout_marginTop="30dp"
android:text="播放列表:" /> android:text="播放列表:" />
<ImageView <com.google.android.material.tabs.TabLayout
android:id="@+id/tvPlay" android:id="@+id/tab_container"
android:layout_width="160dp" android:layout_width="match_parent"
android:layout_height="60dp" android:layout_height="wrap_content"
android:layout_marginLeft="50dp" app:tabGravity="fill">
android:background="@drawable/shape_user_focus_vholder"
android:focusable="true" </com.google.android.material.tabs.TabLayout>
android:padding="10dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_outline_play_circle_outline_128"
android:visibility="gone" />
<org.sifacai.vlcjellyfin.Component.JRecyclerView <org.sifacai.vlcjellyfin.Component.JRecyclerView
android:id="@+id/mGridView" android:id="@+id/mGridView"

View File

@ -0,0 +1,125 @@
<?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:padding="@dimen/padding_border"
tools:context=".Ui.DetailActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="vertical"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/tvCover"
android:layout_width="420dp"
android:layout_height="620dp"
android:scaleType="fitXY"
app:srcCompat="@drawable/icon_img_placeholder" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="@dimen/padding_border"
android:paddingTop="6dp"
android:paddingRight="@dimen/padding_border"
android:paddingBottom="6dp">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="38dp"
android:text="标题:"
android:textColor="@android:color/white"
android:textSize="30dp" />
<TextView
android:id="@+id/tvDetails"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="200dp"
android:layout_marginTop="20dp"
android:textSize="20dp" />
<TextView
android:id="@+id/tvListTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="播放列表:" />
<ImageView
android:id="@+id/tvPlay"
android:layout_width="160dp"
android:layout_height="60dp"
android:layout_marginLeft="50dp"
android:background="@drawable/shape_user_focus_vholder"
android:focusable="true"
android:padding="10dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_outline_play_circle_outline_128"
android:visibility="gone" />
<org.sifacai.vlcjellyfin.Component.JRecyclerView
android:id="@+id/mGridView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:padding="@dimen/padding_border"
android:visibility="gone"
app:tv_horizontalSpacingWithMargins="@dimen/vh_space_width"
app:tv_selectedItemIsCentered="true"
app:tv_verticalSpacingWithMargins="@dimen/vh_space_width" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/tvPersonLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone" >
<TextView
android:text="演员表:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"/>
<org.sifacai.vlcjellyfin.Component.JRecyclerView
android:id="@+id/mPersonGridView"
android:layout_width="match_parent"
android:layout_height="312dp"
android:clipChildren="false"
android:clipToPadding="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:padding="@dimen/padding_border"
app:tv_horizontalSpacingWithMargins="@dimen/vh_space_width"
app:tv_selectedItemIsCentered="true"
app:tv_verticalSpacingWithMargins="@dimen/vh_space_width" />
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>