Skip to content

Commit b865326

Browse files
committed
added ability to show similar videos
1 parent 1850dee commit b865326

14 files changed

Lines changed: 225 additions & 73 deletions

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ dependencies {
2323
compile fileTree(include: ['*.jar'], dir: 'libs')
2424
compile 'com.android.support:appcompat-v7:23.1.0'
2525
compile 'com.android.support:support-v4:23.1.0'
26+
compile 'com.android.support:design:23.1.0'
2627
compile 'org.jsoup:jsoup:1.8.3'
2728
compile 'org.mozilla:rhino:1.7.7'
28-
compile 'com.android.support:design:23.1.0'
2929
}

app/src/main/java/org/schabi/newpipe/ActionBarHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public void setupNavMenu(AppCompatActivity activity) {
6969
public void setStreams(VideoInfo.VideoStream[] videoStreams, VideoInfo.AudioStream[] audioStreams) {
7070
this.videoStreams = videoStreams;
7171
selectedStream = 0;
72+
defaultPreferences = PreferenceManager.getDefaultSharedPreferences(activity);
7273
String[] itemArray = new String[videoStreams.length];
7374
String defaultResolution = defaultPreferences
7475
.getString(activity.getString(R.string.defaultResolutionPreference),
@@ -93,7 +94,7 @@ public void setStreams(VideoInfo.VideoStream[] videoStreams, VideoInfo.AudioStre
9394

9495
// set audioStream
9596
audioStream = null;
96-
String preferedFormat = PreferenceManager.getDefaultSharedPreferences(activity)
97+
String preferedFormat = defaultPreferences
9798
.getString(activity.getString(R.string.defaultAudioFormatPreference), "webm");
9899
if(preferedFormat.equals("webm")) {
99100
for(VideoInfo.AudioStream s : audioStreams) {

app/src/main/java/org/schabi/newpipe/VideoInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,6 @@ public AudioStream(String url, int format, int bandwidth, int samplingRate) {
140140
public VideoStream[] videoStreams = null;
141141
public AudioStream[] audioStreams = null;
142142
public VideoInfoItem nextVideo = null;
143-
public Vector<VideoInfoItem> relatedVideos = null;
143+
public VideoInfoItem[] relatedVideos = null;
144144
public int videoAvailableStatus = VIDEO_AVAILABLE;
145145
}

app/src/main/java/org/schabi/newpipe/VideoInfoItem.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.schabi.newpipe;
22

33
import android.graphics.Bitmap;
4+
import android.os.Parcel;
5+
import android.os.Parcelable;
46

57
/**
68
* Created by Christian Schabesberger on 26.08.15.
@@ -22,7 +24,7 @@
2224
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
2325
*/
2426

25-
public class VideoInfoItem {
27+
public class VideoInfoItem implements Parcelable {
2628
public String id = "";
2729
public String title = "";
2830
public String uploader = "";
@@ -32,4 +34,51 @@ public class VideoInfoItem {
3234
public String webpage_url = "";
3335
public String upload_date = "";
3436
public String view_count = "";
37+
38+
protected VideoInfoItem(Parcel in) {
39+
id = in.readString();
40+
title = in.readString();
41+
uploader = in.readString();
42+
duration = in.readString();
43+
thumbnail_url = in.readString();
44+
thumbnail = (Bitmap) in.readValue(Bitmap.class.getClassLoader());
45+
webpage_url = in.readString();
46+
upload_date = in.readString();
47+
view_count = in.readString();
48+
}
49+
50+
public VideoInfoItem() {
51+
52+
}
53+
54+
@Override
55+
public int describeContents() {
56+
return 0;
57+
}
58+
59+
@Override
60+
public void writeToParcel(Parcel dest, int flags) {
61+
dest.writeString(id);
62+
dest.writeString(title);
63+
dest.writeString(uploader);
64+
dest.writeString(duration);
65+
dest.writeString(thumbnail_url);
66+
dest.writeValue(thumbnail);
67+
dest.writeString(webpage_url);
68+
dest.writeString(upload_date);
69+
dest.writeString(view_count);
70+
}
71+
72+
@SuppressWarnings("unused")
73+
public static final Parcelable.Creator<VideoInfoItem> CREATOR = new Parcelable.Creator<VideoInfoItem>() {
74+
@Override
75+
public VideoInfoItem createFromParcel(Parcel in) {
76+
return new VideoInfoItem(in);
77+
}
78+
79+
@Override
80+
public VideoInfoItem[] newArray(int size) {
81+
return new VideoInfoItem[size];
82+
}
83+
};
3584
}

app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public class VideoItemDetailActivity extends AppCompatActivity {
3737

3838
private String videoUrl;
3939
private int currentStreamingService = -1;
40-
private Menu menu = null;
4140

4241
protected void onCreate(Bundle savedInstanceState) {
4342
super.onCreate(savedInstanceState);

app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ private class ExtractorRunnable implements Runnable {
8181
private Handler h = new Handler();
8282
private Class extractorClass;
8383
private String videoUrl;
84-
public ExtractorRunnable(String videoUrl, Class extractorClass, VideoItemDetailFragment f) {
84+
public ExtractorRunnable(String videoUrl, Class extractorClass) {
8585
this.extractorClass = extractorClass;
8686
this.videoUrl = videoUrl;
8787
}
@@ -96,18 +96,21 @@ public void run() {
9696
BitmapFactory.decodeStream(
9797
new URL(videoInfo.thumbnail_url)
9898
.openConnection()
99-
.getInputStream()), SetThumbnailRunnable.VIDEO_THUMBNAIL));
99+
.getInputStream()),
100+
SetThumbnailRunnable.VIDEO_THUMBNAIL));
100101
h.post(new SetThumbnailRunnable(
101102
BitmapFactory.decodeStream(
102103
new URL(videoInfo.uploader_thumbnail_url)
103104
.openConnection()
104-
.getInputStream()), SetThumbnailRunnable.CHANNEL_THUMBNAIL));
105+
.getInputStream()),
106+
SetThumbnailRunnable.CHANNEL_THUMBNAIL));
105107
if(showNextVideoItem) {
106108
h.post(new SetThumbnailRunnable(
107109
BitmapFactory.decodeStream(
108110
new URL(videoInfo.nextVideo.thumbnail_url)
109111
.openConnection()
110-
.getInputStream()), SetThumbnailRunnable.NEXT_VIDEO_THUMBNAIL));
112+
.getInputStream()),
113+
SetThumbnailRunnable.NEXT_VIDEO_THUMBNAIL));
111114
}
112115
}
113116
} catch (Exception e) {
@@ -176,29 +179,28 @@ public void updateThumbnail(Bitmap thumbnail, int id) {
176179
}
177180

178181
public void updateInfo(VideoInfo info) {
179-
Activity a = getActivity();
180182
currentVideoInfo = info;
181183
try {
182184
VideoInfoItemViewCreator videoItemViewCreator =
183185
new VideoInfoItemViewCreator(LayoutInflater.from(getActivity()));
184186

185-
ScrollView contentMainView = (ScrollView) a.findViewById(R.id.detailMainContent);
186-
ProgressBar progressBar = (ProgressBar) a.findViewById(R.id.detailProgressBar);
187-
TextView videoTitleView = (TextView) a.findViewById(R.id.detailVideoTitleView);
188-
TextView uploaderView = (TextView) a.findViewById(R.id.detailUploaderView);
189-
TextView viewCountView = (TextView) a.findViewById(R.id.detailViewCountView);
190-
TextView thumbsUpView = (TextView) a.findViewById(R.id.detailThumbsUpCountView);
191-
TextView thumbsDownView = (TextView) a.findViewById(R.id.detailThumbsDownCountView);
192-
TextView uploadDateView = (TextView) a.findViewById(R.id.detailUploadDateView);
193-
TextView descriptionView = (TextView) a.findViewById(R.id.detailDescriptionView);
194-
ImageView thumbnailView = (ImageView) a.findViewById(R.id.detailThumbnailView);
195-
FrameLayout nextVideoFrame = (FrameLayout) a.findViewById(R.id.detailNextVideoFrame);
187+
ScrollView contentMainView = (ScrollView) activity.findViewById(R.id.detailMainContent);
188+
ProgressBar progressBar = (ProgressBar) activity.findViewById(R.id.detailProgressBar);
189+
TextView videoTitleView = (TextView) activity.findViewById(R.id.detailVideoTitleView);
190+
TextView uploaderView = (TextView) activity.findViewById(R.id.detailUploaderView);
191+
TextView viewCountView = (TextView) activity.findViewById(R.id.detailViewCountView);
192+
TextView thumbsUpView = (TextView) activity.findViewById(R.id.detailThumbsUpCountView);
193+
TextView thumbsDownView = (TextView) activity.findViewById(R.id.detailThumbsDownCountView);
194+
TextView uploadDateView = (TextView) activity.findViewById(R.id.detailUploadDateView);
195+
TextView descriptionView = (TextView) activity.findViewById(R.id.detailDescriptionView);
196+
ImageView thumbnailView = (ImageView) activity.findViewById(R.id.detailThumbnailView);
197+
FrameLayout nextVideoFrame = (FrameLayout) activity.findViewById(R.id.detailNextVideoFrame);
196198
RelativeLayout nextVideoRootFrame =
197-
(RelativeLayout) a.findViewById(R.id.detailNextVideoRootLayout);
199+
(RelativeLayout) activity.findViewById(R.id.detailNextVideoRootLayout);
198200
View nextVideoView = videoItemViewCreator
199201
.getViewByVideoInfoItem(null, nextVideoFrame, info.nextVideo);
200202
nextVideoFrame.addView(nextVideoView);
201-
Button nextVideoButton = (Button) a.findViewById(R.id.detailNextVideoButton);
203+
Button nextVideoButton = (Button) activity.findViewById(R.id.detailNextVideoButton);
202204

203205
contentMainView.setVisibility(View.VISIBLE);
204206
progressBar.setVisibility(View.GONE);
@@ -210,10 +212,12 @@ public void updateInfo(VideoInfo info) {
210212
case VideoInfo.VIDEO_AVAILABLE: {
211213
videoTitleView.setText(info.title);
212214
uploaderView.setText(info.uploader);
213-
viewCountView.setText(info.view_count + " " + a.getString(R.string.viewSufix));
215+
viewCountView.setText(info.view_count
216+
+ " " + activity.getString(R.string.viewSufix));
214217
thumbsUpView.setText(info.like_count);
215218
thumbsDownView.setText(info.dislike_count);
216-
uploadDateView.setText(a.getString(R.string.uploadDatePrefix) + " " + info.upload_date);
219+
uploadDateView.setText(
220+
activity.getString(R.string.uploadDatePrefix) + " " + info.upload_date);
217221
descriptionView.setText(Html.fromHtml(info.description));
218222
descriptionView.setMovementMethod(LinkMovementMethod.getInstance());
219223

@@ -236,20 +240,25 @@ public void updateInfo(VideoInfo info) {
236240
nextVideoButton.setOnClickListener(new View.OnClickListener() {
237241
@Override
238242
public void onClick(View v) {
239-
Intent detailIntent = new Intent(getActivity(), VideoItemDetailActivity.class);
240-
detailIntent.putExtra(VideoItemDetailFragment.ARG_ITEM_ID, currentVideoInfo.nextVideo.id);
241-
detailIntent.putExtra(VideoItemDetailFragment.VIDEO_URL, currentVideoInfo.nextVideo.webpage_url);
243+
Intent detailIntent =
244+
new Intent(getActivity(), VideoItemDetailActivity.class);
245+
detailIntent.putExtra(
246+
VideoItemDetailFragment.ARG_ITEM_ID, currentVideoInfo.nextVideo.id);
247+
detailIntent.putExtra(
248+
VideoItemDetailFragment.VIDEO_URL, currentVideoInfo.nextVideo.webpage_url);
242249
//todo: make id dynamic the following line is crap
243250
detailIntent.putExtra(VideoItemDetailFragment.STREAMING_SERVICE, 0);
244251
startActivity(detailIntent);
245252
}
246253
});
247254
break;
248255
case VideoInfo.VIDEO_UNAVAILABLE_GEMA:
249-
thumbnailView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.gruese_die_gema_unangebracht));
256+
thumbnailView.setImageBitmap(BitmapFactory.decodeResource(
257+
getResources(), R.drawable.gruese_die_gema_unangebracht));
250258
break;
251259
case VideoInfo.VIDEO_UNAVAILABLE:
252-
thumbnailView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.not_available_monkey));
260+
thumbnailView.setImageBitmap(BitmapFactory.decodeResource(
261+
getResources(), R.drawable.not_available_monkey));
253262
break;
254263
default:
255264
Log.e(TAG, "Video Available Status not known.");
@@ -304,15 +313,18 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
304313
@Override
305314
public void onActivityCreated(Bundle savedInstanceBundle) {
306315
super.onActivityCreated(savedInstanceBundle);
307-
FloatingActionButton playVideoButton = (FloatingActionButton) getActivity().findViewById(R.id.playVideoButton);
316+
FloatingActionButton playVideoButton =
317+
(FloatingActionButton) getActivity().findViewById(R.id.playVideoButton);
308318

319+
// Sometimes when this fragment is not visible it still gets initiated
320+
// then we must not try to access objects of this fragment.
321+
// Otherwise the applications would crash.
309322
if(playVideoButton != null) {
310-
311323
try {
312324
StreamingService streamingService = ServiceList.getService(
313325
getArguments().getInt(STREAMING_SERVICE));
314326
extractorThread = new Thread(new ExtractorRunnable(
315-
getArguments().getString(VIDEO_URL), streamingService.getExtractorClass(), this));
327+
getArguments().getString(VIDEO_URL), streamingService.getExtractorClass()));
316328
autoPlayEnabled = getArguments().getBoolean(AUTO_PLAY);
317329
extractorThread.start();
318330
} catch (Exception e) {
@@ -321,13 +333,15 @@ public void onActivityCreated(Bundle savedInstanceBundle) {
321333

322334
if (PreferenceManager.getDefaultSharedPreferences(getActivity())
323335
.getBoolean(getString(R.string.leftHandLayout), false) && checkIfLandscape()) {
324-
RelativeLayout.LayoutParams oldLayout = (RelativeLayout.LayoutParams) playVideoButton.getLayoutParams();
336+
RelativeLayout.LayoutParams oldLayout =
337+
(RelativeLayout.LayoutParams) playVideoButton.getLayoutParams();
325338
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
326339
RelativeLayout.LayoutParams.WRAP_CONTENT,
327340
RelativeLayout.LayoutParams.WRAP_CONTENT);
328341
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
329342
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
330-
layoutParams.setMargins(oldLayout.leftMargin, oldLayout.topMargin, oldLayout.rightMargin, oldLayout.bottomMargin);
343+
layoutParams.setMargins(oldLayout.leftMargin, oldLayout.topMargin,
344+
oldLayout.rightMargin, oldLayout.bottomMargin);
331345
playVideoButton.setLayoutParams(layoutParams);
332346
}
333347

@@ -337,6 +351,16 @@ public void onClick(View v) {
337351
actionBarHandler.playVideo();
338352
}
339353
});
354+
355+
Button similarVideosButton = (Button) activity.findViewById(R.id.detailShowSimilarButton);
356+
similarVideosButton.setOnClickListener(new View.OnClickListener() {
357+
@Override
358+
public void onClick(View v) {
359+
Intent intent = new Intent(activity, VideoItemListActivity.class);
360+
intent.putExtra(VideoItemListActivity.VIDEO_INFO_ITEMS, currentVideoInfo.relatedVideos);
361+
activity.startActivity(intent);
362+
}
363+
});
340364
}
341365
}
342366

0 commit comments

Comments
 (0)