Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(936)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java

Issue 1337703002: [Contextual Search] Add support for crushed sprites and animate the search provider icon (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Changes from self-review Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java
index d08874dbf6936e08edc6cdfe4a8ecb26cbb26151..76f58a85a49efe3f64f7d403db88c2901c09b581 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanelBase.java
@@ -5,6 +5,7 @@
package org.chromium.chrome.browser.compositor.bottombar.contextualsearch;
import android.content.Context;
+import android.content.res.TypedArray;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
@@ -23,6 +24,8 @@ import org.chromium.chrome.browser.util.MathUtils;
import org.chromium.ui.base.LocalizationUtils;
import org.chromium.ui.resources.dynamics.DynamicResourceLoader;
+import java.util.ArrayList;
+
/**
* Base abstract class for the Contextual Search Panel.
*/
@@ -760,6 +763,165 @@ abstract class ContextualSearchPanelBase extends ContextualSearchPanelStateHandl
}
// --------------------------------------------------------------------------------------------
+ // Search provider icon states
+ // --------------------------------------------------------------------------------------------
+
+ private static final int SEARCH_PROVIDER_ICON_LAST_SPRITE_FRAME = 18;
+
+ private boolean mIsSearchProviderIconSpriteVisible;
+ private boolean mShouldAnimateSearchProviderIconSprite;
+ private int mSearchProviderIconSpriteFrame;
+ private int mSearchProviderIconSpritePreviousFrame;
+ private TypedArray mSearchProviderIconSpriteFrameRectsArray;
+
+ /**
+ * @return Whether the search provider icon sprite is visible.
+ */
+ public boolean isSearchProviderIconSpriteVisible() {
+ return mIsSearchProviderIconSpriteVisible;
+ }
+
+ /**
+ * @param isSearchProviderIconSpriteVisible Whether the search provider icon sprite should be
+ * visible.
+ */
+ public void setIsSearchProviderIconSpriteVisible(boolean isSearchProviderIconSpriteVisible) {
+ mIsSearchProviderIconSpriteVisible = isSearchProviderIconSpriteVisible;
+ }
+
+ /**
+ * @return Whether the search provider icon sprite should be animated.
+ */
+ public boolean shouldAnimateSearchProviderIconSprite() {
+ return mShouldAnimateSearchProviderIconSprite;
+ }
+
+ /**
+ * @param shouldAnimateSearchProviderIconSprite Whether the search provider icon sprite should
+ * be animated.
+ */
+ public void setShouldAnimateSearchProviderIconSprite(
+ boolean shouldAnimateSearchProviderIconSprite) {
+ mSearchProviderIconSpritePreviousFrame = 0;
+ if (shouldAnimateSearchProviderIconSprite) {
+ mIsSearchProviderIconSpriteVisible = false;
+ mSearchProviderIconSpriteFrame = 0;
+ } else {
+ mIsSearchProviderIconSpriteVisible = true;
+ mSearchProviderIconSpriteFrame = SEARCH_PROVIDER_ICON_LAST_SPRITE_FRAME;
+ }
+ mShouldAnimateSearchProviderIconSprite = shouldAnimateSearchProviderIconSprite;
+ }
+
+ /**
+ * @return The size of the search provider icon sprite in px.
+ */
+ public float getSearchProviderIconSpriteSize() {
+ return mContext.getResources().getDimension(R.dimen.contextual_search_sprite_size);
+ }
+
+ /**
+ * Each search provider icon sprite frame is represented by a set of rectangles. Most frames
+ * consist of small rectangles representing the change from the previous frame.
+ * Each rectangle is represented using six consecutive values that specify the values to be used
+ * when creating the destination and source rectangles that get painted:
+ * 0: destination x 1: destination y 2: source x 3: source y 4: width 5: height
+ *
+ * @return The rectangles that need to be painted for the current sprite frame.
+ */
+ public int[] getSearchProviderIconSpriteFrameRects() {
+ int[] results = null;
+
+ if (mSearchProviderIconSpriteFrame != mSearchProviderIconSpritePreviousFrame
+ || !getSearchProviderIconSpritePaintPreviousFrames()) {
+
+ // Initialize mSearchProviderIconSpriteFrameRectsArray if necessary.
+ if (mSearchProviderIconSpriteFrameRectsArray == null) {
+ mSearchProviderIconSpriteFrameRectsArray = mContext.getResources().obtainTypedArray(
+ R.array.contextual_search_sprite_frame_rects);
+ }
+
+ // Get the rectangles for the current frame.
+ int[] currentFrameRects = null;
+ int currentFrameRectsId = mSearchProviderIconSpriteFrameRectsArray.getResourceId(
+ mSearchProviderIconSpriteFrame, 0);
+ if (currentFrameRectsId != 0) {
+ currentFrameRects = mContext.getResources().getIntArray(currentFrameRectsId);
+ }
+
+ // If we skipped some frames in the animation, we need to paint the rectangles
+ // for those frames if getSearchProviderIconSpritePaintPreviousFrames() is true.
+ if (mSearchProviderIconSpriteFrame != mSearchProviderIconSpritePreviousFrame + 1
+ && getSearchProviderIconSpritePaintPreviousFrames()) {
+ ArrayList<int[]> allFrameRects = new ArrayList<int[]>();
+ int totalNumberOfRects = 0;
+
+ // For each frame that was skipped, get the frame's rectangles from
+ // mSearchProviderIconSpriteFrameRectsArray and append them to the list of
+ // allFrameRects.
+ for (int frame = mSearchProviderIconSpritePreviousFrame + 1;
+ frame < mSearchProviderIconSpriteFrame; frame++) {
+ int frameRectsId =
+ mSearchProviderIconSpriteFrameRectsArray.getResourceId(frame, 0);
+ if (frameRectsId != 0) {
+ int[] frameRects = mContext.getResources().getIntArray(frameRectsId);
+ allFrameRects.add(frameRects);
+ totalNumberOfRects += frameRects.length;
+ }
+ }
+
+ // Append the rectangles for the current frame.
+ if (currentFrameRects != null) {
+ allFrameRects.add(currentFrameRects);
+ totalNumberOfRects += currentFrameRects.length;
+ }
+
+ // Merge the rectangles for each frame into one int[].
+ results = new int[totalNumberOfRects];
+ int index = 0;
+ for (int[] frameRects : allFrameRects) {
+ System.arraycopy(frameRects, 0, results, index, frameRects.length);
+ index = frameRects.length;
+ }
+ } else {
+ results = currentFrameRects;
+ }
+ }
+
+ mSearchProviderIconSpritePreviousFrame = mSearchProviderIconSpriteFrame;
+ return (results != null) ? results : new int[] {};
+ }
+
+ /**
+ * Sets the sprite frame to display based on the completion percentage.
+ *
+ * @param percentage The completion percentage.
+ */
+ public void setSearchProviderIconAnimationCompletion(float percentage) {
+ mSearchProviderIconSpriteFrame =
+ (int) (percentage * SEARCH_PROVIDER_ICON_LAST_SPRITE_FRAME);
+ }
+
+ /**
+ * The sprite frames in the search provider icon sprite are created by painting a
+ * set of rectangles on top of the previous frames, with the exception of the first and last
+ * frame.
+ *
+ * @return Whether the previous sprite frames should be painted.
+ */
+ public boolean getSearchProviderIconSpritePaintPreviousFrames() {
+ return mSearchProviderIconSpriteFrame != 0
+ && mSearchProviderIconSpriteFrame != SEARCH_PROVIDER_ICON_LAST_SPRITE_FRAME;
+ }
+
+ /**
+ * @return The number of frames in the search provider icon sprite.
+ */
+ public int getSearchProviderIconSpriteFrameCount() {
+ return SEARCH_PROVIDER_ICON_LAST_SPRITE_FRAME + 1;
+ }
+
+ // --------------------------------------------------------------------------------------------
// Promo states
// --------------------------------------------------------------------------------------------

Powered by Google App Engine
This is Rietveld 408576698