Improve image placeholders
- Show placeholders until the image is loaded because timeout can be very long and missing profile pictures and video thumbnails make app inconvenient to use - Adapt profile picture and video thumbnail placeholders to light theme - Replace profile picture and video thumbnail placeholders with vector graphics
@ -714,7 +714,7 @@ public final class VideoDetailFragment
|
||||
}
|
||||
|
||||
private void initThumbnailViews(@NonNull final StreamInfo info) {
|
||||
PicassoHelper.loadThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
PicassoHelper.loadDetailsThumbnail(info.getThumbnailUrl()).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
.into(binding.detailThumbnailImageView, new Callback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
@ -2361,7 +2361,7 @@ public final class VideoDetailFragment
|
||||
binding.overlayTitleTextView.setText(isEmpty(overlayTitle) ? "" : overlayTitle);
|
||||
binding.overlayChannelTextView.setText(isEmpty(uploader) ? "" : uploader);
|
||||
binding.overlayThumbnail.setImageResource(R.drawable.dummy_thumbnail_dark);
|
||||
PicassoHelper.loadThumbnail(thumbnailUrl).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
PicassoHelper.loadDetailsThumbnail(thumbnailUrl).tag(PICASSO_VIDEO_DETAILS_TAG)
|
||||
.into(binding.overlayThumbnail);
|
||||
}
|
||||
|
||||
|
@ -104,6 +104,10 @@ public final class PicassoHelper {
|
||||
return loadImageDefault(url, R.drawable.dummy_thumbnail);
|
||||
}
|
||||
|
||||
public static RequestCreator loadDetailsThumbnail(final String url) {
|
||||
return loadImageDefault(url, R.drawable.dummy_thumbnail, false);
|
||||
}
|
||||
|
||||
public static RequestCreator loadBanner(final String url) {
|
||||
return loadImageDefault(url, R.drawable.channel_banner);
|
||||
}
|
||||
@ -189,15 +193,24 @@ public final class PicassoHelper {
|
||||
|
||||
|
||||
private static RequestCreator loadImageDefault(final String url, final int placeholderResId) {
|
||||
return loadImageDefault(url, placeholderResId, true);
|
||||
}
|
||||
|
||||
private static RequestCreator loadImageDefault(final String url, final int placeholderResId,
|
||||
final boolean showPlaceholderWhileLoading) {
|
||||
if (!shouldLoadImages || isBlank(url)) {
|
||||
return picassoInstance
|
||||
.load((String) null)
|
||||
.placeholder(placeholderResId) // show placeholder when no image should load
|
||||
.error(placeholderResId);
|
||||
} else {
|
||||
return picassoInstance
|
||||
final RequestCreator requestCreator = picassoInstance
|
||||
.load(url)
|
||||
.error(placeholderResId); // don't show placeholder while loading, only on error
|
||||
.error(placeholderResId);
|
||||
if (showPlaceholderWhileLoading) {
|
||||
requestCreator.placeholder(placeholderResId);
|
||||
}
|
||||
return requestCreator;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 956 B |
Before Width: | Height: | Size: 105 B After Width: | Height: | Size: 134 B |
Before Width: | Height: | Size: 1.2 KiB |
31
app/src/main/res/drawable/buddy.xml
Normal file
@ -0,0 +1,31 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="200">
|
||||
|
||||
<path
|
||||
android:pathData="M0,0h200v200h-200z"
|
||||
android:strokeAlpha="0.997"
|
||||
android:strokeWidth="5"
|
||||
android:fillColor="@color/placeholder_foreground"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="0.997"/>
|
||||
<path
|
||||
android:pathData="M0,200a100,75 0,1 0,200 0a100,75 0,1 0,-200 0z"
|
||||
android:strokeAlpha="0.997"
|
||||
android:strokeWidth="5"
|
||||
android:fillColor="@color/placeholder_background"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="0.997"/>
|
||||
<path
|
||||
android:pathData="M100,90m-60,0a60,60 0,1 1,120 0a60,60 0,1 1,-120 0"
|
||||
android:strokeAlpha="0.997"
|
||||
android:strokeWidth="5"
|
||||
android:fillColor="@color/placeholder_background"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="0.997"/>
|
||||
</vector>
|
22
app/src/main/res/drawable/dummy_thumbnail.xml
Normal file
@ -0,0 +1,22 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:pathData="M0,0l200.173,0l0,200.425l-200.173,0z"
|
||||
android:strokeAlpha="0.997"
|
||||
android:strokeWidth="4.6539564"
|
||||
android:fillColor="@color/placeholder_background"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="0.997"/>
|
||||
<path
|
||||
android:pathData="M125.003,99.189L101.807,111.522L75.753,125.001L75.225,101.364L75.004,75L98.727,86.303L125.003,99.189Z"
|
||||
android:strokeAlpha="0.997"
|
||||
android:strokeWidth="5"
|
||||
android:fillColor="@color/placeholder_foreground"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="0.997"/>
|
||||
</vector>
|
30
app/src/main/res/drawable/dummy_thumbnail_playlist.xml
Normal file
@ -0,0 +1,30 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="200dp"
|
||||
android:height="200dp"
|
||||
android:viewportWidth="200"
|
||||
android:viewportHeight="200">
|
||||
<path
|
||||
android:pathData="M0,0l200.173,0l0,200.425l-200.173,0z"
|
||||
android:strokeAlpha="0.997"
|
||||
android:strokeWidth="4.6539564"
|
||||
android:fillColor="@color/placeholder_background"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="1"/>
|
||||
<path
|
||||
android:pathData="M115.003,99.189L91.807,111.522L65.753,125.001L65.225,101.364L65.004,75L88.727,86.303L115.003,99.189Z"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeWidth="5"
|
||||
android:fillColor="@color/placeholder_foreground"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="1"/>
|
||||
<path
|
||||
android:pathData="M140.003,99.188L116.807,111.521L90.753,125L90.225,101.363L90.004,75L113.728,86.303L140.003,99.188Z"
|
||||
android:strokeAlpha="1"
|
||||
android:strokeWidth="5"
|
||||
android:fillColor="@color/placeholder_foreground"
|
||||
android:strokeColor="#00000000"
|
||||
android:fillType="nonZero"
|
||||
android:fillAlpha="1"/>
|
||||
</vector>
|
@ -18,7 +18,7 @@
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_margin="2dp"
|
||||
android:contentDescription="@string/detail_uploader_thumbnail_view_description"
|
||||
android:src="@drawable/buddy_channel_item"
|
||||
android:src="@drawable/buddy"
|
||||
app:shapeAppearance="@style/CircularImageView"
|
||||
tools:ignore="RtlHardcoded" />
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginStart="3dp"
|
||||
android:layout_marginRight="15dp"
|
||||
android:src="@drawable/buddy_channel_item"
|
||||
android:src="@drawable/buddy"
|
||||
app:shapeAppearance="@style/CircularImageView"
|
||||
tools:ignore="RtlHardcoded" />
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginStart="3dp"
|
||||
android:layout_marginRight="15dp"
|
||||
android:src="@drawable/buddy_channel_item"
|
||||
android:src="@drawable/buddy"
|
||||
app:shapeAppearance="@style/CircularImageView"
|
||||
tools:ignore="RtlHardcoded" />
|
||||
|
||||
|
@ -22,7 +22,7 @@
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
app:shapeAppearance="@style/CircularImageView"
|
||||
tools:src="@drawable/buddy_channel_item" />
|
||||
tools:src="@drawable/buddy" />
|
||||
|
||||
<org.schabi.newpipe.views.NewPipeTextView
|
||||
android:id="@+id/title_view"
|
||||
|
@ -2,4 +2,7 @@
|
||||
<resources>
|
||||
<color name="contrastColor">@color/white</color>
|
||||
<color name="defaultIconTint">@color/white</color>
|
||||
|
||||
<color name="placeholder_background">#6C6C6C</color>
|
||||
<color name="placeholder_foreground">#999999</color>
|
||||
</resources>
|
||||
|
@ -6,6 +6,9 @@
|
||||
|
||||
<color name="ic_launcher_background">#CD201F</color>
|
||||
|
||||
<color name="placeholder_background">#F6F6F6</color>
|
||||
<color name="placeholder_foreground">#6E6E6E</color>
|
||||
|
||||
<!-- Light Theme -->
|
||||
<color name="light_background_color">#EEEEEE</color>
|
||||
<color name="light_dialog_background_color">#EEEEEE</color>
|
||||
|
@ -1,73 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="200" height="200" viewBox="0 0 187.5 187.5"
|
||||
id="svg2" version="1.1" inkscape:version="0.92.0 r" sodipodi:docname="buddy_channel_item.svg"
|
||||
inkscape:export-filename="/home/the-scrabi/Projects/NewPipe/app/src/main/res/drawable-nodpi/buddy_channel_item.png"
|
||||
inkscape:export-xdpi="96" inkscape:export-ydpi="96">
|
||||
<defs
|
||||
id="defs4" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.6269531"
|
||||
inkscape:cx="-8.1138818"
|
||||
inkscape:cy="101.30232"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1012"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="32"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Ebene 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-864.86216)">
|
||||
<rect
|
||||
style="opacity:0.997;fill:#999999;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.6875;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect4136"
|
||||
width="187.5"
|
||||
height="187.5"
|
||||
x="0"
|
||||
y="864.86218" />
|
||||
<g
|
||||
id="g4487"
|
||||
transform="matrix(0.5625,0,0,0.5625,37.5,418.22093)">
|
||||
<ellipse
|
||||
ry="75"
|
||||
rx="100"
|
||||
cy="1052.3622"
|
||||
cx="100"
|
||||
id="path4152"
|
||||
style="opacity:0.997;fill:#6c6c6c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<circle
|
||||
r="60"
|
||||
cy="942.36218"
|
||||
cx="100"
|
||||
id="path4154"
|
||||
style="opacity:0.997;fill:#6c6c6c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.6 KiB |
7
assets/dummy_thumbnail.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="200px" height="200px" viewBox="0 0 200 200" id="svg2" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="layer1" transform="matrix(1.03744, 0, 0, 0.835106, 0, -678.408142)">
|
||||
<rect style="opacity: 0.997; fill: rgb(153, 153, 153); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 5; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" id="rect4136" width="192.949" height="240" y="812.362"/>
|
||||
<path style="opacity:0.997;fill:#6c6c6c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path4164" d="M 120.491 931.134 L 98.133 945.904 L 73.02 962.046 L 72.51 933.742 L 72.295 902.173 L 95.163 915.706 L 120.491 931.134 Z" transform="matrix(1, 0.000081, -0.000052, 1, 0.048923, -0.007806)"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 868 B |
8
assets/dummy_thumbnail_playlist.svg
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg width="200px" height="200px" viewBox="0 0 200 200" id="svg2" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="layer1" transform="matrix(1.03744, 0, 0, 0.835106, 0, -678.408142)">
|
||||
<rect style="opacity: 0.997; fill: rgb(153, 153, 153); fill-opacity: 1; fill-rule: nonzero; stroke: none; stroke-width: 5; stroke-miterlimit: 4; stroke-dasharray: none; stroke-opacity: 1;" id="rect4136" width="192.949" height="240" y="812.362"/>
|
||||
<path style="opacity:0.997;fill:#6c6c6c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path4164" d="M 110.852 931.134 L 88.494 945.904 L 63.381 962.046 L 62.871 933.742 L 62.656 902.173 L 85.524 915.706 L 110.852 931.134 Z" transform="matrix(1, 0.000081, -0.000052, 1, 0.048923, -0.007025)"/>
|
||||
<path style="opacity:0.997;fill:#6c6c6c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path-1" d="M 134.95 931.133 L 112.592 945.903 L 87.479 962.045 L 86.969 933.741 L 86.754 902.172 L 109.622 915.705 L 134.95 931.133 Z" transform="matrix(1, 0.000081, -0.000052, 1, 0.048901, -0.008782)"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.2 KiB |