From 9fe36b0a353100d87eca50b41f5940dbfe0f2cee Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Wed, 27 May 2015 17:58:50 +0200 Subject: [PATCH] Redesign of MusicControllerActivity, AlbumDetailActivity and ArtistDetailActivity. A lot of bugs and other small things fixed as well. --- app/build.gradle | 3 + .../helper/bitmapblur/BlurProcess.java | 15 + .../helper/bitmapblur/JavaBlurProcess.java | 329 +++++++++++++++ .../helper/bitmapblur/StackBlurManager.java | 89 ++++ .../model/UIPreferenceChangedEvent.java | 3 +- .../ui/activities/AlbumDetailActivity.java | 60 ++- .../ui/activities/ArtistDetailActivity.java | 61 ++- .../ui/activities/MainActivity.java | 23 +- .../activities/MusicControllerActivity.java | 141 +++---- .../ui/activities/PlaylistDetailActivity.java | 13 +- .../ui/activities/SearchActivity.java | 6 +- .../ui/activities/SettingsActivity.java | 15 +- .../ui/activities/base/AbsFabActivity.java | 10 +- .../ui/activities/base/ThemeBaseActivity.java | 77 ++-- .../tageditor/AbsTagEditorActivity.java | 19 +- .../AbsMainActivityFragment.java | 9 +- .../gramophone/util/PreferenceUtils.java | 10 +- ...WidthFitSquarePlaceLeftRightImageView.java | 30 ++ ...iew.java => HeightFitSquareImageView.java} | 11 +- .../SquareIfPlaceLeftRightImageView.java | 35 ++ ...View.java => WidthFitSquareImageView.java} | 8 +- .../drawable-hdpi/ic_repeat_grey600_48dp.png | Bin 400 -> 0 bytes .../drawable-hdpi/ic_shuffle_grey600_48dp.png | Bin 614 -> 0 bytes .../drawable-mdpi/ic_repeat_grey600_48dp.png | Bin 317 -> 0 bytes .../drawable-mdpi/ic_shuffle_grey600_48dp.png | Bin 418 -> 0 bytes .../drawable-xhdpi/ic_repeat_grey600_48dp.png | Bin 481 -> 0 bytes .../ic_shuffle_grey600_48dp.png | Bin 737 -> 0 bytes .../ic_repeat_grey600_48dp.png | Bin 672 -> 0 bytes .../ic_shuffle_grey600_48dp.png | Bin 1057 -> 0 bytes .../ic_repeat_grey600_48dp.png | Bin 746 -> 0 bytes .../ic_shuffle_grey600_48dp.png | Bin 1428 -> 0 bytes .../layout-land/activity_music_controller.xml | 227 ----------- .../main/res/layout/activity_album_detail.xml | 12 +- .../res/layout/activity_album_tag_editor.xml | 2 +- .../res/layout/activity_artist_detail.xml | 31 +- app/src/main/res/layout/activity_main.xml | 46 +-- .../res/layout/activity_music_controller.xml | 379 +++++++++--------- .../res/layout/activity_playlist_detail.xml | 2 +- .../res/layout/activity_song_tag_editor.xml | 2 +- app/src/main/res/layout/item_grid_album.xml | 2 +- .../main/res/layout/item_list_artist_song.xml | 2 +- app/src/main/res/layout/item_list_search.xml | 2 +- app/src/main/res/layout/item_list_song.xml | 2 +- app/src/main/res/layout/item_search_album.xml | 2 +- app/src/main/res/values-v19/dimens.xml | 3 +- app/src/main/res/values-v21/dimens.xml | 3 +- app/src/main/res/values-v21/styles.xml | 1 + app/src/main/res/values/colors.xml | 2 +- app/src/main/res/values/dimens.xml | 4 +- app/src/main/res/values/styles.xml | 1 + app/src/main/res/xml/pref_ui.xml | 7 - 51 files changed, 1015 insertions(+), 684 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/BlurProcess.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/JavaBlurProcess.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/StackBlurManager.java create mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/HeightAndWidthFitSquarePlaceLeftRightImageView.java rename app/src/main/java/com/kabouzeid/gramophone/views/{SquareFitImageView.java => HeightFitSquareImageView.java} (54%) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/SquareIfPlaceLeftRightImageView.java rename app/src/main/java/com/kabouzeid/gramophone/views/{SquareImageView.java => WidthFitSquareImageView.java} (65%) delete mode 100644 app/src/main/res/drawable-hdpi/ic_repeat_grey600_48dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_shuffle_grey600_48dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_repeat_grey600_48dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_shuffle_grey600_48dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_repeat_grey600_48dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_shuffle_grey600_48dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_repeat_grey600_48dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_shuffle_grey600_48dp.png delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_repeat_grey600_48dp.png delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_shuffle_grey600_48dp.png delete mode 100644 app/src/main/res/layout-land/activity_music_controller.xml diff --git a/app/build.gradle b/app/build.gradle index d58ee5a0..83500474 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,14 +1,17 @@ buildscript { repositories { maven { url 'https://maven.fabric.io/public' } + mavenCentral() } dependencies { classpath 'io.fabric.tools:gradle:1.18.0' + classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1' } } apply plugin: 'com.android.application' apply plugin: 'io.fabric' +apply plugin: 'com.jakewharton.hugo' repositories { maven { url 'https://maven.fabric.io/public' } diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/BlurProcess.java b/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/BlurProcess.java new file mode 100644 index 00000000..cce072b3 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/BlurProcess.java @@ -0,0 +1,15 @@ +package com.kabouzeid.gramophone.helper.bitmapblur; + +import android.graphics.Bitmap; + +interface BlurProcess { + /** + * Process the given image, blurring by the supplied radius. + * If radius is 0, this will return original + * + * @param original the bitmap to be blurred + * @param radius the radius in pixels to blur the image + * @return the blurred version of the image. + */ + Bitmap blur(Bitmap original, float radius); +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/JavaBlurProcess.java b/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/JavaBlurProcess.java new file mode 100644 index 00000000..cc5a7336 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/JavaBlurProcess.java @@ -0,0 +1,329 @@ +package com.kabouzeid.gramophone.helper.bitmapblur; + +import android.graphics.Bitmap; + +import java.util.ArrayList; +import java.util.concurrent.Callable; + +/** + * Blur using Java code. + *

+ * This is a compromise between Gaussian Blur and Box blur + * It creates much better looking blurs than Box Blur, but is + * 7x faster than my Gaussian Blur implementation. + *

+ * I called it Stack Blur because this describes best how this + * filter works internally: it creates a kind of moving stack + * of colors whilst scanning through the image. Thereby it + * just has to add one new block of color to the right side + * of the stack and remove the leftmost color. The remaining + * colors on the topmost layer of the stack are either added on + * or reduced by one, depending on if they are on the right or + * on the left side of the stack. + * + * @author Enrique López Mañas + * http://www.neo-tech.es + *

+ * Author of the original algorithm: Mario Klingemann + *

+ * Based heavily on http://vitiy.info/Code/stackblur.cpp + * See http://vitiy.info/stackblur-algorithm-multi-threaded-blur-for-cpp/ + * @copyright: Enrique López Mañas + * @license: Apache License 2.0 + */ +class JavaBlurProcess implements BlurProcess { + + private static final short[] stackblur_mul = { + 512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, + 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, + 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, + 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, + 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, + 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, + 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, + 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, + 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, + 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, + 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, + 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, + 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, + 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, + 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, + 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259 + }; + + private static final byte[] stackblur_shr = { + 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, + 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 + }; + + @Override + public Bitmap blur(Bitmap original, float radius) { + int w = original.getWidth(); + int h = original.getHeight(); + int[] currentPixels = new int[w * h]; + original.getPixels(currentPixels, 0, w, 0, 0, w, h); + int cores = StackBlurManager.EXECUTOR_THREADS; + + ArrayList horizontal = new ArrayList(cores); + ArrayList vertical = new ArrayList(cores); + for (int i = 0; i < cores; i++) { + horizontal.add(new BlurTask(currentPixels, w, h, (int) radius, cores, i, 1)); + vertical.add(new BlurTask(currentPixels, w, h, (int) radius, cores, i, 2)); + } + + try { + StackBlurManager.EXECUTOR.invokeAll(horizontal); + } catch (InterruptedException e) { + return null; + } + + try { + StackBlurManager.EXECUTOR.invokeAll(vertical); + } catch (InterruptedException e) { + return null; + } + + return Bitmap.createBitmap(currentPixels, w, h, Bitmap.Config.ARGB_8888); + } + + private static void blurIteration(int[] src, int w, int h, int radius, int cores, int core, int step) { + int x, y, xp, yp, i; + int sp; + int stack_start; + int stack_i; + + int src_i; + int dst_i; + + long sum_r, sum_g, sum_b, + sum_in_r, sum_in_g, sum_in_b, + sum_out_r, sum_out_g, sum_out_b; + + int wm = w - 1; + int hm = h - 1; + int div = (radius * 2) + 1; + int mul_sum = stackblur_mul[radius]; + byte shr_sum = stackblur_shr[radius]; + int[] stack = new int[div]; + + if (step == 1) { + int minY = core * h / cores; + int maxY = (core + 1) * h / cores; + + for (y = minY; y < maxY; y++) { + sum_r = sum_g = sum_b = + sum_in_r = sum_in_g = sum_in_b = + sum_out_r = sum_out_g = sum_out_b = 0; + + src_i = w * y; // start of line (0,y) + + for (i = 0; i <= radius; i++) { + stack_i = i; + stack[stack_i] = src[src_i]; + sum_r += ((src[src_i] >>> 16) & 0xff) * (i + 1); + sum_g += ((src[src_i] >>> 8) & 0xff) * (i + 1); + sum_b += (src[src_i] & 0xff) * (i + 1); + sum_out_r += ((src[src_i] >>> 16) & 0xff); + sum_out_g += ((src[src_i] >>> 8) & 0xff); + sum_out_b += (src[src_i] & 0xff); + } + + + for (i = 1; i <= radius; i++) { + if (i <= wm) src_i += 1; + stack_i = i + radius; + stack[stack_i] = src[src_i]; + sum_r += ((src[src_i] >>> 16) & 0xff) * (radius + 1 - i); + sum_g += ((src[src_i] >>> 8) & 0xff) * (radius + 1 - i); + sum_b += (src[src_i] & 0xff) * (radius + 1 - i); + sum_in_r += ((src[src_i] >>> 16) & 0xff); + sum_in_g += ((src[src_i] >>> 8) & 0xff); + sum_in_b += (src[src_i] & 0xff); + } + + + sp = radius; + xp = radius; + if (xp > wm) xp = wm; + src_i = xp + y * w; // img.pix_ptr(xp, y); + dst_i = y * w; // img.pix_ptr(0, y); + for (x = 0; x < w; x++) { + src[dst_i] = (int) + ((src[dst_i] & 0xff000000) | + ((((sum_r * mul_sum) >>> shr_sum) & 0xff) << 16) | + ((((sum_g * mul_sum) >>> shr_sum) & 0xff) << 8) | + ((((sum_b * mul_sum) >>> shr_sum) & 0xff))); + dst_i += 1; + + sum_r -= sum_out_r; + sum_g -= sum_out_g; + sum_b -= sum_out_b; + + stack_start = sp + div - radius; + if (stack_start >= div) stack_start -= div; + stack_i = stack_start; + + sum_out_r -= ((stack[stack_i] >>> 16) & 0xff); + sum_out_g -= ((stack[stack_i] >>> 8) & 0xff); + sum_out_b -= (stack[stack_i] & 0xff); + + if (xp < wm) { + src_i += 1; + ++xp; + } + + stack[stack_i] = src[src_i]; + + sum_in_r += ((src[src_i] >>> 16) & 0xff); + sum_in_g += ((src[src_i] >>> 8) & 0xff); + sum_in_b += (src[src_i] & 0xff); + sum_r += sum_in_r; + sum_g += sum_in_g; + sum_b += sum_in_b; + + ++sp; + if (sp >= div) sp = 0; + stack_i = sp; + + sum_out_r += ((stack[stack_i] >>> 16) & 0xff); + sum_out_g += ((stack[stack_i] >>> 8) & 0xff); + sum_out_b += (stack[stack_i] & 0xff); + sum_in_r -= ((stack[stack_i] >>> 16) & 0xff); + sum_in_g -= ((stack[stack_i] >>> 8) & 0xff); + sum_in_b -= (stack[stack_i] & 0xff); + } + + } + } + + // step 2 + else if (step == 2) { + int minX = core * w / cores; + int maxX = (core + 1) * w / cores; + + for (x = minX; x < maxX; x++) { + sum_r = sum_g = sum_b = + sum_in_r = sum_in_g = sum_in_b = + sum_out_r = sum_out_g = sum_out_b = 0; + + src_i = x; // x,0 + for (i = 0; i <= radius; i++) { + stack_i = i; + stack[stack_i] = src[src_i]; + sum_r += ((src[src_i] >>> 16) & 0xff) * (i + 1); + sum_g += ((src[src_i] >>> 8) & 0xff) * (i + 1); + sum_b += (src[src_i] & 0xff) * (i + 1); + sum_out_r += ((src[src_i] >>> 16) & 0xff); + sum_out_g += ((src[src_i] >>> 8) & 0xff); + sum_out_b += (src[src_i] & 0xff); + } + for (i = 1; i <= radius; i++) { + if (i <= hm) src_i += w; // +stride + + stack_i = i + radius; + stack[stack_i] = src[src_i]; + sum_r += ((src[src_i] >>> 16) & 0xff) * (radius + 1 - i); + sum_g += ((src[src_i] >>> 8) & 0xff) * (radius + 1 - i); + sum_b += (src[src_i] & 0xff) * (radius + 1 - i); + sum_in_r += ((src[src_i] >>> 16) & 0xff); + sum_in_g += ((src[src_i] >>> 8) & 0xff); + sum_in_b += (src[src_i] & 0xff); + } + + sp = radius; + yp = radius; + if (yp > hm) yp = hm; + src_i = x + yp * w; // img.pix_ptr(x, yp); + dst_i = x; // img.pix_ptr(x, 0); + for (y = 0; y < h; y++) { + src[dst_i] = (int) + ((src[dst_i] & 0xff000000) | + ((((sum_r * mul_sum) >>> shr_sum) & 0xff) << 16) | + ((((sum_g * mul_sum) >>> shr_sum) & 0xff) << 8) | + ((((sum_b * mul_sum) >>> shr_sum) & 0xff))); + dst_i += w; + + sum_r -= sum_out_r; + sum_g -= sum_out_g; + sum_b -= sum_out_b; + + stack_start = sp + div - radius; + if (stack_start >= div) stack_start -= div; + stack_i = stack_start; + + sum_out_r -= ((stack[stack_i] >>> 16) & 0xff); + sum_out_g -= ((stack[stack_i] >>> 8) & 0xff); + sum_out_b -= (stack[stack_i] & 0xff); + + if (yp < hm) { + src_i += w; // stride + ++yp; + } + + stack[stack_i] = src[src_i]; + + sum_in_r += ((src[src_i] >>> 16) & 0xff); + sum_in_g += ((src[src_i] >>> 8) & 0xff); + sum_in_b += (src[src_i] & 0xff); + sum_r += sum_in_r; + sum_g += sum_in_g; + sum_b += sum_in_b; + + ++sp; + if (sp >= div) sp = 0; + stack_i = sp; + + sum_out_r += ((stack[stack_i] >>> 16) & 0xff); + sum_out_g += ((stack[stack_i] >>> 8) & 0xff); + sum_out_b += (stack[stack_i] & 0xff); + sum_in_r -= ((stack[stack_i] >>> 16) & 0xff); + sum_in_g -= ((stack[stack_i] >>> 8) & 0xff); + sum_in_b -= (stack[stack_i] & 0xff); + } + } + } + + } + + private static class BlurTask implements Callable { + private final int[] _src; + private final int _w; + private final int _h; + private final int _radius; + private final int _totalCores; + private final int _coreIndex; + private final int _round; + + public BlurTask(int[] src, int w, int h, int radius, int totalCores, int coreIndex, int round) { + _src = src; + _w = w; + _h = h; + _radius = radius; + _totalCores = totalCores; + _coreIndex = coreIndex; + _round = round; + } + + @Override + public Void call() throws Exception { + blurIteration(_src, _w, _h, _radius, _totalCores, _coreIndex, _round); + return null; + } + + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/StackBlurManager.java b/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/StackBlurManager.java new file mode 100644 index 00000000..76adef03 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/bitmapblur/StackBlurManager.java @@ -0,0 +1,89 @@ +/** + * StackBlur v1.0 for Android + * + * @Author: Enrique López Mañas + * http://www.lopez-manas.com + *

+ * Author of the original algorithm: Mario Klingemann + *

+ * This is a compromise between Gaussian Blur and Box blur + * It creates much better looking blurs than Box Blur, but is + * 7x faster than my Gaussian Blur implementation. + *

+ * I called it Stack Blur because this describes best how this + * filter works internally: it creates a kind of moving stack + * of colors whilst scanning through the image. Thereby it + * just has to add one new block of color to the right side + * of the stack and remove the leftmost color. The remaining + * colors on the topmost layer of the stack are either added on + * or reduced by one, depending on if they are on the right or + * on the left side of the stack. + * @copyright: Enrique López Mañas + * @license: Apache License 2.0 + */ + + +package com.kabouzeid.gramophone.helper.bitmapblur; + +import android.graphics.Bitmap; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class StackBlurManager { + static final int EXECUTOR_THREADS = Runtime.getRuntime().availableProcessors(); + static final ExecutorService EXECUTOR = Executors.newFixedThreadPool(EXECUTOR_THREADS); + + /** + * Original image + */ + private final Bitmap _image; + + /** + * Most recent result of blurring + */ + private Bitmap _result; + + /** + * Method of blurring + */ + private final BlurProcess _blurProcess; + + /** + * Constructor method (basic initialization and construction of the pixel array) + * + * @param image The image that will be analyed + */ + public StackBlurManager(Bitmap image) { + _image = image; + _blurProcess = new JavaBlurProcess(); + } + + /** + * Process the image on the given radius. Radius must be at least 1 + * + * @param radius + */ + public Bitmap process(int radius) { + _result = _blurProcess.blur(_image, radius); + return _result; + } + + /** + * Returns the blurred image as a bitmap + * + * @return blurred image + */ + public Bitmap returnBlurredImage() { + return _result; + } + + /** + * Returns the original image as a bitmap + * + * @return the original bitmap image + */ + public Bitmap getImage() { + return this._image; + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/UIPreferenceChangedEvent.java b/app/src/main/java/com/kabouzeid/gramophone/model/UIPreferenceChangedEvent.java index 7fab264e..202306c1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/UIPreferenceChangedEvent.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/UIPreferenceChangedEvent.java @@ -13,8 +13,7 @@ public class UIPreferenceChangedEvent { public static final int COLORED_NAVIGATION_BAR_CURRENT_PLAYING_CHANGED = 6; public static final int COLORED_NAVIGATION_BAR_CHANGED = 10; public static final int COLORED_NAVIGATION_BAR_OTHER_SCREENS_CHANGED = 7; - public static final int PLAYBACK_CONTROLLER_CARD_CHANGED = 8; - public static final int TOOLBAR_TRANSPARENT_CHANGED = 9; + public static final int TOOLBAR_TRANSPARENT_CHANGED = 8; private final int action; private final Object value; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index e8cba8e0..6f3c8505 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -1,8 +1,10 @@ package com.kabouzeid.gramophone.ui.activities; +import android.animation.Animator; import android.annotation.TargetApi; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Color; import android.os.Build; import android.os.Bundle; @@ -10,9 +12,12 @@ import android.support.v4.util.Pair; import android.support.v7.graphics.Palette; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.Toolbar; +import android.transition.Transition; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.ViewAnimationUtils; +import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.TextView; @@ -23,12 +28,14 @@ import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.songadapter.AlbumSongAdapter; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.loader.AlbumLoader; import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; +import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Song; @@ -65,6 +72,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH private ArrayList songs; private View statusBar; private ImageView albumArtImageView; + private ImageView albumArtBackground; private View songsBackgroundView; private TextView albumTitleView; private Toolbar toolbar; @@ -106,7 +114,6 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { - setStatusBarTranslucent(true); super.onCreate(savedInstanceState); setContentView(R.layout.activity_album_detail); @@ -115,7 +122,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH if (Util.isAtLeastLollipop()) { postponeEnterTransition(); if (PreferenceUtils.getInstance(this).coloredNavigationBarAlbumEnabled()) - getWindow().setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); + setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); } Bundle intentExtras = getIntent().getExtras(); @@ -132,6 +139,29 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH setUpObservableListViewParams(); setUpToolBar(); setUpViews(); + + if (Util.isAtLeastLollipop()) { + getWindow().getEnterTransition().addListener(new SmallTransitionListener() { + @Override + public void onTransitionStart(Transition transition) { + albumArtBackground.setVisibility(View.INVISIBLE); + } + + @Override + public void onTransitionEnd(Transition transition) { + int cx = (albumArtBackground.getLeft() + albumArtBackground.getRight()) / 2; + int cy = (albumArtBackground.getTop() + albumArtBackground.getBottom()) / 2; + int finalRadius = Math.max(albumArtBackground.getWidth(), albumArtBackground.getHeight()); + + Animator animator = ViewAnimationUtils.createCircularReveal(albumArtBackground, cx, cy, albumArtImageView.getWidth() / 2, finalRadius); + animator.setInterpolator(new DecelerateInterpolator()); + animator.setDuration(1000); + animator.start(); + + albumArtBackground.setVisibility(View.VISIBLE); + } + }); + } } @Override @@ -144,6 +174,11 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH return false; } + @Override + protected boolean shouldSetStatusBarTranslucent() { + return true; + } + @Override public String getTag() { return TAG; @@ -151,11 +186,12 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH private void initViews() { albumArtImageView = (ImageView) findViewById(R.id.album_art); + albumArtBackground = (ImageView) findViewById(R.id.album_art_background); toolbar = (Toolbar) findViewById(R.id.toolbar); recyclerView = (ObservableRecyclerView) findViewById(R.id.list); albumTitleView = (TextView) findViewById(R.id.album_title); songsBackgroundView = findViewById(R.id.list_background); - statusBar = findViewById(R.id.statusBar); + statusBar = findViewById(R.id.status_bar); } private void setUpObservableListViewParams() { @@ -166,7 +202,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH titleViewHeight = getResources().getDimensionPixelSize(R.dimen.title_view_height); headerOffset = toolbarHeight; if (Util.isAtLeastKitKat()) - headerOffset += getResources().getDimensionPixelSize(R.dimen.statusMargin); + headerOffset += getResources().getDimensionPixelSize(R.dimen.status_bar_padding); } private void setUpViews() { @@ -190,6 +226,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { applyPalette(null); + albumArtBackground.setImageBitmap(new StackBlurManager(BitmapFactory.decodeResource(getResources(), R.drawable.default_album_art)).process(10)); if (Util.isAtLeastLollipop()) startPostponedEnterTransition(); } @@ -197,6 +234,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { applyPalette(loadedImage); + albumArtBackground.setImageBitmap(new StackBlurManager(loadedImage).process(10)); if (Util.isAtLeastLollipop()) startPostponedEnterTransition(); } } @@ -216,7 +254,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH albumTitleView.setBackgroundColor(toolbarColor); albumTitleView.setTextColor(vibrantSwatch.getTitleTextColor()); if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(AlbumDetailActivity.this).coloredNavigationBarAlbumEnabled()) - getWindow().setNavigationBarColor(toolbarColor); + setNavigationBarColor(toolbarColor); notifyTaskColorChange(toolbarColor); } else { resetColors(); @@ -238,7 +276,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH albumTitleView.setTextColor(titleTextColor); if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled()) - getWindow().setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); + setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); notifyTaskColorChange(toolbarColor); } @@ -256,9 +294,9 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void setNavigationBarColored(boolean colored) { if (colored) { - if (Util.isAtLeastLollipop()) getWindow().setNavigationBarColor(toolbarColor); + setNavigationBarColor(toolbarColor); } else { - if (Util.isAtLeastLollipop()) getWindow().setNavigationBarColor(Color.BLACK); + setNavigationBarColor(Color.BLACK); } } @@ -405,4 +443,10 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH }); return cab; } + + @Override + public void onBackPressed() { + if (cab != null && cab.isActive()) cab.finish(); + else super.onBackPressed(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 24e0bd45..8f229f0d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -1,8 +1,10 @@ package com.kabouzeid.gramophone.ui.activities; +import android.animation.Animator; import android.annotation.TargetApi; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Color; import android.os.Build; import android.os.Bundle; @@ -17,6 +19,8 @@ import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.ViewAnimationUtils; +import android.view.animation.DecelerateInterpolator; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -30,6 +34,7 @@ import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.ArtistAlbumAdapter; import com.kabouzeid.gramophone.adapter.songadapter.ArtistSongAdapter; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistBiographyLoader; @@ -39,6 +44,7 @@ import com.kabouzeid.gramophone.loader.ArtistLoader; import com.kabouzeid.gramophone.loader.ArtistSongLoader; import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; +import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.model.Album; import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.DataBaseChangedEvent; @@ -71,6 +77,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor private ObservableListView songListView; private View statusBar; private ImageView artistImage; + private ImageView artistImageBackground; private View songsBackgroundView; private TextView artistNameTv; private Toolbar toolbar; @@ -121,7 +128,6 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { - setStatusBarTranslucent(true); super.onCreate(savedInstanceState); setContentView(R.layout.activity_artist_detail); @@ -130,7 +136,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor if (Util.isAtLeastLollipop()) { postponeEnterTransition(); if (PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled()) - getWindow().setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); + setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); } getIntentExtras(); @@ -146,6 +152,29 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor fixLollipopTransitionImageWrongSize(); startPostponedEnterTransition(); } + + if (Util.isAtLeastLollipop()) { + getWindow().getEnterTransition().addListener(new SmallTransitionListener() { + @Override + public void onTransitionStart(Transition transition) { + artistImageBackground.setVisibility(View.INVISIBLE); + } + + @Override + public void onTransitionEnd(Transition transition) { + int cx = (artistImageBackground.getLeft() + artistImageBackground.getRight()) / 2; + int cy = (artistImageBackground.getTop() + artistImageBackground.getBottom()) / 2; + int finalRadius = Math.max(artistImageBackground.getWidth(), artistImageBackground.getHeight()); + + Animator animator = ViewAnimationUtils.createCircularReveal(artistImageBackground, cx, cy, artistImage.getWidth() / 2, finalRadius); + animator.setInterpolator(new DecelerateInterpolator()); + animator.setDuration(1000); + animator.start(); + + artistImageBackground.setVisibility(View.VISIBLE); + } + }); + } } @Override @@ -158,13 +187,19 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor return false; } + @Override + protected boolean shouldSetStatusBarTranslucent() { + return true; + } + private void initViews() { artistImage = (ImageView) findViewById(R.id.artist_image); + artistImageBackground = (ImageView) findViewById(R.id.artist_image_background); toolbar = (Toolbar) findViewById(R.id.toolbar); songListView = (ObservableListView) findViewById(R.id.list); artistNameTv = (TextView) findViewById(R.id.artist_name); songsBackgroundView = findViewById(R.id.list_background); - statusBar = findViewById(R.id.statusBar); + statusBar = findViewById(R.id.status_bar); songListHeader = LayoutInflater.from(this).inflate(R.layout.artist_detail_header, songListView, false); albumRecyclerView = (RecyclerView) songListHeader.findViewById(R.id.recycler_view); @@ -178,7 +213,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor titleViewHeight = getResources().getDimensionPixelSize(R.dimen.title_view_height); headerOffset = toolbarHeight; if (Util.isAtLeastKitKat()) - headerOffset += getResources().getDimensionPixelSize(R.dimen.statusMargin); + headerOffset += getResources().getDimensionPixelSize(R.dimen.status_bar_padding); } @Override @@ -203,9 +238,9 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void setNavigationBarColored(boolean colored) { if (colored) { - if (Util.isAtLeastLollipop()) getWindow().setNavigationBarColor(toolbarColor); + setNavigationBarColor(toolbarColor); } else { - if (Util.isAtLeastLollipop()) getWindow().setNavigationBarColor(Color.BLACK); + setNavigationBarColor(Color.BLACK); } } @@ -257,6 +292,8 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor } private void setUpArtistImageAndApplyPalette(final boolean forceDownload) { + final StackBlurManager defaultArtistImageBlurManager = new StackBlurManager(BitmapFactory.decodeResource(getResources(), R.drawable.default_artist_image)); + artistImageBackground.setImageBitmap(defaultArtistImageBlurManager.process(10)); LastFMArtistImageUrlLoader.loadArtistImageUrl(this, artist.name, forceDownload, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() { @Override public void onArtistImageUrlLoaded(final String url) { @@ -272,11 +309,13 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { applyPalette(null); + artistImageBackground.setImageBitmap(defaultArtistImageBlurManager.returnBlurredImage()); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { applyPalette(loadedImage); + artistImageBackground.setImageBitmap(new StackBlurManager(loadedImage).process(10)); } } ); @@ -297,7 +336,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor artistNameTv.setBackgroundColor(vibrantSwatch.getRgb()); artistNameTv.setTextColor(vibrantSwatch.getTitleTextColor()); if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(ArtistDetailActivity.this).coloredNavigationBarArtistEnabled()) - getWindow().setNavigationBarColor(vibrantSwatch.getRgb()); + setNavigationBarColor(vibrantSwatch.getRgb()); notifyTaskColorChange(toolbarColor); } else { resetColors(); @@ -336,7 +375,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor artistNameTv.setTextColor(titleTextColor); if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(this).coloredNavigationBarArtistEnabled()) - getWindow().setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); + setNavigationBarColor(DialogUtils.resolveColor(this, R.attr.default_bar_color)); notifyTaskColorChange(toolbarColor); } @@ -491,4 +530,10 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor }); return cab; } + + @Override + public void onBackPressed() { + if (cab != null && cab.isActive()) cab.finish(); + else super.onBackPressed(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 655c0750..a8b02f06 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -23,6 +23,7 @@ import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; +import android.view.View; import android.widget.FrameLayout; import com.afollestad.materialcab.MaterialCab; @@ -72,10 +73,10 @@ public class MainActivity extends AbsFabActivity private PagerSlidingTabStrip slidingTabLayout; private int currentPage = -1; private MaterialCab cab; + private View statusBar; @Override protected void onCreate(Bundle savedInstanceState) { - setStatusBarTranslucent(!Util.isAtLeastLollipop()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -92,7 +93,7 @@ public class MainActivity extends AbsFabActivity @Override protected boolean shouldColorStatusBar() { - return !Util.isAtLeastLollipop(); + return false; } @Override @@ -100,6 +101,11 @@ public class MainActivity extends AbsFabActivity return PreferenceUtils.getInstance(this).coloredNavigationBarOtherScreensEnabled(); } + @Override + protected boolean shouldSetStatusBarTranslucent() { + return true; + } + private void setUpViewPager() { pagerAdapter = new PagerAdapter(this, getSupportFragmentManager()); final PagerAdapter.MusicFragments[] fragments = PagerAdapter.MusicFragments.values(); @@ -144,6 +150,7 @@ public class MainActivity extends AbsFabActivity drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); navigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.navigation_drawer); + statusBar = findViewById(R.id.status_bar); } private void setUpToolBar() { @@ -159,6 +166,7 @@ public class MainActivity extends AbsFabActivity final int colorPrimary = PreferenceUtils.getInstance(this).getThemeColorPrimary(); ViewUtil.setBackgroundAlpha(toolbar, alpha, colorPrimary); ViewUtil.setBackgroundAlpha(slidingTabLayout, alpha, colorPrimary); + ViewUtil.setBackgroundAlpha(statusBar, alpha, colorPrimary); } private void setUpDrawerToggle() { @@ -178,9 +186,6 @@ public class MainActivity extends AbsFabActivity } private void setUpDrawerLayout() { - drawerLayout.setStatusBarBackgroundColor(PreferenceUtils - .getInstance(this).getThemeColorPrimaryDarker()); - FrameLayout navDrawerFrame = (FrameLayout) findViewById(R.id.nav_drawer_frame); int navDrawerMargin = getResources().getDimensionPixelSize(R.dimen.nav_drawer_margin); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); @@ -364,11 +369,9 @@ public class MainActivity extends AbsFabActivity @Override public void onBackPressed() { - if (navigationDrawerFragment.isDrawerOpen()) { - drawerLayout.closeDrawers(); - return; - } - super.onBackPressed(); + if (navigationDrawerFragment.isDrawerOpen()) drawerLayout.closeDrawers(); + else if (cab != null && cab.isActive()) cab.finish(); + else super.onBackPressed(); } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index f784b720..eefd715d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -1,37 +1,41 @@ package com.kabouzeid.gramophone.ui.activities; +import android.animation.Animator; import android.annotation.TargetApi; import android.content.Intent; import android.content.res.ColorStateList; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.PorterDuff; import android.os.Build; import android.os.Bundle; import android.support.v7.graphics.Palette; import android.support.v7.widget.Toolbar; +import android.transition.Transition; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.ViewAnimationUtils; import android.view.animation.DecelerateInterpolator; +import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; -import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import com.afollestad.materialdialogs.ThemeSingleton; import com.afollestad.materialdialogs.util.DialogUtils; -import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog; +import com.kabouzeid.gramophone.dialogs.ColorChooserDialog; import com.kabouzeid.gramophone.dialogs.SongDetailDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; -import com.kabouzeid.gramophone.lastfm.artist.LastFMArtistImageUrlLoader; +import com.kabouzeid.gramophone.helper.bitmapblur.StackBlurManager; import com.kabouzeid.gramophone.loader.SongFilePathLoader; import com.kabouzeid.gramophone.misc.AppKeys; +import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.model.MusicRemoteEvent; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent; import com.kabouzeid.gramophone.service.MusicService; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; @@ -45,7 +49,6 @@ import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.nostra13.universalimageloader.core.assist.FailReason; import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener; -import com.squareup.otto.Subscribe; import java.io.File; @@ -57,42 +60,65 @@ public class MusicControllerActivity extends AbsFabActivity { private Song song; private ImageView albumArt; - private ImageView artistImage; + private ImageView albumArtBackground; private TextView songTitle; private TextView songArtist; private TextView currentSongProgress; private TextView totalSongDuration; private View footer; + private View progressContainer; private SeekBar progressSlider; private ImageButton nextButton; private ImageButton prevButton; private ImageButton repeatButton; private ImageButton shuffleButton; private View mediaControllerContainer; + private Toolbar toolbar; private int lastFooterColor = -1; private boolean killThreads = false; @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { - setStatusBarTranslucent(true); super.onCreate(savedInstanceState); setContentView(R.layout.activity_music_controller); - App.bus.register(this); - initViews(); + albumArtBackground.setAlpha(0.7f); moveSeekBarIntoPlace(); setUpMusicControllers(); - prepareViewsForOpenAnimation(); - - setSupportActionBar((Toolbar) findViewById(R.id.toolbar)); + setSupportActionBar(toolbar); getSupportActionBar().setTitle(null); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + if (Util.isAtLeastLollipop()) { + getWindow().getEnterTransition().addListener(new SmallTransitionListener() { + @Override + public void onTransitionStart(Transition transition) { + mediaControllerContainer.setVisibility(View.INVISIBLE); + } + + @Override + public void onTransitionEnd(Transition transition) { + int cx = (getFab().getLeft() + getFab().getRight()) / 2; + int cy = (getFab().getTop() + getFab().getBottom()) / 2; + int finalRadius = Math.max(mediaControllerContainer.getWidth(), mediaControllerContainer.getHeight()); + + Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, getFab().getWidth() / 2, finalRadius); + animator.setInterpolator(new DecelerateInterpolator()); + animator.setDuration(1000); + animator.start(); + + int i = footer.getHeight(); + + mediaControllerContainer.setVisibility(View.VISIBLE); + } + }); + } } @Override @@ -111,11 +137,16 @@ public class MusicControllerActivity extends AbsFabActivity { return false; // let other code handle this below } + @Override + protected boolean shouldSetStatusBarTranslucent() { + return true; + } + private void moveSeekBarIntoPlace() { - RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) progressSlider.getLayoutParams(); + FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) progressSlider.getLayoutParams(); progressSlider.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); final int seekBarMarginLeftRight = getResources().getDimensionPixelSize(R.dimen.seek_bar_margin_left_right); - lp.setMargins(seekBarMarginLeftRight, 0, seekBarMarginLeftRight, -(progressSlider.getMeasuredHeight() / 2)); + lp.setMargins(seekBarMarginLeftRight, getResources().getDimensionPixelSize(R.dimen.progress_container_height) - (progressSlider.getMeasuredHeight() / 2), seekBarMarginLeftRight, 0); progressSlider.setLayoutParams(lp); } @@ -125,7 +156,7 @@ public class MusicControllerActivity extends AbsFabActivity { repeatButton = (ImageButton) findViewById(R.id.repeat_button); shuffleButton = (ImageButton) findViewById(R.id.shuffle_button); albumArt = (ImageView) findViewById(R.id.album_art); - artistImage = (ImageView) findViewById(R.id.artist_image); + albumArtBackground = (ImageView) findViewById(R.id.album_art_background); songTitle = (TextView) findViewById(R.id.song_title); songArtist = (TextView) findViewById(R.id.song_artist); currentSongProgress = (TextView) findViewById(R.id.song_current_progress); @@ -133,6 +164,8 @@ public class MusicControllerActivity extends AbsFabActivity { footer = findViewById(R.id.footer); progressSlider = (SeekBar) findViewById(R.id.progress_slider); mediaControllerContainer = findViewById(R.id.media_controller_container); + toolbar = (Toolbar) findViewById(R.id.toolbar); + progressContainer = findViewById(R.id.progress_container); } private void setUpMusicControllers() { @@ -140,26 +173,6 @@ public class MusicControllerActivity extends AbsFabActivity { setUpRepeatButton(); setUpShuffleButton(); setUpProgressSlider(); - setUpBox(PreferenceUtils.getInstance(this).playbackControllerBoxEnabled()); - } - - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - private void setUpBox(boolean boxEnabled) { - if (boxEnabled) { - if (Util.isAtLeastLollipop()) { - mediaControllerContainer.setElevation(getResources().getDimensionPixelSize(R.dimen.cardview_default_elevation)); - } - mediaControllerContainer.setBackgroundColor( - DialogUtils.resolveColor(this, R.attr.music_controller_container_color)); - } else { - if (Util.isAtLeastLollipop() && !Util.isInPortraitMode(this)) { - mediaControllerContainer.setElevation(getResources().getDimensionPixelSize(R.dimen.cardview_default_elevation)); - mediaControllerContainer.setBackgroundColor( - DialogUtils.resolveColor(this, R.attr.music_controller_container_color)); - } else { - mediaControllerContainer.setBackground(null); - } - } } private static void setTint(SeekBar seekBar, int color) { @@ -264,10 +277,6 @@ public class MusicControllerActivity extends AbsFabActivity { } } - private void prepareViewsForOpenAnimation() { - footer.setPivotY(0); - footer.setScaleY(0); - } @Override public String getTag() { @@ -277,6 +286,7 @@ public class MusicControllerActivity extends AbsFabActivity { @Override protected void onResume() { super.onResume(); + updateControllerState(); startMusicControllerStateUpdateThread(); updateCurrentSong(); } @@ -284,7 +294,6 @@ public class MusicControllerActivity extends AbsFabActivity { private void updateCurrentSong() { getCurrentSong(); setHeadersText(); - setUpArtistArt(); setUpAlbumArtAndApplyPalette(); totalSongDuration.setText(MusicUtil.getReadableDurationString(song.duration)); currentSongProgress.setText(MusicUtil.getReadableDurationString(-1)); @@ -307,17 +316,18 @@ public class MusicControllerActivity extends AbsFabActivity { new DisplayImageOptions.Builder() .cacheInMemory(true) .showImageOnFail(R.drawable.default_album_art) - .resetViewBeforeLoading(true) .build(), new SimpleImageLoadingListener() { @Override public void onLoadingFailed(String imageUri, View view, FailReason failReason) { applyPalette(null); + albumArtBackground.setImageBitmap(new StackBlurManager(BitmapFactory.decodeResource(getResources(), R.drawable.default_album_art)).process(10)); } @Override public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { applyPalette(loadedImage); + albumArtBackground.setImageBitmap(new StackBlurManager(loadedImage).process(10)); } } ); @@ -335,6 +345,8 @@ public class MusicControllerActivity extends AbsFabActivity { animateColorChange(swatchRgb); songTitle.setTextColor(vibrantSwatch.getTitleTextColor()); songArtist.setTextColor(vibrantSwatch.getBodyTextColor()); + currentSongProgress.setTextColor(vibrantSwatch.getTitleTextColor()); + totalSongDuration.setTextColor(vibrantSwatch.getTitleTextColor()); notifyTaskColorChange(swatchRgb); } else { resetColors(); @@ -355,6 +367,8 @@ public class MusicControllerActivity extends AbsFabActivity { songTitle.setTextColor(songTitleTextColor); songArtist.setTextColor(artistNameTextColor); + currentSongProgress.setTextColor(artistNameTextColor); + totalSongDuration.setTextColor(artistNameTextColor); notifyTaskColorChange(defaultBarColor); } @@ -363,34 +377,19 @@ public class MusicControllerActivity extends AbsFabActivity { private void animateColorChange(final int newColor) { if (lastFooterColor != -1 && lastFooterColor != newColor) { ViewUtil.animateViewColor(footer, lastFooterColor, newColor, 300); + ViewUtil.animateViewColor(progressContainer, ColorChooserDialog.shiftColorDown(lastFooterColor), ColorChooserDialog.shiftColorDown(newColor), 300); + ViewUtil.animateViewColor(toolbar, lastFooterColor, newColor, 300); } else { footer.setBackgroundColor(newColor); + progressContainer.setBackgroundColor(ColorChooserDialog.shiftColorDown(newColor)); + toolbar.setBackgroundColor(newColor); } + setStatusBarColor(newColor); if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(this).coloredNavigationBarCurrentPlayingEnabled()) - getWindow().setNavigationBarColor(newColor); + setNavigationBarColor(newColor); lastFooterColor = newColor; } - private void setUpArtistArt() { - if (artistImage != null) { - artistImage.setImageResource(R.drawable.default_artist_image); - LastFMArtistImageUrlLoader.loadArtistImageUrl(this, song.artistName, false, new LastFMArtistImageUrlLoader.ArtistImageUrlLoaderCallback() { - @Override - public void onArtistImageUrlLoaded(String url) { - ImageLoader.getInstance().displayImage(url, - artistImage, - new DisplayImageOptions.Builder() - .cacheInMemory(true) - .cacheOnDisk(true) - .showImageOnFail(R.drawable.default_artist_image) - .resetViewBeforeLoading(true) - .build() - ); - } - }); - } - } - private void getCurrentSong() { song = MusicPlayerRemote.getCurrentSong(); if (song.id == -1) { @@ -430,9 +429,8 @@ public class MusicControllerActivity extends AbsFabActivity { }).start(); } - @Override protected void updateControllerState() { - super.updateControllerState(); + updateFabState(); updateRepeatState(); updateShuffleState(); } @@ -522,19 +520,4 @@ public class MusicControllerActivity extends AbsFabActivity { .setStartDelay(startDelay) .start(); } - - @Subscribe - public void onUIPrefsChanged(UIPreferenceChangedEvent event) { - switch (event.getAction()) { - case UIPreferenceChangedEvent.PLAYBACK_CONTROLLER_CARD_CHANGED: - setUpBox((boolean) event.getValue()); - break; - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - App.bus.unregister(this); - } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index bc54df02..d633b278 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -26,7 +26,6 @@ import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PreferenceUtils; -import com.kabouzeid.gramophone.util.Util; import com.squareup.otto.Subscribe; import java.util.ArrayList; @@ -42,7 +41,6 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { - setStatusBarTranslucent(!Util.isAtLeastLollipop()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_playlist_detail); @@ -94,6 +92,11 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder return PreferenceUtils.getInstance(this).coloredNavigationBarPlaylistEnabled(); } + @Override + protected boolean shouldSetStatusBarTranslucent() { + return true; + } + private void getIntentExtras() { Bundle intentExtras = getIntent().getExtras(); final int playlistId = intentExtras.getInt(AppKeys.E_PLAYLIST); @@ -163,4 +166,10 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder break; } } + + @Override + public void onBackPressed() { + if (cab != null && cab.isActive()) cab.finish(); + else super.onBackPressed(); + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java index da7a2d5e..7cf0c338 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SearchActivity.java @@ -34,7 +34,6 @@ public class SearchActivity extends AbsBaseActivity { @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { - setStatusBarTranslucent(false); setTitle(null); super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); @@ -72,6 +71,11 @@ public class SearchActivity extends AbsBaseActivity { return true; } + @Override + protected boolean shouldSetStatusBarTranslucent() { + return true; + } + @Override public String getTag() { return TAG; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java index ed295c82..087e3e82 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/SettingsActivity.java @@ -22,7 +22,6 @@ import com.kabouzeid.gramophone.prefs.ColorChooserPreference; import com.kabouzeid.gramophone.ui.activities.base.AbsBaseActivity; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PreferenceUtils; -import com.kabouzeid.gramophone.util.Util; import java.util.Set; @@ -31,7 +30,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia @Override protected void onCreate(Bundle savedInstanceState) { - setStatusBarTranslucent(!Util.isAtLeastLollipop()); super.onCreate(savedInstanceState); setContentView(R.layout.activity_preferences); @@ -54,6 +52,11 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia return PreferenceUtils.getInstance(this).coloredNavigationBarOtherScreensEnabled(); } + @Override + protected boolean shouldSetStatusBarTranslucent() { + return true; + } + @Override public void onColorSelection(int title, int color) { if (title == R.string.primary_color) { @@ -137,14 +140,6 @@ public class SettingsActivity extends AbsBaseActivity implements ColorChooserDia } }); - findPreference("playback_controller_card").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object o) { - App.bus.post(new UIPreferenceChangedEvent(UIPreferenceChangedEvent.PLAYBACK_CONTROLLER_CARD_CHANGED, o)); - return true; - } - }); - Preference colorNavBar = findPreference("colored_navigation_bar"); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { colorNavBar.setEnabled(false); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java index b635d5c7..fa6f3305 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java @@ -113,7 +113,7 @@ public abstract class AbsFabActivity extends AbsBaseActivity { }); } - private void updateFabState() { + protected void updateFabState() { if (MusicPlayerRemote.isPlaying()) { playPauseDrawable.setPause(); } else { @@ -135,10 +135,6 @@ public abstract class AbsFabActivity extends AbsBaseActivity { @Override protected void onResume() { super.onResume(); - updateControllerState(); - } - - protected void updateControllerState() { updateFabState(); } @@ -190,4 +186,8 @@ public abstract class AbsFabActivity extends AbsBaseActivity { private void setFabPause() { playPauseDrawable.animatedPause(); } + + private void setFabColor() { + + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/ThemeBaseActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/ThemeBaseActivity.java index 1e34a122..283ba71b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/ThemeBaseActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/ThemeBaseActivity.java @@ -3,45 +3,28 @@ package com.kabouzeid.gramophone.ui.activities.base; import android.annotation.TargetApi; import android.app.ActivityManager; import android.graphics.BitmapFactory; -import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.afollestad.materialdialogs.ThemeSingleton; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.dialogs.ColorChooserDialog; import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; import com.kabouzeid.gramophone.util.PreferenceUtils; import com.kabouzeid.gramophone.util.Util; import com.readystatesoftware.systembartint.SystemBarTintManager; /** - * @author Aidan Follestad (afollestad) - */ - -/** - * READ! - *

- * Instructions: - *

- * KitKat or Lollipop solid statusBar with the right color (primaryDark): - * - shouldColorStatusBar return true OR return false and call setStatusBarColor() in the activity with a custom color - * - setStatusBarTranslucent(!Util.isAtLeastLollipop()) - *

- * KitKat or Lollipop translucent statusBar (not the color is too dark on Lollipop and KitKat only does fading but MUCH better performance the setStatusBarColor in onScrollCallback) - * - shouldColorStatusBar return false DO NOT return true and do not call setStatusBarColor() in this case at all here - * - setStatusBarTranslucent(true) - * - use a view below the statusBar to color it + * @author Aidan Follestad (afollestad), Karim Abou Zeid (kabouzeid) */ public abstract class ThemeBaseActivity extends AppCompatActivity implements KabViewsDisableAble { - -// private boolean mLastDarkTheme; -// private int mLastPrimary; -// private int mLastAccent; + private final boolean statusBarTranslucent = shouldSetStatusBarTranslucent(); @Override protected void onCreate(Bundle savedInstanceState) { + setStatusBarTranslucent(statusBarTranslucent); setTheme(PreferenceUtils.getInstance(this).getGeneralTheme()); super.onCreate(savedInstanceState); setupTheme(); @@ -53,11 +36,6 @@ public abstract class ThemeBaseActivity extends AppCompatActivity implements Kab setShouldColorNavBar(shouldColorNavBar()); setShouldColorStatusBar(shouldColorStatusBar()); - // Persist current values so the Activity knows if they change -// mLastDarkTheme = PreferenceUtils.getInstance(this).getGeneralTheme() == 1; -// mLastPrimary = PreferenceUtils.getInstance(this).getThemeColorPrimary(); -// mLastAccent = PreferenceUtils.getInstance(this).getThemeColorAccent(); - // Accent colors in dialogs, and any dynamic views that pull from this singleton ThemeSingleton.get().positiveColor = PreferenceUtils.getInstance(this).getThemeColorAccent(); ThemeSingleton.get().negativeColor = ThemeSingleton.get().positiveColor; @@ -71,10 +49,6 @@ public abstract class ThemeBaseActivity extends AppCompatActivity implements Kab } } - protected boolean overridesTaskColor() { - return false; - } - protected void notifyTaskColorChange(int color) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Sets color of entry in the system recents page @@ -86,30 +60,22 @@ public abstract class ThemeBaseActivity extends AppCompatActivity implements Kab } } -// @Override -// protected void onResume() { -// super.onResume(); -// if (mLastDarkTheme != (PreferenceUtils.getInstance(this).getGeneralTheme() == 1) || -// mLastPrimary != PreferenceUtils.getInstance(this).getThemeColorPrimary() || -// mLastAccent != PreferenceUtils.getInstance(this).getThemeColorAccent()) { -// // Theme colors changed, recreate the Activity -// recreate(); -// } -// } - - protected void setStatusBarTranslucent(boolean statusBarTranslucent) { + private void setStatusBarTranslucent(boolean statusBarTranslucent) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Util.setStatusBarTranslucent(getWindow(), statusBarTranslucent); } } - protected abstract boolean shouldColorStatusBar(); + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + protected final void setNavigationBarColor(int color) { + if (Util.isAtLeastLollipop()) + getWindow().setNavigationBarColor(ColorChooserDialog.shiftColorDown(color)); - protected abstract boolean shouldColorNavBar(); + } @TargetApi(Build.VERSION_CODES.LOLLIPOP) - protected final void setStatusBarColor(int color, boolean forceSystemBarTint) { - if (!forceSystemBarTint && Util.isAtLeastLollipop()) { + protected final void setStatusBarColor(int color) { + if (!statusBarTranslucent && Util.isAtLeastLollipop()) { getWindow().setStatusBarColor(color); } else { SystemBarTintManager tintManager = new SystemBarTintManager(this); @@ -122,10 +88,9 @@ public abstract class ThemeBaseActivity extends AppCompatActivity implements Kab protected final void setShouldColorNavBar(boolean shouldColorNavBar) { if (Util.isAtLeastLollipop()) { if (shouldColorNavBar) { - final int primaryDark = PreferenceUtils.getInstance(this).getThemeColorPrimaryDarker(); - getWindow().setNavigationBarColor(primaryDark); + setNavigationBarColor(PreferenceUtils.getInstance(this).getThemeColorPrimary()); } else { - getWindow().setNavigationBarColor(Color.BLACK); + getWindow().setNavigationBarColor(Util.resolveColor(this, android.R.attr.navigationBarColor)); } } } @@ -133,8 +98,8 @@ public abstract class ThemeBaseActivity extends AppCompatActivity implements Kab @TargetApi(Build.VERSION_CODES.LOLLIPOP) protected final void setShouldColorStatusBar(boolean shouldColorStatusBar) { if (shouldColorStatusBar) { - final int primaryDark = PreferenceUtils.getInstance(this).getThemeColorPrimaryDarker(); - setStatusBarColor(primaryDark, false); + final int primary = PreferenceUtils.getInstance(this).getThemeColorPrimary(); + setStatusBarColor(primary); } else { if (Util.isAtLeastLollipop()) { getWindow().setStatusBarColor(Util.resolveColor(this, android.R.attr.statusBarColor)); @@ -144,4 +109,14 @@ public abstract class ThemeBaseActivity extends AppCompatActivity implements Kab } } } + + protected abstract boolean shouldColorStatusBar(); + + protected abstract boolean shouldColorNavBar(); + + protected abstract boolean shouldSetStatusBarTranslucent(); + + protected boolean overridesTaskColor() { + return false; + } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index efc49d4d..b7963e97 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -90,7 +90,6 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { - setStatusBarTranslucent(!Util.isAtLeastLollipop()); super.onCreate(savedInstanceState); setContentView(getContentViewResId()); @@ -123,6 +122,11 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { return false; } + @Override + protected boolean shouldSetStatusBarTranslucent() { + return true; + } + private void initViews() { fab = (FloatingActionButton) findViewById(R.id.fab); scrollView = (ObservableScrollView) findViewById(R.id.observableScrollView); @@ -212,9 +216,9 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { final int primaryColor = PreferenceUtils.getInstance(this).getThemeColorPrimary(); paletteColorPrimary = primaryColor; observableScrollViewCallbacks.onScrollChanged(scrollView.getCurrentScrollY(), false, false); - setStatusBarColor(ColorChooserDialog.shiftColorDown(primaryColor), false); + setStatusBarColor(primaryColor); if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(this).coloredNavigationBarTagEditorEnabled()) - getWindow().setNavigationBarColor(primaryColor); + setNavigationBarColor(primaryColor); notifyTaskColorChange(primaryColor); } @@ -264,10 +268,9 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { toolBar.setBackgroundColor(paletteColorPrimary); header.setBackgroundColor(paletteColorPrimary); - int primaryDark = ColorChooserDialog.shiftColorDown(paletteColorPrimary); - setStatusBarColor(primaryDark, false); + setStatusBarColor(paletteColorPrimary); if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(this).coloredNavigationBarTagEditorEnabled()) - getWindow().setNavigationBarColor(primaryDark); + setNavigationBarColor(ColorChooserDialog.shiftColorDown(paletteColorPrimary)); } protected void dataChanged() { @@ -309,9 +312,9 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { final int vibrantColor = palette.getVibrantColor(DialogUtils.resolveColor(AbsTagEditorActivity.this, R.attr.default_bar_color)); paletteColorPrimary = vibrantColor; observableScrollViewCallbacks.onScrollChanged(scrollView.getCurrentScrollY(), false, false); - setStatusBarColor(ColorChooserDialog.shiftColorDown(vibrantColor), false); + setStatusBarColor(vibrantColor); if (Util.isAtLeastLollipop() && PreferenceUtils.getInstance(AbsTagEditorActivity.this).coloredNavigationBarTagEditorEnabled()) - getWindow().setNavigationBarColor(vibrantColor); + setNavigationBarColor(vibrantColor); notifyTaskColorChange(vibrantColor); } else { resetColors(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java index 0739b3b3..31ccd7ff 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java @@ -15,15 +15,10 @@ public abstract class AbsMainActivityFragment extends Fragment implements KabVie private boolean areViewsEnabled; protected int getTopPadding() { - final int norm = Util.getActionBarSize(getActivity()) + + return Util.getActionBarSize(getActivity()) + + Util.getStatusBarHeight(getActivity()) + getResources().getDimensionPixelSize(R.dimen.tab_height) + getResources().getDimensionPixelSize(R.dimen.list_padding_vertical); - if (Util.isAtLeastKitKat() && !Util.isAtLeastLollipop()) { - if (Util.isInPortraitMode(getActivity()) || Util.isTablet(getActivity())) { - return norm + Util.getStatusBarHeight(getActivity()); - } - } - return norm; } protected int getBottomPadding() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java index a705ed8d..b9831097 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtils.java @@ -23,7 +23,7 @@ public final class PreferenceUtils { public static final String ALBUM_SORT_ORDER = "album_sort_order"; public static final String ALBUM_SONG_SORT_ORDER = "album_song_sort_order"; public static final String SONG_SORT_ORDER = "song_sort_order"; - public static final String ONLY_ON_WIFI = "auto_download_artist_images"; + // public static final String ONLY_ON_WIFI = "auto_download_artist_images"; // public static final String DOWNLOAD_MISSING_ARTIST_IMAGES = "auto_download_artist_images"; public static final String COLORED_ALBUM_FOOTERS = "colored_album_footers"; public static final String COLORED_NAVIGATION_BAR = "colored_navigation_bar"; @@ -33,7 +33,6 @@ public final class PreferenceUtils { public static final String COLORED_NAVIGATION_BAR_PLAYIST = "colored_navigation_bar_playlist"; public static final String COLORED_NAVIGATION_BAR_TAG_EDITOR = "colored_navigation_bar_tag_editor"; public static final String COLORED_NAVIGATION_BAR_OTHER_SCREENS = "colored_navigation_bar_other_screens"; - public static final String PLAYBACK_CONTROLLER_BOX = "playback_controller_card"; public static final String TRANSPARENT_TOOLBAR = "transparent_toolbar"; public static final String ALBUM_GRID_COLUMNS = "album_grid_columns"; public static final String ALBUM_GRID_COLUMNS_LAND = "album_grid_columns_land"; @@ -136,7 +135,7 @@ public final class PreferenceUtils { @SuppressLint("CommitPrefEdits") private boolean coloredNavigationBarFor(String key) { - Set defaultVals = new HashSet<>(); + final Set defaultVals = new HashSet<>(); defaultVals.add(COLORED_NAVIGATION_BAR_ALBUM); defaultVals.add(COLORED_NAVIGATION_BAR_ARTIST); defaultVals.add(COLORED_NAVIGATION_BAR_CURRENT_PLAYING); @@ -148,6 +147,7 @@ public final class PreferenceUtils { mPreferences.edit().putStringSet(COLORED_NAVIGATION_BAR, defaultVals).commit(); try { + //noinspection ConstantConditions return mPreferences.getStringSet(COLORED_NAVIGATION_BAR, defaultVals).contains(key); } catch (NullPointerException e) { return false; @@ -159,10 +159,6 @@ public final class PreferenceUtils { // mPreferences.edit().putBoolean(COLORED_NAVIGATION_BAR_OTHER_SCREENS, coloredNavbar).commit(); // } - public final boolean playbackControllerBoxEnabled() { - return mPreferences.getBoolean(PLAYBACK_CONTROLLER_BOX, false); - } - public final boolean transparentToolbar() { return mPreferences.getBoolean(TRANSPARENT_TOOLBAR, false); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/HeightAndWidthFitSquarePlaceLeftRightImageView.java b/app/src/main/java/com/kabouzeid/gramophone/views/HeightAndWidthFitSquarePlaceLeftRightImageView.java new file mode 100644 index 00000000..a2c7157d --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/views/HeightAndWidthFitSquarePlaceLeftRightImageView.java @@ -0,0 +1,30 @@ +package com.kabouzeid.gramophone.views; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.ImageView; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class HeightAndWidthFitSquarePlaceLeftRightImageView extends ImageView { + + public HeightAndWidthFitSquarePlaceLeftRightImageView(Context context) { + super(context); + } + + public HeightAndWidthFitSquarePlaceLeftRightImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public HeightAndWidthFitSquarePlaceLeftRightImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int small = Math.min(widthMeasureSpec, heightMeasureSpec); + super.onMeasure(small, small); + } + +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/SquareFitImageView.java b/app/src/main/java/com/kabouzeid/gramophone/views/HeightFitSquareImageView.java similarity index 54% rename from app/src/main/java/com/kabouzeid/gramophone/views/SquareFitImageView.java rename to app/src/main/java/com/kabouzeid/gramophone/views/HeightFitSquareImageView.java index 04d6b7ad..0ded0ba1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/views/SquareFitImageView.java +++ b/app/src/main/java/com/kabouzeid/gramophone/views/HeightFitSquareImageView.java @@ -7,25 +7,24 @@ import android.widget.ImageView; /** * @author Karim Abou Zeid (kabouzeid) */ -public class SquareFitImageView extends ImageView { +public class HeightFitSquareImageView extends ImageView { - public SquareFitImageView(Context context) { + public HeightFitSquareImageView(Context context) { super(context); } - public SquareFitImageView(Context context, AttributeSet attrs) { + public HeightFitSquareImageView(Context context, AttributeSet attrs) { super(context, attrs); } - public SquareFitImageView(Context context, AttributeSet attrs, int defStyle) { + public HeightFitSquareImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int newWidth = Math.min(widthMeasureSpec, heightMeasureSpec); //noinspection SuspiciousNameCombination - super.onMeasure(newWidth, newWidth); + super.onMeasure(heightMeasureSpec, heightMeasureSpec); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/SquareIfPlaceLeftRightImageView.java b/app/src/main/java/com/kabouzeid/gramophone/views/SquareIfPlaceLeftRightImageView.java new file mode 100644 index 00000000..85274213 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/views/SquareIfPlaceLeftRightImageView.java @@ -0,0 +1,35 @@ +package com.kabouzeid.gramophone.views; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public class SquareIfPlaceLeftRightImageView extends ImageView { + + public SquareIfPlaceLeftRightImageView(Context context) { + super(context); + } + + public SquareIfPlaceLeftRightImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SquareIfPlaceLeftRightImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int small = Math.min(widthMeasureSpec, heightMeasureSpec); + final int large = Math.max(widthMeasureSpec, heightMeasureSpec); + + if (View.MeasureSpec.getSize(large) > View.MeasureSpec.getSize(small) * 1.5) + super.onMeasure(small, small); + else super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/SquareImageView.java b/app/src/main/java/com/kabouzeid/gramophone/views/WidthFitSquareImageView.java similarity index 65% rename from app/src/main/java/com/kabouzeid/gramophone/views/SquareImageView.java rename to app/src/main/java/com/kabouzeid/gramophone/views/WidthFitSquareImageView.java index 816cb3ef..3200fe24 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/views/SquareImageView.java +++ b/app/src/main/java/com/kabouzeid/gramophone/views/WidthFitSquareImageView.java @@ -7,17 +7,17 @@ import android.widget.ImageView; /** * @author Karim Abou Zeid (kabouzeid) */ -public class SquareImageView extends ImageView { +public class WidthFitSquareImageView extends ImageView { - public SquareImageView(Context context) { + public WidthFitSquareImageView(Context context) { super(context); } - public SquareImageView(Context context, AttributeSet attrs) { + public WidthFitSquareImageView(Context context, AttributeSet attrs) { super(context, attrs); } - public SquareImageView(Context context, AttributeSet attrs, int defStyle) { + public WidthFitSquareImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } diff --git a/app/src/main/res/drawable-hdpi/ic_repeat_grey600_48dp.png b/app/src/main/res/drawable-hdpi/ic_repeat_grey600_48dp.png deleted file mode 100644 index 6a8906126d1729afedf0e360bb56888e8d3bc6a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84i*LmhW}5h&oD4BC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?B%_VnX4LOA5t*5*!^IlpQ@UKAJeNkJE0?uyN)mB&(KQO31(hkz5GRkoQ&j!$;wPsg(?p3Wf(80 ztIKS8!qU9Y^1+`!@+OluGn-5+W|?qj8mC;=zgxFVdQ&MBb@09}5S A=l}o! diff --git a/app/src/main/res/drawable-hdpi/ic_shuffle_grey600_48dp.png b/app/src/main/res/drawable-hdpi/ic_shuffle_grey600_48dp.png deleted file mode 100644 index a079e10d8e2285890ff9f8099bd35aa41bb16a7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84i*LmhW}5h&oD4BC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?+GIbgwg3&ED>ubg=1g!-R~>%j_Gf zrWEz8JF{p}?jsYww0VKzVcRDD)%;Wu_lD(UsjVlAYXBGth?^YL4mx;1`AtH!ykJI? zt52g!^$%%&C4zGBv3J*=FYQC4nERqtGAJDbZ*~n#50`JZxI~z<6Obbud%e*+* zg?%-ezU9k=7(dS7l@_VRzJXWN zBDPMLWqH-t;qKerlZ$HN9?Y4{@o};A%DKf#fuAOLSA8p*l~vRttG!?**UEpbMLAY^ zg3578HWR%J+hr2@m;6c*=`#tIwy~OHx=`@4lU?s&##9?VW|yZg98>zlo)mG(y0f3! zkW_54KtaY*L%^NuQ*m2`mWLRb2WXO>hyS>f>4^6ZlL#(hjF z8&>e%`6_TlRgh2miHy7_%ca6wo=g)C#+5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~228OMkE{-7)hu>bk&DCPS)AI1k!tYVFMWup;6SuvSH`jR%`!n;A+0y1`E3(5x*VQ_lI=8dn-}=|vCd>2sOf(2l+$VF5 Rn}LCW!PC{xWt~$(69Cw>ZA}0G diff --git a/app/src/main/res/drawable-mdpi/ic_shuffle_grey600_48dp.png b/app/src/main/res/drawable-mdpi/ic_shuffle_grey600_48dp.png deleted file mode 100644 index 4da2fee08bd94db1da6b8e36d30bd9e160490619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 418 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZsB3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~221Y4Q7srr@!*8$qay12rv_0f@dbh|iTT6CFU;eyplP6{PIyt>Qv8C}T zf85^Z);AS|mVdLGSaI&`ftv3|+#4A7b5?i=a@p;1Pu)4Ep`BYxBlyYlN$*gr-D$8QZKkxqey;12r!>TEW@jC3PM$J6a!~``$SzdS>AB z-K>Xd9T`5=_)a)3rk6kKejJa?%9=%%f94(i8BzSh^h1Hr)2YY5Kh?j&^hf>!OK(rZ V3n!y!69xtb22WQ%mvv4FO#nV7sd)eZ diff --git a/app/src/main/res/drawable-xhdpi/ic_repeat_grey600_48dp.png b/app/src/main/res/drawable-xhdpi/ic_repeat_grey600_48dp.png deleted file mode 100644 index bf33f287bc3e96a24d287d01eaaa97656c0c3b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 481 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4i*Lm29JsRH#0CWC?tCX`7$t6sWC7#v@kII zVqjosc)`F>YQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?4%p!lGVn#Ca ztp3X}3<(PpnH02D`5B^KMKVOJJ;cb+t;@y`rTd8SL6JCb!}Zr04o?jaFi0u9Fg(D( z%wv!s;PBKnvw?9g!_?RAA_wN2`;f-RvE#V^t_Js-$OFdvG#-e?3w@A_7x*9<&$ppZ zpY2DVKI@GxeU=-2`piE>=WkfKh2cy0eU=Nxb<7U;f3Wd<;Ntxt$p1k)H7;fAIfKP4 z0tY0YEnqli!OQkQT*`uBZ;%kfjivLL9Ik1pFs!?=h%w-*l3;^o`APYQVtoDuIE)Y6b&?c)^@qfi?^b3`|Mh?k)`f+xyS#XJBC9EbxddW?hGT^vIyZoR!_SajJzr2V75Xyyj~0|!_w8YVFxnHe%inLVM6$+}D< zqquL5g4cARNnP3oUv@P29jXu!JQ-+O3@UEC? z`}54?3A`&-%oJ1MSl76T<)l`M_lg~lTff>RxUblenzVmnq~N!w+>Bx^e}4uw%$hJs zpG|}F?$7-eTUb|c-2G{9`LM@3x}oX9{QnGRqFI<7^b*VM4m3^GRcPN}zu(t@sYi9m zQ|6crTUdJ(mpnITadxnOsB3Svuhzv@p}u-{I@b%eHUIwo*!ffX(50$1pY$DPzBduC z@+mkM&bw_J%lDeQDeD$JJ7phl8C9biRoTTTF~R`^5`Fxe(dyVb_hkZf@I{!`Y&lg`{U4Pay{a^aInIFIYWN3R<&u~qu ziOE1sUQ|)uz^wlIb{R&?pPDR>+kYkg%>QxCvgM_^M1N@8)9>de{+f16l$(b=`uLSS zGE?k(Hk>qP?m6wR9%FQ0EQ;aS^Y=<7{J(tnaVqH7+dmYRmlt2f`19v(&i7G2iyGAS z&;RiIWc|0G2EG0B8)O&g*Z-0A<#J@Z@O-(T3&ZR`B26p_)AuV%?9WS{o&WDp@XZ>= z2W^*|eli_snYB3S=cMcfz8}ttuXW-*XdS7m!CiWE42BMJ2<8h ek$&;G{H4UGfcrl~y%-o67(8A5T-G@yGywql>Mv0M diff --git a/app/src/main/res/drawable-xxhdpi/ic_repeat_grey600_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_repeat_grey600_48dp.png deleted file mode 100644 index f0935d0654ce0845512af27b4c0651751b95efd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H94rhB48Hza#taM$3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~21||tl7srr_TW{~YEp2w-aS1HA6Z+~@{+d&h&duRElNioim^P2=!*ScD zSWoWP*PY%Rz4WJI^S7kn^ojRvJ$#;2Or9oG zxh}~`>3V9M+mqe=LV}k0BC0O;tTP!WR81$>3hU-aqrjG^YtDkH_Fev_RMGS>@->~#q6>&dH!LSoy8lQU3mBys{~!y zI4go0yFz`AOy&qlwto3r(?03%V*CFgpO>Tt^oD;nuVBdf@Pt9s_GNH|QA5|x8<{r$ z9FFGv3z5rT@Tlg(OPhTTMtP`C&5s$4 zJe5-%rrB621j~s|(CueCF~glP3>VyA<^YmdzE~g!`|;2L2HB5Hn!&&zUNC1@pbY~915=W>y9>kr_Wm>b85kHi3p^r=85p>Q zL70(Y)*J~22IiTbE{-7;x8C0M&J%VNXn1Jf#N80F@WG9~Bc>bpnbue`a4U4qW!d3+ z&ZwB>h>+6+rj*tjhbFnEsQMk7H?yqVcG0S}dkbneEnA)KbvJr_XM}h(qlg0%62!qV zc-As~PWRt?mYaQzr?E%{8$Re+sjTFrmjjgp;gT}g1Mh(vR~86w060D z+4X=R=zzE|eE%Xm!IXmw}w=+@|UXZ2{-nCi~yF>A%#=jQ!6 zjGjWa3$q?trk*OcyTvp~>D95%!WEZ2mT;&zUYX1OKvzD8ajM#@Mjs+d1=G&TjnOyDc>!U=Zz)`E|}vo`!j<~K?b*mc%YnIgJf~E z!&{fFYeSNOX4RV+yp$rsxB zaH901J$_F*+>1_?IzH)gFXO3jI9eNTbE)_e^Sj)b?={Iv$CGm>?AiNG?Ab=vlnKX$ zCV0wOJGfP@VVL=JBV)>p<4hAWcBLoha|YAS2N#)(4lQPV(&o;7 zLa?80g0@_xLb}Z--pyw#=Y5(kUoNb{?|;-@t;l7P?{6EM{zhX>=}(OJ5XU7PIC-Aj_nOFa5r( zn&{5!(YIXsqP*O?QxVJ_)0RsMmNnd}^xEPP+2R^;9Zb*5d|vUt zdCg}H`{tC&wA%ZVPOVK+Ud5)wZ0w}CP)PO&@?~JCQe$9fXklRZ z#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7?_g0-CY>|xA&jf&%nUIS>O>_%)r1c z48n{Iv*t*ERCu~LhE&{odpFSUkOPD3#g&`1uOBr}P2FYuXW9gT%U0r-KbtMs*?!RM z%7!`ZQ>!O4FfcHK9A&`3zyoJ~-hS?H;d}W>|L;7HI5u54;GNND5rz&YZ~Meqb|7uEDmvl<8k&9YY~9`nUgw&4ZiM z#QCdc&%Dp+5&xIr(;tRM6rp6D-SzW7Y<`|4cFYg%;g8?`|7W=V6Cr>U80)u9W+|Wj zCuXwn16_^=Mur3ih8v6wVJE#CN@G;sGd%HUqzK*La{0?2^NZiD8RPzHHvB2bZu^zb(DX-(!?8}jL1DkJn?O9P;t73c!JK>F&NCm=&p%VM|G+u(BtOSG^&SN_ zhY8FICm02uFmMzxuvjuQ$uKzbH7KwX6qd_-cRgZl)BSwQ?1CBF6;KieLjwx~gG9sO bchX&3T2bP0l+XkKDMt?Q diff --git a/app/src/main/res/drawable-xxxhdpi/ic_shuffle_grey600_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_shuffle_grey600_48dp.png deleted file mode 100755 index a5ab732defbfd36290fde0391c7e0e5790becf07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1428 zcmeAS@N?(olHy`uVBq!ia0y~yU^oE694rhB3_q?e>0w}CP)PO&@?~JCQe$9fXklRZ z#lXPO@PdJ%)PRBERRRNp)eHs(@q#(K0&N%=7?_g0-CY>|xA&jf&%nUIS>O>_%)r1c z48n{Iv*t)JFtGA?x;TbZ+_WVWQl3eI>pF2J5uMH zs-lAOBY}j@q~muQl$PvZ@%CC^bm-cxS?^|k-*ta_RN2k{@jJJiDf!;#{lUc2nkRvQ zxq>Hwp`VfGfnfuq4Vyv3aR#;z5(gOMm?aJ*kf^IX5Nfi0or-ycp7hGWmq&uw5zDEhaD zlY?Q|^Yb$o6gJ%a^xXS`g@d?zdRxPC>nKg6d8P+{)G;PtT-P%msb;DS<$WF zTgR}YarZ5TQh_C>`5DX$-K7;w9dG?%DB#|{mC=dw+~c2T`tNpzcYfyQXkm2Xkb5W< zS;r9J>@J-U#&qrv!v#lo=>##Rdw&Gm61Pt|$rAZI{pPwf8^>oqE5C6|`A(>$M{$KN&X&ez-TsI@hcqr|-|h z`;j~ju|H38>=4gba?=0ntx%7m6kH`9le^gk`>R)-6xN_m2+NRV$ z>puMM*1wWxRUg{KcWsOLYme#mtmo6}-nh%m?_N;*!HeLLg$}sC} z{M-k6c|F=I7%tTOD`?to@wGpprjC=L@6TsppHun_8#?5^1wP?duV}s;F?Ys%xd!ce zi-Y`c=7mj=Y|yW_U@T#@_`_oM71U>A1oIridfiZ>FA#pWDFUU|b){B*k#|Pi@os8%uc>%&q@oxzdT@)z9|x z9#fe#EbSQ^s{Xw_e)$yRmx3h^{;)9ozHoR^#=rmlOGWGWX7nnY|D&?LX_@ecr}A?+ z<}fmBXnDudRP$MQudtl|f$8<14W6xGXi)ufK}*N}=JJJyS!#Y>U!|v$%67wVLVevK z?IdQVeScFVdQ&MBb@030`PWB>pF diff --git a/app/src/main/res/layout-land/activity_music_controller.xml b/app/src/main/res/layout-land/activity_music_controller.xml deleted file mode 100644 index 13c9856c..00000000 --- a/app/src/main/res/layout-land/activity_music_controller.xml +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_album_detail.xml b/app/src/main/res/layout/activity_album_detail.xml index 23d80189..00c73947 100644 --- a/app/src/main/res/layout/activity_album_detail.xml +++ b/app/src/main/res/layout/activity_album_detail.xml @@ -7,7 +7,13 @@ android:layout_width="match_parent" android:layout_height="@dimen/header_image_height"> - + + - - + android:layout_height="@dimen/header_image_height"> + + + + + + android:layout_height="match_parent" /> + + + android:id="@+id/toolbar" + style="@style/Toolbar" + android:elevation="0dp"> - - - + - + android:clickable="true"> - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_music_controller.xml b/app/src/main/res/layout/activity_music_controller.xml index 2619b141..54dce313 100644 --- a/app/src/main/res/layout/activity_music_controller.xml +++ b/app/src/main/res/layout/activity_music_controller.xml @@ -1,207 +1,218 @@ - + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="com.kabouzeid.gramophone.ui.activities.MusicControllerActivity"> - + - - - - - - - - - - - + android:paddingTop="@dimen/status_bar_padding"> - + + - - - + - - - - - - - - + android:orientation="vertical"> - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_playlist_detail.xml b/app/src/main/res/layout/activity_playlist_detail.xml index 0efe000d..f3567c17 100644 --- a/app/src/main/res/layout/activity_playlist_detail.xml +++ b/app/src/main/res/layout/activity_playlist_detail.xml @@ -7,7 +7,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:paddingTop="@dimen/main_toolbar_padding_top"> + android:paddingTop="@dimen/status_bar_padding"> - - - - - - - 25dp + 25dp 165dp - @dimen/statusMargin \ No newline at end of file diff --git a/app/src/main/res/values-v21/dimens.xml b/app/src/main/res/values-v21/dimens.xml index 19b20c61..fdbf616b 100644 --- a/app/src/main/res/values-v21/dimens.xml +++ b/app/src/main/res/values-v21/dimens.xml @@ -1,6 +1,5 @@ - 25dp + 25dp 165dp - 0dp \ No newline at end of file diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 31649ba0..4d673077 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -29,6 +29,7 @@ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d1d1544d..302c28d3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -15,7 +15,7 @@ @color/grey_300 #fff #0C000000 - @color/grey_300 + @color/grey_500 #8A000000 #D0D0D0 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index b0467346..08a3f990 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -12,9 +12,9 @@ 2dp 360dp + 32dp - 0dp - 0dp + 0dp 64.0dip diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 56e647d3..180b60c9 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -41,6 +41,7 @@