Skip to content

Commit

Permalink
Support for different providers:
Browse files Browse the repository at this point in the history
*YouTube
*Twitch
*More provider support coming soon
  • Loading branch information
powerpoint45 committed Feb 10, 2020
1 parent dbce2e2 commit 78d40a5
Show file tree
Hide file tree
Showing 15 changed files with 195 additions and 65 deletions.
10 changes: 6 additions & 4 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 27
compileSdkVersion 28
buildToolsVersion '28.0.3'

useLibrary 'org.apache.http.legacy'

defaultConfig {
applicationId "com.powerpoint45.dtube"
minSdkVersion 21
targetSdkVersion 27
versionCode 26
versionName "2.86"
targetSdkVersion 28
versionCode 27
versionName "2.87"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
Expand Down Expand Up @@ -49,4 +49,6 @@ dependencies {
implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'

implementation project(path: ':YouTubeAndroidPlayerApi')

}
Binary file modified app/release/app-release.apk
Binary file not shown.
2 changes: 1 addition & 1 deletion app/release/output.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":26,"versionName":"2.86","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":27,"versionName":"2.87","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}]
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>

<uses-feature android:name="android.software.leanback" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
Expand Down
11 changes: 10 additions & 1 deletion app/src/main/java/com/powerpoint45/dtube/AppJavaScriptProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,16 @@ public Video getVideoFromJsonObject(JSONObject jo){
if (jo.has("hash")) {
video.hash = jo.getString("hash");
}
video.snapHash = jo.getString("snaphash");

if (jo.has("snaphash"))
video.snapHash = jo.getString("snaphash");

if (jo.has("thumbnailUrl"))
video.setImageURL(jo.getString("thumbnailUrl"));

if (jo.has("provider"))
video.setProvider(jo.getString("provider"));

video.permlink = jo.getString("permlink");

if (jo.has("duration")){
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/com/powerpoint45/dtube/DtubeAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ public class DtubeAPI {
static final int CAT_NEW = 3;
static final int CAT_HISTORY = 4;

static final String PROVIDER_IPFS = "IPFS";
static final String PROVIDER_YOUTUBE = "YouTube";
static final String PROVIDER_TWITCH = "Twitch";


//public static String PROFILE_IMG_URL = "https://img.busy.org/@";//https://img.busy.org/@lukewearechange//too slow, useing steemitimages
static String PROFILE_IMAGE_SMALL_URL = "https://steemitimages.com/u/username/avatar/small";//replace username with actual username
Expand Down
101 changes: 77 additions & 24 deletions app/src/main/java/com/powerpoint45/dtube/MediaPlayerSingleton.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.util.Util;
import com.google.android.exoplayer2.video.VideoListener;
import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerView;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;

Expand All @@ -38,11 +41,23 @@ public class MediaPlayerSingleton {
private Video videoToPlay;
private Context c;

YouTubePlayerView youTubePlayerView;
WebViewVideoView embeddedPlayer;
//FacebookPlayerView facebookPlayerView; //future

private MediaPlayerSingleton(){

}

private MediaPlayerSingleton(Context c){
private MediaPlayerSingleton(Activity c){
init(c);
}

private void init(Activity c) {
youTubePlayerView = new YouTubePlayerView(c);
embeddedPlayer = new WebViewVideoView(c,false);


playerView = new PlayerView(c);
player = ExoPlayerFactory.newSimpleInstance(c);
playerView.setShowBuffering(SHOW_BUFFERING_ALWAYS);
Expand All @@ -54,7 +69,7 @@ private MediaPlayerSingleton(Context c){

if (uiModeManager.getCurrentModeType()== Configuration.UI_MODE_TYPE_TELEVISION) {
playerView.findViewById(R.id.exo_fullscreen_button).setVisibility(View.GONE);
int extraPadding = Tools.numtodp(20, (Activity)c);
int extraPadding = Tools.numtodp(20, c);
playerView.findViewById(R.id.control_bar_holder).setPadding(extraPadding,0,extraPadding,extraPadding);
}

Expand Down Expand Up @@ -93,9 +108,23 @@ public SimpleExoPlayer getPlayer(){
return player;
}

PlayerView getPlayerView(){
/**
*
* @return playerView or youTubePlayerView based on provider
*/
View getRightPlayerView(){
if (videoToPlay.getProvider().equals(DtubeAPI.PROVIDER_YOUTUBE))
return youTubePlayerView;
else if(videoToPlay.getProvider().equals(DtubeAPI.PROVIDER_TWITCH))
return embeddedPlayer;
else
return playerView;
}

PlayerView getIPFSPlayerView(){
return playerView;
}
YouTubePlayerView getYouTubePlayerView(){return youTubePlayerView;}

private MediaSource getMediaSource(String url){
Uri uri = Uri.parse(url);
Expand All @@ -109,34 +138,61 @@ private MediaSource getMediaSource(String url){
}

void playVideo(Video videoToPlay, Context c){
if (this.videoToPlay!=null && this.videoToPlay.getProvider()!=videoToPlay.getProvider())
if (this.videoToPlay.getProvider().equals(DtubeAPI.PROVIDER_TWITCH))
embeddedPlayer.loadUrl("about:blank"+videoToPlay.hash);

this.videoToPlay = videoToPlay;
Log.d("dtube","loading stream: "+ videoToPlay.getVideoStreamURL());
Log.d("dtube","provider: "+ videoToPlay.getProvider());

player.prepare(getMediaSource(videoToPlay.getVideoStreamURL()));
player.setPlayWhenReady(true);
if (videoToPlay.getProvider().equals(DtubeAPI.PROVIDER_YOUTUBE)) {
Log.d("dtube", "loading stream: " + videoToPlay.hash);

playerView.showController();
youTubePlayerView.initialize("AIzaSyAWk7QQRnSw4JL801vb40VmIknXS1EAo-8", new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
Log.d("dtube","onInitializationSuccess");
youTubePlayer.loadVideo(videoToPlay.hash);
}

@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {

Picasso.get().load(videoToPlay.getImageURL()).resize(720, 720).centerInside().into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
playerView.findViewById(R.id.exo_shutter).setBackground(new BitmapDrawable(bitmap));
}
}
});
}else if (videoToPlay.getProvider().equals(DtubeAPI.PROVIDER_TWITCH)) {
embeddedPlayer.loadUrl("https://player.twitch.tv/?video="+videoToPlay.hash);

@Override
public void onBitmapFailed(Exception e, Drawable errorDrawable) {
} else {
Log.d("dtube", "loading stream: " + videoToPlay.getVideoStreamURL());

}

@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
player.prepare(getMediaSource(videoToPlay.getVideoStreamURL()));
player.setPlayWhenReady(true);

}
});
playerView.showController();


Picasso.get().load(videoToPlay.getImageURL()).resize(720, 720).centerInside().into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
playerView.findViewById(R.id.exo_shutter).setBackground(new BitmapDrawable(bitmap));
}

@Override
public void onBitmapFailed(Exception e, Drawable errorDrawable) {

}

@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {

}
});
}
}

static MediaPlayerSingleton getInstance(Context c){
static MediaPlayerSingleton getInstance(Activity c){
if (mediaPlayer == null)
mediaPlayer = new MediaPlayerSingleton(c);

Expand Down Expand Up @@ -165,10 +221,7 @@ void startPlayer(){
player.setPlayWhenReady(true);
player.getPlaybackState();
}

void disattachFromParent(){
((ViewGroup)playerView.getParent()).removeView(playerView);
}


void togglePlayPause(){
if (playerView.findViewById(R.id.exo_play).getVisibility()==View.VISIBLE)
Expand Down
13 changes: 12 additions & 1 deletion app/src/main/java/com/powerpoint45/dtube/Video.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class Video implements Serializable{
String snapHash;
String imageURL;
private String duration;
String provider;//such as YouTube or FaceBook Videos

String longDescriptionHTML;
String subscribers;
Expand Down Expand Up @@ -125,8 +126,18 @@ long getDate(){
return time;
}

public String getProvider() {
if (provider == null)
return DtubeAPI.PROVIDER_IPFS;
return provider;
}

public void setProvider(String provider) {
this.provider = provider;
}


void setImageURL(String url) {
public void setImageURL(String url) {
imageURL = url;
}

Expand Down
19 changes: 12 additions & 7 deletions app/src/main/java/com/powerpoint45/dtube/VideoPlayActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import android.media.AudioManager;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.method.LinkMovementMethod;
import android.util.DisplayMetrics;
import android.util.Log;
Expand All @@ -30,6 +29,7 @@
import android.widget.TextView;

import com.github.curioustechizen.ago.RelativeTimeTextView;
import com.google.android.youtube.player.YouTubeBaseActivity;
import com.makeramen.roundedimageview.RoundedTransformationBuilder;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Transformation;
Expand All @@ -43,7 +43,7 @@
*/


public class VideoPlayActivity extends AppCompatActivity {
public class VideoPlayActivity extends YouTubeBaseActivity {
static final int REQUEST_CHANNEL = 0;
FrameLayout videoLayoutHolder;

Expand Down Expand Up @@ -382,6 +382,7 @@ public void updateUI(){
((TextView)findViewById(R.id.item_value)).setText(videoToPlay.price);
((TextView)findViewById(R.id.item_user)).setText(videoToPlay.user);
((RelativeTimeTextView)findViewById(R.id.item_time)).setReferenceTime(videoToPlay.getDate());
((TextView)findViewById(R.id.provider_text)).setText("Provider: "+videoToPlay.getProvider());


if (accountName!=null && accountName.equals(videoToPlay.user)){
Expand Down Expand Up @@ -449,7 +450,7 @@ public void updateUI(){
fullscreenButton.setImageResource(R.drawable.exo_controls_fullscreen_exit);
} else {
videoLayoutHolder.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
Tools.numtodp(200, this)));
Tools.numtodp(250, this)));
fullscreenButton.setImageResource(R.drawable.exo_controls_fullscreen_enter);
}
}
Expand Down Expand Up @@ -554,25 +555,29 @@ public void onItemClick(int pos){
public void setupVideoView(){
hadErrorLoading = false;

videoLayoutHolder.removeView(MediaPlayerSingleton.getInstance(this).getYouTubePlayerView());
videoLayoutHolder.removeView(MediaPlayerSingleton.getInstance(this).getIPFSPlayerView());

if (useEmbeded || runningOnTV){
MediaPlayerSingleton.getInstance(this).playVideo(videoToPlay,this);

if (videoLayoutHolder.findViewById(R.id.exo_content_frame)==null)
videoLayoutHolder.addView(MediaPlayerSingleton.getInstance(this).getPlayerView(),0);
if (videoLayoutHolder.findViewById(R.id.exo_content_frame)==null) {
videoLayoutHolder.addView(MediaPlayerSingleton.getInstance(this).getRightPlayerView(), 0);
}
}else {
MediaPlayerSingleton.getInstance(this).playVideo(videoToPlay,this);

findViewById(R.id.video_content).addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
if (oldBottom!=bottom) {
updateUI();
MediaPlayerSingleton.getInstance(VideoPlayActivity.this).getPlayerView().showController();
MediaPlayerSingleton.getInstance(VideoPlayActivity.this).getIPFSPlayerView().showController();
}
Log.d("dtube", "onLayoutChange");
});


if (videoLayoutHolder.findViewById(R.id.exo_content_frame)==null)
videoLayoutHolder.addView(MediaPlayerSingleton.getInstance(this).getPlayerView());
videoLayoutHolder.addView(MediaPlayerSingleton.getInstance(this).getRightPlayerView());

}
}
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/res/layout-land/activity_videoplay_tv.xml
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,14 @@

</LinearLayout>

<TextView
android:id="@+id/provider_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:text="Provider" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
Expand Down
12 changes: 11 additions & 1 deletion app/src/main/res/layout/activity_videoplay.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
android:layout_width="match_parent"
android:orientation="vertical"
android:background="@android:color/black"
android:layout_height="200dp">
android:layout_height="250dp">
</FrameLayout>

<ScrollView
Expand Down Expand Up @@ -148,6 +148,7 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:onClick="videoLikeClicked"
android:src="@drawable/ic_thumb_up"
app:srcCompat="@drawable/ic_thumb_up" />

<TextView
Expand All @@ -164,6 +165,7 @@
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:onClick="videoDislikeClicked"
android:src="@drawable/ic_thumb_down"
app:srcCompat="@drawable/ic_thumb_down" />

<TextView
Expand All @@ -178,6 +180,14 @@

</LinearLayout>

<TextView
android:id="@+id/provider_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:text="Provider"
android:layout_marginBottom="4dp"/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
Expand Down
Loading

0 comments on commit 78d40a5

Please sign in to comment.