From 2dcf93f00777284a5a9098827664fcb05aecff45 Mon Sep 17 00:00:00 2001 From: sifacaii Date: Mon, 15 May 2023 17:39:30 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8D=E7=AB=96=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vlcjellyfin/Ui/DetailActivity.java | 54 ++- .../vlcjellyfin/Ui/DetailActivityP.java | 367 ++++++++++++++++++ app/src/main/res/layout/activity_detail.xml | 18 +- app/src/main/res/layout/activity_detail_p.xml | 125 ++++++ 4 files changed, 542 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/org/sifacai/vlcjellyfin/Ui/DetailActivityP.java create mode 100644 app/src/main/res/layout/activity_detail_p.xml diff --git a/app/src/main/java/org/sifacai/vlcjellyfin/Ui/DetailActivity.java b/app/src/main/java/org/sifacai/vlcjellyfin/Ui/DetailActivity.java index 4f7072b..ed92166 100644 --- a/app/src/main/java/org/sifacai/vlcjellyfin/Ui/DetailActivity.java +++ b/app/src/main/java/org/sifacai/vlcjellyfin/Ui/DetailActivity.java @@ -4,11 +4,13 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.text.Html; +import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import com.google.android.material.tabs.TabLayout; import com.owen.tvrecyclerview.widget.V7GridLayoutManager; import com.owen.tvrecyclerview.widget.V7LinearLayoutManager; import com.squareup.picasso.Picasso; @@ -36,10 +38,10 @@ public class DetailActivity extends BaseActivity implements JAdapter.OnItemClick private ImageView tvCover; private TextView tvTitle; private TextView tvDetails; - private ImageView tvPlay; private JRecyclerView mGridView; private JRecyclerView mPeopleGridView; private LinearLayout tvPeopleLayout; + private TabLayout tabContainer; @Override protected void onCreate(Bundle savedInstanceState) { @@ -58,10 +60,10 @@ public class DetailActivity extends BaseActivity implements JAdapter.OnItemClick 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); + tabContainer = findViewById(R.id.tab_container); Intent intent = getIntent(); ItemId = intent.getStringExtra("itemId"); @@ -213,15 +215,45 @@ public class DetailActivity extends BaseActivity implements JAdapter.OnItemClick } private void fillItems(List 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); + for (Item item:items) { + TabLayout.Tab tab = tabContainer.newTab(); + tab.setText(item.getName()); + tab.view.setTag(item); + tab.view.setOnClickListener(new View.OnClickListener() { + @Override + 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(); - mGridView.requestFocus(); + tabContainer.requestFocus(); +// mGridView.requestFocus(); } /** @@ -284,7 +316,7 @@ public class DetailActivity extends BaseActivity implements JAdapter.OnItemClick mGridView.setLayoutManager(layoutManager); mGridView.setAdapter(jAdapter); dismissLoadingDialog(); - mGridView.requestFocus(); + //mGridView.requestFocus(); } }, errcb); } diff --git a/app/src/main/java/org/sifacai/vlcjellyfin/Ui/DetailActivityP.java b/app/src/main/java/org/sifacai/vlcjellyfin/Ui/DetailActivityP.java new file mode 100644 index 0000000..6b8ce2d --- /dev/null +++ b/app/src/main/java/org/sifacai/vlcjellyfin/Ui/DetailActivityP.java @@ -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 Peoples = details.getPeople(); + if (Peoples != null) { + if (Peoples.size() > 0) { + fillPeople(Peoples); + } + } + } + + private void fillMovie(Item item) { + + item.setName("播放: " + item.getName()); + List 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 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 Peoples) { + List 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 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 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(); + } + }; +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index 6091670..6ce56ad 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -62,17 +62,13 @@ android:layout_marginTop="30dp" android:text="播放列表:" /> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file