Add hint and transition effects.
Also put the background on the window instead of the activity view so that it fades smoothly
and doesn't cause a bright patch behind the keyboard transitions.
Change the close button between two states, depending on whether the query is empty or not.
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index ea20cb5..a369af7 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -43,7 +43,6 @@
<activity android:name=".SearchActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
- android:windowSoftInputMode="stateAlwaysVisible|adjustResize"
android:theme="@style/Theme.QuickSearchBox.Search">
<!-- Show app icon in Launcher. -->
<intent-filter>
@@ -72,7 +71,7 @@
<data android:scheme="qsb.corpus" />
</intent-filter>
<meta-data android:name="android.app.search.shortcut.provider" android:value="content://com.android.quicksearchbox.shortcuts/shortcuts" />
- <meta-data android:name="com.android.launcher.toolbar_icon" android:resource="@drawable/toolbar_icon" />
+ <meta-data android:name="com.android.launcher.toolbar_icon" android:resource="@drawable/ic_google_logo_normal" />
</activity>
<provider android:name=".ShortcutsProvider"
diff --git a/res/drawable-hdpi/ic_google_hint.9.png b/res/drawable-hdpi/ic_google_hint.9.png
new file mode 100644
index 0000000..01fd644
--- /dev/null
+++ b/res/drawable-hdpi/ic_google_hint.9.png
Binary files differ
diff --git a/res/drawable-hdpi/ic_google_hint.png b/res/drawable-hdpi/ic_google_hint.png
deleted file mode 100644
index 6203098..0000000
--- a/res/drawable-hdpi/ic_google_hint.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_google_logo_normal.png b/res/drawable-hdpi/ic_google_logo_normal.png
index 802dcdc..ea6369d 100644
--- a/res/drawable-hdpi/ic_google_logo_normal.png
+++ b/res/drawable-hdpi/ic_google_logo_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_google_hint.9.png b/res/drawable-mdpi/ic_google_hint.9.png
new file mode 100644
index 0000000..01fd644
--- /dev/null
+++ b/res/drawable-mdpi/ic_google_hint.9.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_google_hint.png b/res/drawable-mdpi/ic_google_hint.png
deleted file mode 100644
index ed10762..0000000
--- a/res/drawable-mdpi/ic_google_hint.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_google_logo_normal.png b/res/drawable-mdpi/ic_google_logo_normal.png
index df0323d..ba6c73e 100644
--- a/res/drawable-mdpi/ic_google_logo_normal.png
+++ b/res/drawable-mdpi/ic_google_logo_normal.png
Binary files differ
diff --git a/res/drawable-mdpi/textfield_end.9.png b/res/drawable-mdpi/textfield_end.9.png
index df02de3..94706b4 100644
--- a/res/drawable-mdpi/textfield_end.9.png
+++ b/res/drawable-mdpi/textfield_end.9.png
Binary files differ
diff --git a/res/drawable-mdpi/textfield_start.9.png b/res/drawable-mdpi/textfield_start.9.png
index d0442f3..8cddc34 100644
--- a/res/drawable-mdpi/textfield_start.9.png
+++ b/res/drawable-mdpi/textfield_start.9.png
Binary files differ
diff --git a/res/layout-xlarge/search_activity.xml b/res/layout-xlarge/search_activity.xml
index 0840160..9f46bf8 100644
--- a/res/layout-xlarge/search_activity.xml
+++ b/res/layout-xlarge/search_activity.xml
@@ -19,7 +19,6 @@
android:id="@+id/search_activity_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@drawable/activity_background"
>
<LinearLayout
@@ -73,7 +72,7 @@
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
- android:gravity="top"
+ android:gravity="top|left"
android:orientation="horizontal"
android:clickable="true"
>
@@ -103,15 +102,13 @@
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1.0"
- android:paddingLeft="12dip"
- android:paddingRight="8dip"
- android:paddingTop="6dip"
- android:paddingBottom="6dip"
- android:gravity="bottom|left"
+ android:layout_marginLeft="12dip"
+ android:layout_marginRight="8dip"
+ android:gravity="center_vertical|left"
android:singleLine="true"
android:ellipsize="end"
android:inputType="text|textAutoComplete"
- android:background="@null"
+ android:background="@drawable/ic_google_hint"
android:textSize="18sp"
android:textStyle="normal"
android:textColor="@android:color/primary_text_dark"
@@ -128,7 +125,7 @@
android:paddingRight="12dp"
android:layout_gravity="center"
android:background="@drawable/button_bg"
- android:src="@drawable/ic_clear"
+ android:src="@drawable/ic_clear_off"
/>
</LinearLayout>
diff --git a/res/values-xlarge/themes.xml b/res/values-xlarge/themes.xml
index 3b46e31..ceec7ef 100644
--- a/res/values-xlarge/themes.xml
+++ b/res/values-xlarge/themes.xml
@@ -25,7 +25,7 @@
<!-- Get rid of status bar shadow. -->
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowShowWallpaper">true</item>
- <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowBackground">@drawable/activity_background</item>
<item name="android:windowSoftInputMode">stateUnchanged|adjustResize</item>
</style>
diff --git a/src/com/android/quicksearchbox/ui/SearchActivityView.java b/src/com/android/quicksearchbox/ui/SearchActivityView.java
index bfce136..23add28 100644
--- a/src/com/android/quicksearchbox/ui/SearchActivityView.java
+++ b/src/com/android/quicksearchbox/ui/SearchActivityView.java
@@ -328,7 +328,7 @@
updateVoiceSearchButton(queryEmpty);
}
- private void updateQueryTextView(boolean queryEmpty) {
+ protected void updateQueryTextView(boolean queryEmpty) {
if (queryEmpty) {
if (isSearchCorpusWeb()) {
mQueryTextView.setBackgroundDrawable(mQueryTextEmptyBg);
diff --git a/src/com/android/quicksearchbox/ui/SearchActivityViewTwoPane.java b/src/com/android/quicksearchbox/ui/SearchActivityViewTwoPane.java
index 446b233..d0a3704 100644
--- a/src/com/android/quicksearchbox/ui/SearchActivityViewTwoPane.java
+++ b/src/com/android/quicksearchbox/ui/SearchActivityViewTwoPane.java
@@ -21,16 +21,18 @@
import com.android.quicksearchbox.R;
import com.android.quicksearchbox.Suggestions;
+import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.content.Context;
import android.database.DataSetObserver;
-import android.graphics.drawable.Drawable;
+import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Menu;
import android.view.View;
+import android.view.ViewGroup;
import android.widget.ExpandableListAdapter;
import android.widget.ImageView;
import android.widget.PopupMenu;
@@ -40,8 +42,9 @@
*/
public class SearchActivityViewTwoPane extends SearchActivityView {
- private static final int TINT_ANIMATION_DURATION = 300; // in millis
- private static final int TINT_ANIMATION_START_DELAY = 400; // in millis
+ private static final int ENTRY_ANIMATION_START_DELAY = 50; // in millis
+ private static final int ENTRY_ANIMATION_DURATION = 150; // in millis
+ private static final float ANIMATION_STARTING_WIDTH_FACTOR = 0.6f;
private ImageView mMenuButton;
@@ -49,6 +52,8 @@
private ClusteredSuggestionsView mResultsView;
private SuggestionsAdapter<ExpandableListAdapter> mResultsAdapter;
private View mResultsHeader;
+ private View mSearchPlate;
+ private boolean mJustCreated;
public SearchActivityViewTwoPane(Context context) {
super(context);
@@ -83,6 +88,8 @@
});
mResultsView.setOnKeyListener(new SuggestionsViewKeyListener());
mResultsHeader = findViewById(R.id.shortcut_title);
+ mSearchPlate = findViewById(R.id.left_pane);
+ mJustCreated = true;
}
private void showPopupMenu() {
@@ -101,24 +108,36 @@
@Override
public void onResume() {
- setupWallpaperTint();
+ if (mJustCreated) {
+ setupEntryAnimations();
+ mJustCreated = false;
+ }
}
- private void setupWallpaperTint() {
- // Alpha fade-in the background tint when the activity resumes.
- final Drawable drawable = getBackground();
- drawable.setAlpha(0);
- ValueAnimator animator = ObjectAnimator.ofInt(drawable, "alpha", 0, 255);
- animator.setDuration(TINT_ANIMATION_DURATION);
- animator.addUpdateListener(new AnimatorUpdateListener() {
+ private void setupEntryAnimations() {
+ // TODO: Use the left/top of the source bounds to start the animation from
+ final int endingWidth = getResources().getDimensionPixelSize(R.dimen.suggestions_width);
+ final int startingWidth = (int) (endingWidth * ANIMATION_STARTING_WIDTH_FACTOR);
+
+ ViewGroup.LayoutParams params = mSearchPlate.getLayoutParams();
+ params.width = startingWidth;
+ mSearchPlate.setLayoutParams(params);
+
+ Animator animator = ObjectAnimator.ofInt(mSearchPlate, "alpha", 0, 255);
+ animator.setDuration(ENTRY_ANIMATION_DURATION);
+ ((ValueAnimator)animator).addUpdateListener(new AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animator) {
- drawable.invalidateSelf();
+ ViewGroup.LayoutParams params = mSearchPlate.getLayoutParams();
+ params.width = startingWidth
+ + (int) ((Integer) animator.getAnimatedValue() / 255f
+ * (endingWidth - startingWidth));
+ mSearchPlate.setLayoutParams(params);
}
});
- animator.setStartDelay(TINT_ANIMATION_START_DELAY);
- animator.setInterpolator(new android.view.animation.LinearInterpolator());
+ animator.setStartDelay(ENTRY_ANIMATION_START_DELAY);
animator.start();
+
}
@Override
@@ -218,6 +237,18 @@
checkHideResultsHeader();
}
+ @Override
+ protected void updateQueryTextView(boolean queryEmpty) {
+ super.updateQueryTextView(queryEmpty);
+ if (mSearchCloseButton == null) return;
+
+ if (queryEmpty) {
+ mSearchCloseButton.setImageResource(R.drawable.ic_clear_off);
+ } else {
+ mSearchCloseButton.setImageResource(R.drawable.ic_clear);
+ }
+ }
+
private void checkHideResultsHeader() {
if (mResultsHeader != null) {
if (!mResultsAdapter.isEmpty()) {