diff --git a/.idea/misc.xml b/.idea/misc.xml index fbb68289f..5d1998103 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/app/app.iml b/app/app.iml index 243fbdbfa..cf9c27cba 100644 --- a/app/app.iml +++ b/app/app.iml @@ -36,13 +36,13 @@ - + - + @@ -71,8 +71,9 @@ - - + + + @@ -88,12 +89,13 @@ - + - - + - + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 98cea98df..5662b2efc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 23 + buildToolsVersion "23.0.1" defaultConfig { applicationId "org.schabi.newpipe" - minSdkVersion 16 - targetSdkVersion 22 + minSdkVersion 15 + targetSdkVersion 23 versionCode 2 versionName "0.3.5" } @@ -21,8 +21,9 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:appcompat-v7:22.2.1' - compile 'com.android.support:support-v4:22.2.1' + compile 'com.android.support:appcompat-v7:23.0.1' + compile 'com.android.support:support-v4:23.0.1' compile 'org.jsoup:jsoup:1.8.3' compile 'org.mozilla:rhino:1.7.7' + compile 'com.android.support:design:23.0.1' } diff --git a/app/src/main/java/org/schabi/newpipe/PlayVideoActivity.java b/app/src/main/java/org/schabi/newpipe/PlayVideoActivity.java index db7d09691..4ec9afbd6 100644 --- a/app/src/main/java/org/schabi/newpipe/PlayVideoActivity.java +++ b/app/src/main/java/org/schabi/newpipe/PlayVideoActivity.java @@ -2,12 +2,16 @@ package org.schabi.newpipe; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.res.Configuration; +import android.content.res.Resources; import android.media.MediaPlayer; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.Menu; @@ -17,8 +21,11 @@ import android.view.Surface; import android.view.View; import android.view.WindowManager; import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.LinearLayout; import android.widget.MediaController; import android.widget.ProgressBar; +import android.widget.SeekBar; import android.widget.VideoView; /** @@ -50,6 +57,7 @@ public class PlayVideoActivity extends AppCompatActivity { private static final String POSITION = "position"; private static final long HIDING_DELAY = 3000; + private static final long TAB_HIDING_DELAY = 100; private String videoUrl = ""; @@ -61,6 +69,8 @@ public class PlayVideoActivity extends AppCompatActivity { private View decorView; private boolean uiIsHidden = false; private static long lastUiShowTime = 0; + private boolean isLandscape = true; + private boolean hasSoftKeys = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -68,6 +78,9 @@ public class PlayVideoActivity extends AppCompatActivity { setContentView(R.layout.activity_play_video); + isLandscape = checkIfLandscape(); + hasSoftKeys = checkIfhasSoftKeys(); + actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); Intent intent = getIntent(); @@ -91,6 +104,7 @@ public class PlayVideoActivity extends AppCompatActivity { videoView.seekTo(position); if (position == 0) { videoView.start(); + showUi(); } else { videoView.pause(); } @@ -113,16 +127,21 @@ public class PlayVideoActivity extends AppCompatActivity { decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { - if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { - uiIsHidden = false; + if (visibility == View.VISIBLE && uiIsHidden) { showUi(); - } else { - uiIsHidden = true; - hideUi(); } } }); - showUi(); + + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + } @Override @@ -166,8 +185,16 @@ public class PlayVideoActivity extends AppCompatActivity { } @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); + public void onConfigurationChanged(Configuration config) { + super.onConfigurationChanged(config); + + if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) { + isLandscape = true; + adjustMediaControllMetrics(); + } else if (config.orientation == Configuration.ORIENTATION_PORTRAIT){ + isLandscape = false; + adjustMediaControllMetrics(); + } } @Override @@ -187,15 +214,15 @@ public class PlayVideoActivity extends AppCompatActivity { private void showUi() { try { uiIsHidden = false; - mediaController.show(); + mediaController.show(100000); actionBar.show(); - //decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); - //| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + adjustMediaControllMetrics(); + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { - if ((System.currentTimeMillis() - lastUiShowTime) > HIDING_DELAY) { + if ((System.currentTimeMillis() - lastUiShowTime) >= HIDING_DELAY) { hideUi(); } } @@ -210,8 +237,75 @@ public class PlayVideoActivity extends AppCompatActivity { uiIsHidden = true; actionBar.hide(); mediaController.hide(); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - //decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); - //| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + + private void adjustMediaControllMetrics() { + MediaController.LayoutParams mediaControllerLayout + = new MediaController.LayoutParams(MediaController.LayoutParams.MATCH_PARENT, + MediaController.LayoutParams.WRAP_CONTENT); + + if(!hasSoftKeys) { + mediaControllerLayout.setMargins(20, 0, 20, 20); + } else { + int width = getNavigationBarWidth(); + int height = getNavigationBarHeight(); + mediaControllerLayout.setMargins(width + 20, 0, width + 20, height + 20); + } + mediaController.setLayoutParams(mediaControllerLayout); + } + + private boolean checkIfhasSoftKeys(){ + if(Build.VERSION.SDK_INT >= 17) { + return getNavigationBarHeight() != 0 || getNavigationBarWidth() != 0; + } else { + return true; + } + } + + private int getNavigationBarHeight() { + if(Build.VERSION.SDK_INT >= 17) { + Display d = getWindowManager().getDefaultDisplay(); + + DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + d.getRealMetrics(realDisplayMetrics); + DisplayMetrics displayMetrics = new DisplayMetrics(); + d.getMetrics(displayMetrics); + + int realHeight = realDisplayMetrics.heightPixels; + int displayHeight = displayMetrics.heightPixels; + return (realHeight - displayHeight); + } else { + return 50; + } + } + + private int getNavigationBarWidth() { + if(Build.VERSION.SDK_INT >= 17) { + Display d = getWindowManager().getDefaultDisplay(); + + DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + d.getRealMetrics(realDisplayMetrics); + DisplayMetrics displayMetrics = new DisplayMetrics(); + d.getMetrics(displayMetrics); + + int realWidth = realDisplayMetrics.widthPixels; + int displayWidth = displayMetrics.widthPixels; + return (realWidth - displayWidth); + } else { + return 50; + } + } + + public boolean checkIfLandscape() { + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + return displayMetrics.heightPixels < displayMetrics.widthPixels; } } diff --git a/app/src/main/java/org/schabi/newpipe/VideoInfoItem.java b/app/src/main/java/org/schabi/newpipe/VideoInfoItem.java index ed0904a0b..30d304bd7 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoInfoItem.java +++ b/app/src/main/java/org/schabi/newpipe/VideoInfoItem.java @@ -30,4 +30,5 @@ public class VideoInfoItem { public String thumbnail_url = ""; public Bitmap thumbnail = null; public String webpage_url = ""; + public String upload_date = ""; } \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java b/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java index cc9287796..cc0c95edf 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java +++ b/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java @@ -1,16 +1,20 @@ package org.schabi.newpipe; import android.content.ContentProviderOperation; +import android.content.res.Configuration; +import android.os.Build; import android.preference.PreferenceManager; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.NavUtils; +import android.util.DisplayMetrics; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.WindowManager; import org.schabi.newpipe.youtube.YoutubeExtractor; @@ -39,12 +43,12 @@ public class VideoItemDetailActivity extends AppCompatActivity { private String videoUrl; private int currentStreamingService = -1; + private boolean isLandscape; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_videoitem_detail); - // Show the Up button in the action bar. getSupportActionBar().setDisplayHomeAsUpEnabled(true); ActionBarHandler.getHandler().setupNavMenu(this); diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java b/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java index 23ca053f8..558bd2569 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java @@ -6,6 +6,8 @@ import android.graphics.BitmapFactory; import android.media.Image; import android.os.Bundle; import android.os.Handler; +import android.preference.PreferenceManager; +import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBar; import android.text.Html; @@ -14,8 +16,11 @@ import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.GridLayout; import android.widget.ImageView; +import android.widget.ListView; import android.widget.ProgressBar; +import android.widget.RelativeLayout; import android.widget.TextView; @@ -158,6 +163,7 @@ public class VideoItemDetailFragment extends Fragment { ImageView thumbsDownPic = (ImageView) a.findViewById(R.id.detailThumbsDownImgView); View textSeperationLine = a.findViewById(R.id.textSeperationLine); + if(textSeperationLine != null) { textSeperationLine.setVisibility(View.VISIBLE); } @@ -201,7 +207,7 @@ public class VideoItemDetailFragment extends Fragment { } ActionBarHandler.getHandler().setStreams(streamList); } - break; + break; case VideoInfo.VIDEO_UNAVAILABLE_GEMA: thumbnailView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.gruese_die_gema_unangebracht)); break; @@ -256,7 +262,31 @@ public class VideoItemDetailFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_videoitem_detail, container, false); - return rootView; } -} + + @Override + public void onActivityCreated(Bundle savedInstanceBundle) { + super.onActivityCreated(savedInstanceBundle); + FloatingActionButton playVideoButton = (FloatingActionButton) getActivity().findViewById(R.id.playVideoButton); + + if(PreferenceManager.getDefaultSharedPreferences(getActivity()) + .getBoolean(getString(R.string.leftHandLayout), false)) { + RelativeLayout.LayoutParams oldLayout = (RelativeLayout.LayoutParams) playVideoButton.getLayoutParams(); + RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.WRAP_CONTENT, + RelativeLayout.LayoutParams.WRAP_CONTENT); + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); + layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT); + layoutParams.setMargins(oldLayout.leftMargin, oldLayout.topMargin, oldLayout.rightMargin, oldLayout.rightMargin); + playVideoButton.setLayoutParams(layoutParams); + } + + playVideoButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ActionBarHandler.getHandler().playVideo(); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java b/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java index 827f5e8e1..0a46ac10e 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java +++ b/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java @@ -2,15 +2,19 @@ package org.schabi.newpipe; import android.content.Context; import android.content.Intent; +import android.content.res.Configuration; +import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; +import android.util.DisplayMetrics; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.support.v7.widget.SearchView; import android.widget.ImageView; diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemListFragment.java b/app/src/main/java/org/schabi/newpipe/VideoItemListFragment.java index c3f7b46f6..c924aa227 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoItemListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/VideoItemListFragment.java @@ -13,6 +13,7 @@ import android.widget.ListView; import android.widget.Toast; import java.net.URL; +import java.util.List; import java.util.Vector; diff --git a/app/src/main/java/org/schabi/newpipe/VideoListAdapter.java b/app/src/main/java/org/schabi/newpipe/VideoListAdapter.java index 51ca76044..6edda8736 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/VideoListAdapter.java @@ -104,6 +104,7 @@ public class VideoListAdapter extends BaseAdapter { holder.itemVideoTitleView = (TextView) convertView.findViewById(R.id.itemVideoTitleView); holder.itemUploaderView = (TextView) convertView.findViewById(R.id.itemUploaderView); holder.itemDurationView = (TextView) convertView.findViewById(R.id.itemDurationView); + holder.itemUploadDateView = (TextView) convertView.findViewById(R.id.itemUploadDateView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); @@ -118,6 +119,7 @@ public class VideoListAdapter extends BaseAdapter { holder.itemVideoTitleView.setText(videoList.get(position).title); holder.itemUploaderView.setText(videoList.get(position).uploader); holder.itemDurationView.setText(videoList.get(position).duration); + holder.itemUploadDateView.setText(videoList.get(position).upload_date); if(listView.isItemChecked(position)) { convertView.setBackgroundColor(context.getResources().getColor(R.color.primaryColorYoutube)); @@ -130,6 +132,6 @@ public class VideoListAdapter extends BaseAdapter { private class ViewHolder { public ImageView itemThumbnailView; - public TextView itemVideoTitleView, itemUploaderView, itemDurationView; + public TextView itemVideoTitleView, itemUploaderView, itemDurationView, itemUploadDateView; } -} +} \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java index 2f66ea2ac..395a3d768 100644 --- a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java +++ b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeSearchEngine.java @@ -97,6 +97,9 @@ public class YoutubeSearchEngine implements SearchEngine { resultItem.uploader = item.select("div[class=\"yt-lockup-byline\"]").first() .select("a").first() .text(); + resultItem.upload_date = item.select("div[class=\"yt-lockup-meta\"]").first() + .select("li").first() + .text(); Element te = item.select("div[class=\"yt-thumb video-thumb\"]").first() .select("img").first(); resultItem.thumbnail_url = te.attr("abs:src"); diff --git a/app/src/main/res/layout-land/fragment_videoitem_detail.xml b/app/src/main/res/layout-land/fragment_videoitem_detail.xml index 2f8eb35dc..b420f96c6 100644 --- a/app/src/main/res/layout-land/fragment_videoitem_detail.xml +++ b/app/src/main/res/layout-land/fragment_videoitem_detail.xml @@ -1,139 +1,159 @@ - + android:layout_height="match_parent"> - + android:textIsSelectable="true"> - + android:padding="16dp"> - + - + - + - + - + - + - + - + - + - + - + - + - + - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_play_video.xml b/app/src/main/res/layout/activity_play_video.xml index b2721fd07..433930f71 100644 --- a/app/src/main/res/layout/activity_play_video.xml +++ b/app/src/main/res/layout/activity_play_video.xml @@ -9,17 +9,20 @@ + android:layout_gravity="center" + android:focusable="false"/>