diff options
Diffstat (limited to 'src/com/android/launcher2/Search.java')
-rw-r--r-- | src/com/android/launcher2/Search.java | 380 |
1 files changed, 0 insertions, 380 deletions
diff --git a/src/com/android/launcher2/Search.java b/src/com/android/launcher2/Search.java deleted file mode 100644 index 283042d19..000000000 --- a/src/com/android/launcher2/Search.java +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.launcher2; - -import android.app.Activity; -import android.content.ActivityNotFoundException; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.content.res.Configuration; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.util.AttributeSet; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnKeyListener; -import android.view.View.OnLongClickListener; -import android.view.animation.AccelerateDecelerateInterpolator; -import android.view.animation.Animation; -import android.view.animation.Interpolator; -import android.view.animation.Transformation; -import android.view.inputmethod.InputMethodManager; -import android.widget.ImageButton; -import android.widget.LinearLayout; -import android.widget.TextView; - -public class Search extends LinearLayout - implements OnClickListener, OnKeyListener, OnLongClickListener { - - // Speed at which the widget slides up/down, in pixels/ms. - private static final float ANIMATION_VELOCITY = 1.0f; - - /** The distance in dips between the optical top of the widget and the top if its bounds */ - private static final float WIDGET_TOP_OFFSET = 9; - - - private final String TAG = "Launcher.SearchWidget"; - - private Launcher mLauncher; - - private TextView mSearchText; - private ImageButton mVoiceButton; - - /** The animation that morphs the search widget to the search dialog. */ - private Animation mMorphAnimation; - - /** The animation that morphs the search widget back to its normal position. */ - private Animation mUnmorphAnimation; - - // These four are passed to Launcher.startSearch() when the search widget - // has finished morphing. They are instance variables to make it possible to update - // them while the widget is morphing. - private String mInitialQuery; - private boolean mSelectInitialQuery; - private Bundle mAppSearchData; - private boolean mGlobalSearch; - - // For voice searching - private Intent mVoiceSearchIntent; - - private int mWidgetTopOffset; - - /** - * Used to inflate the Workspace from XML. - * - * @param context The application's context. - * @param attrs The attributes set containing the Workspace's customization values. - */ - public Search(Context context, AttributeSet attrs) { - super(context, attrs); - - final float scale = context.getResources().getDisplayMetrics().density; - mWidgetTopOffset = Math.round(WIDGET_TOP_OFFSET * scale); - - Interpolator interpolator = new AccelerateDecelerateInterpolator(); - - mMorphAnimation = new ToParentOriginAnimation(); - // no need to apply transformation before the animation starts, - // since the gadget is already in its normal place. - mMorphAnimation.setFillBefore(false); - // stay in the top position after the animation finishes - mMorphAnimation.setFillAfter(true); - mMorphAnimation.setInterpolator(interpolator); - mMorphAnimation.setAnimationListener(new Animation.AnimationListener() { - // The amount of time before the animation ends to show the search dialog. - private static final long TIME_BEFORE_ANIMATION_END = 80; - - // The runnable which we'll pass to our handler to show the search dialog. - private final Runnable mShowSearchDialogRunnable = new Runnable() { - public void run() { - showSearchDialog(); - } - }; - - public void onAnimationEnd(Animation animation) { } - public void onAnimationRepeat(Animation animation) { } - public void onAnimationStart(Animation animation) { - // Make the search dialog show up ideally *just* as the animation reaches - // the top, to aid the illusion that the widget becomes the search dialog. - // Otherwise, there is a short delay when the widget reaches the top before - // the search dialog shows. We do this roughly 80ms before the animation ends. - getHandler().postDelayed( - mShowSearchDialogRunnable, - Math.max(mMorphAnimation.getDuration() - TIME_BEFORE_ANIMATION_END, 0)); - } - }); - - mUnmorphAnimation = new FromParentOriginAnimation(); - // stay in the top position until the animation starts - mUnmorphAnimation.setFillBefore(true); - // no need to apply transformation after the animation finishes, - // since the gadget is now back in its normal place. - mUnmorphAnimation.setFillAfter(false); - mUnmorphAnimation.setInterpolator(interpolator); - mUnmorphAnimation.setAnimationListener(new Animation.AnimationListener(){ - public void onAnimationEnd(Animation animation) { - clearAnimation(); - } - public void onAnimationRepeat(Animation animation) { } - public void onAnimationStart(Animation animation) { } - }); - - mVoiceSearchIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH); - mVoiceSearchIntent.putExtra(android.speech.RecognizerIntent.EXTRA_LANGUAGE_MODEL, - android.speech.RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); - } - - /** - * Implements OnClickListener. - */ - public void onClick(View v) { - if (v == mVoiceButton) { - startVoiceSearch(); - } else { - mLauncher.onSearchRequested(); - } - } - - private void startVoiceSearch() { - try { - getContext().startActivity(mVoiceSearchIntent); - } catch (ActivityNotFoundException ex) { - // Should not happen, since we check the availability of - // voice search before showing the button. But just in case... - Log.w(TAG, "Could not find voice search activity"); - } - } - - /** - * Sets the query text. The query field is not editable, instead we forward - * the key events to the launcher, which keeps track of the text, - * calls setQuery() to show it, and gives it to the search dialog. - */ - public void setQuery(String query) { - mSearchText.setText(query, TextView.BufferType.NORMAL); - } - - /** - * Morph the search gadget to the search dialog. - * See {@link Activity#startSearch()} for the arguments. - */ - public void startSearch(String initialQuery, boolean selectInitialQuery, - Bundle appSearchData, boolean globalSearch) { - mInitialQuery = initialQuery; - mSelectInitialQuery = selectInitialQuery; - mAppSearchData = appSearchData; - mGlobalSearch = globalSearch; - - if (isAtTop()) { - showSearchDialog(); - } else { - // Call up the keyboard before we actually call the search dialog so that it - // (hopefully) animates in at about the same time as the widget animation, and - // so that it becomes available as soon as possible. Only do this if a hard - // keyboard is not currently available. - if (getContext().getResources().getConfiguration().hardKeyboardHidden == - Configuration.HARDKEYBOARDHIDDEN_YES) { - InputMethodManager inputManager = (InputMethodManager) - getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - inputManager.showSoftInputUnchecked(0, null); - } - - // Start the animation, unless it has already started. - if (getAnimation() != mMorphAnimation) { - mMorphAnimation.setDuration(getAnimationDuration()); - startAnimation(mMorphAnimation); - } - } - } - - /** - * Shows the system search dialog immediately, without any animation. - */ - private void showSearchDialog() { - mLauncher.showSearchDialog( - mInitialQuery, mSelectInitialQuery, mAppSearchData, mGlobalSearch); - } - - /** - * Restore the search gadget to its normal position. - * - * @param animate Whether to animate the movement of the gadget. - */ - public void stopSearch(boolean animate) { - setQuery(""); - - // Only restore if we are not already restored. - if (getAnimation() == mMorphAnimation) { - if (animate && !isAtTop()) { - mUnmorphAnimation.setDuration(getAnimationDuration()); - startAnimation(mUnmorphAnimation); - } else { - clearAnimation(); - } - } - } - - private boolean isAtTop() { - return getWidgetTop() == 0; - } - - private int getAnimationDuration() { - return (int) (getWidgetTop() / ANIMATION_VELOCITY); - } - - /** - * Modify clearAnimation() to invalidate the parent. This works around - * an issue where the region where the end of the animation placed the view - * was not redrawn after clearing the animation. - */ - @Override - public void clearAnimation() { - Animation animation = getAnimation(); - if (animation != null) { - super.clearAnimation(); - if (animation.hasEnded() - && animation.getFillAfter() - && animation.willChangeBounds()) { - View parent = (View) getParent(); - if (parent != null) parent.invalidate(); - } else { - invalidate(); - } - } - } - - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (!event.isSystem() && - (keyCode != KeyEvent.KEYCODE_DPAD_UP) && - (keyCode != KeyEvent.KEYCODE_DPAD_DOWN) && - (keyCode != KeyEvent.KEYCODE_DPAD_LEFT) && - (keyCode != KeyEvent.KEYCODE_DPAD_RIGHT) && - (keyCode != KeyEvent.KEYCODE_DPAD_CENTER)) { - // Forward key events to Launcher, which will forward text - // to search dialog - switch (event.getAction()) { - case KeyEvent.ACTION_DOWN: - return mLauncher.onKeyDown(keyCode, event); - case KeyEvent.ACTION_MULTIPLE: - return mLauncher.onKeyMultiple(keyCode, event.getRepeatCount(), event); - case KeyEvent.ACTION_UP: - return mLauncher.onKeyUp(keyCode, event); - } - } - return false; - } - - /** - * Implements OnLongClickListener to pass long clicks on child views - * to the widget. This makes it possible to pick up the widget by long - * clicking on the text field or a button. - */ - public boolean onLongClick(View v) { - return performLongClick(); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - mSearchText = (TextView) findViewById(R.id.search_src_text); - mVoiceButton = (ImageButton) findViewById(R.id.search_voice_btn); - - mSearchText.setOnKeyListener(this); - - mSearchText.setOnClickListener(this); - mVoiceButton.setOnClickListener(this); - setOnClickListener(this); - - mSearchText.setOnLongClickListener(this); - mVoiceButton.setOnLongClickListener(this); - - // Set the placeholder text to be the Google logo within the search widget. - Drawable googlePlaceholder = - getContext().getResources().getDrawable(R.drawable.placeholder_google); - mSearchText.setCompoundDrawablesWithIntrinsicBounds(googlePlaceholder, null, null, null); - - configureVoiceSearchButton(); - } - - @Override - public void onDetachedFromWindow() { - super.onDetachedFromWindow(); - } - - /** - * If appropriate & available, configure voice search - * - * Note: Because the home screen search widget is always web search, we only check for - * getVoiceSearchLaunchWebSearch() modes. We don't support the alternate form of app-specific - * voice search. - */ - private void configureVoiceSearchButton() { - // Enable the voice search button if there is an activity that can handle it - PackageManager pm = getContext().getPackageManager(); - ResolveInfo ri = pm.resolveActivity(mVoiceSearchIntent, - PackageManager.MATCH_DEFAULT_ONLY); - boolean voiceSearchVisible = ri != null; - - // finally, set visible state of voice search button, as appropriate - mVoiceButton.setVisibility(voiceSearchVisible ? View.VISIBLE : View.GONE); - } - - /** - * Sets the {@link Launcher} that this gadget will call on to display the search dialog. - */ - public void setLauncher(Launcher launcher) { - mLauncher = launcher; - } - - /** - * Moves the view to the top left corner of its parent. - */ - private class ToParentOriginAnimation extends Animation { - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - float dx = -getLeft() * interpolatedTime; - float dy = -getWidgetTop() * interpolatedTime; - t.getMatrix().setTranslate(dx, dy); - } - } - - /** - * Moves the view from the top left corner of its parent. - */ - private class FromParentOriginAnimation extends Animation { - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - float dx = -getLeft() * (1.0f - interpolatedTime); - float dy = -getWidgetTop() * (1.0f - interpolatedTime); - t.getMatrix().setTranslate(dx, dy); - } - } - - /** - * The widget is centered vertically within it's 4x1 slot. This is accomplished by nesting - * the actual widget inside another view. For animation purposes, we care about the top of the - * actual widget rather than it's container. This method return the top of the actual widget. - */ - private int getWidgetTop() { - return getTop() + getChildAt(0).getTop() + mWidgetTopOffset; - } -} |