package com.tencent.tws.assistant.widget;
import java.lang.ref.WeakReference;
import java.util.Timer;
import java.util.TimerTask;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.app.SearchManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.ContextWrapper;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.ActionMode;
import android.view.ActionMode.Callback;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.ContextThemeWrapper;
import android.view.Display;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.internal.policy.PhoneWindow;
import com.android.internal.policy.PolicyManager;
import com.tencent.tws.assistant.app.ActionBar;
import com.tencent.tws.assistant.internal.app.ActionBarImpl;
import com.tencent.tws.sharelib.R;
//tws-start add global float view::2014-09-13
public class FloatView implements FloatInterface, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener,
OnGestureListener {
private static final String TAG = "FloatView";
private Activity mOwnerActivity;
private Context mContext;
final WindowManager mWindowManager;
Window mWindow;
View mDecor;
private ActionBarImpl mActionBar;
protected boolean mCancelable = true;
private String mCancelAndDismissTaken;
private Message mCancelMessage;
private Message mDismissMessage;
private Message mShowMessage;
private OnKeyListener mOnKeyListener;
private boolean mCreated = false;
private boolean mShowing = false;
private boolean mCanceled = false;
private final Thread mUiThread;
private final Handler mHandler = new Handler();
private static final int DISMISS = 0x43;
private static final int CANCEL = 0x44;
private static final int SHOW = 0x45;
private Handler mListenersHandler;
private ActionMode mActionMode;
private boolean showFromTop;
private GestureDetector detector;
private boolean isDefaultView = true;
private View mDefaultFloatView;
private View mDefaultContent;
private ImageView mDefaultIcon;
private TextView mDefaultTitle;
private TextView mDefaultSubTitle;
private TextView mDefaultTime;
private View mCustomFloatView;
private boolean isClick = true;
private float mLastDownPositionX, mLastDownPositionY;
private float mLastUpPositionX, mLastUpPositionY;
private OnContentClickListener mOnContentClickListener = null;
private final Runnable mDismissAction = new Runnable() {
public void run() {
dismissFloatView();
}
};
private int viewWidth, viewHeight;
private int statusBarHeight;
private float xInScreen, yInScreen;
private float xDownInScreen, yDownInScreen;
private float xInView, yInView;
private int mAnimationStyle = -1;
private static final float DENSITY_H = 1.5f;
private static final float DENSITY_XH = 2f;
private static final float DENSITY_XXH = 3f;
private static final float WIDTH_H = 480f;
private static final float WIDTH_XH = 720f;
private static final float WIDTH_XXH = 1080f;
private static final int FLOATVIEW_HEIGHT = 66;
WindowManager.LayoutParams mDecorLp;
public FloatView(Context context) {
this(context, true);
}
public FloatView(Context context, boolean defaultView) {
this(context, true, defaultView);
}
public FloatView(Context context, boolean isHoloLight, boolean defaultView) {
this(context, isHoloLight, true, defaultView);
}
private WindowManager.LayoutParams getMyLayoutParams() {
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_DRAG,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);
// lp.alpha = 1.0f;
lp.dimAmount = 0.0f;
lp.gravity = Gravity.LEFT | Gravity.TOP;
lp.x = 0;
lp.y = 0;
return lp;
}
private WindowManager.LayoutParams getMyLayoutParamsForDecor() {
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
getScreenDensity() * FLOATVIEW_HEIGHT, WindowManager.LayoutParams.TYPE_DRAG,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);
lp.dimAmount = 0.0f;
lp.gravity = Gravity.LEFT | Gravity.TOP;
lp.x = 0;
lp.y = 0;
return lp;
}
FloatView(Context context, boolean isHoloLight, boolean createContextThemeWrapper, boolean defaultView) {
isDefaultView = defaultView;
int theme = isHoloLight ? R.style.FloatViewTheme_HoloLight : R.style.FloatViewTheme;
context.setTheme(theme);
mContext = createContextThemeWrapper ? new ContextThemeWrapper(context, theme) : context;
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Window w = null;
if (android.os.Build.VERSION.SDK_INT > 22) {
w = new PhoneWindow(mContext);
} else {
w = PolicyManager.makeNewWindow(mContext);
}
mWindow = w;
mWindow.requestFeature(Window.FEATURE_NO_TITLE);
mWindow.setAttributes(getMyLayoutParams());
mDecorLp = mWindow.getAttributes();
mDecorLp = getMyLayoutParamsForDecor();
makeDefaultContentView();
mUiThread = Thread.currentThread();
mListenersHandler = new ListenersHandler(this);
detector = new GestureDetector(context, this);
}
public void setFloatViewWindowBk() {
mWindow.setBackgroundDrawableResource(R.color.transparent);
}
public void setFloatViewHeight() {
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_DRAG,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT);
lp.dimAmount = 0.0f;
lp.gravity = Gravity.LEFT | Gravity.TOP;
lp.x = 0;
lp.y = 0;
mDecorLp = lp;
}
protected FloatView(Context context, boolean cancelable, OnCancelListener cancelListener) {
this(context);
mCancelable = cancelable;
setOnCancelListener(cancelListener);
}
public final Context getContext() {
return mContext;
}
public ActionBar getActionBar() {
return mActionBar;
}
public final void setOwnerActivity(Activity activity) {
mOwnerActivity = activity;
getWindow().setVolumeControlStream(mOwnerActivity.getVolumeControlStream());
}
public final Activity getOwnerActivity() {
return mOwnerActivity;
}
public boolean isShowing() {
return mShowing;
}
public void show(boolean isAutoDismiss) {
if (mShowing) {
if (mDecor != null) {
if (mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {
mWindow.invalidatePanelMenu(Window.FEATURE_ACTION_BAR);
}
mDecor.setVisibility(View.VISIBLE);
}
return;
}
mCanceled = false;
if (!mCreated) {
dispatchOnCreate(null);
}
onStart();
mDecor = mWindow.getDecorView();
if (mActionBar == null && mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {
mActionBar = new ActionBarImpl(this);
}
WindowManager.LayoutParams l = mWindow.getAttributes();
if ((l.softInputMode & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
nl.copyFrom(l);
nl.softInputMode |= WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
l = nl;
Log.d("floatview", "l.softInputMode SOFT_INPUT_IS_FORWARD_NAVIGATION ");
}
try {
if (l.y < mContext.getResources().getDisplayMetrics().heightPixels / 2)
showFromTop = true;
// l = getMyLayoutParamsForDecor();
l = mDecorLp;
l.windowAnimations = computeAnimationResource();
viewWidth = l.width;
viewHeight = l.height;
// Log.e(TAG, "viewWidth = " + viewWidth + "; viewHeight = " +
// viewHeight);
mWindowManager.addView(mDecor, l);
mShowing = true;
sendShowMessage();
} finally {
}
if (isAutoDismiss) {
dismissDelayed(5000);
}
}
@Override
public void dismiss() {
// TODO Auto-generated method stub
if (Thread.currentThread() != mUiThread) {
mHandler.removeCallbacks(mDismissAction);
mHandler.post(mDismissAction);
} else {
mHandler.removeCallbacks(mDismissAction);
mDismissAction.run();
}
}
public void dismissDelayed(long delay) {
if (Thread.currentThread() != mUiThread) {
mHandler.removeCallbacks(mDismissAction);
mHandler.postDelayed(mDismissAction, delay);
} else {
mHandler.removeCallbacks(mDismissAction);
TimerTask dismissTask = new TimerTask() {
public void run() {
dismissFloatView();
}
};
Timer timer = new Timer();
timer.schedule(dismissTask, delay);
}
}
void dismissFloatView() {
if (mDecor == null || !mShowing) {
return;
}
if (mWindow.isDestroyed()) {
return;
}
try {
mWindowManager.removeView(mDecor);
} finally {
if (mActionMode != null) {
mActionMode.finish();
}
mDecor = null;
mWindow.closeAllPanels();
onStop();
mShowing = false;
sendDismissMessage();
}
}
public void hide() {
if (mDecor != null) {
mDecor.setVisibility(View.GONE);
}
}
private void sendDismissMessage() {
if (mDismissMessage != null) {
Message.obtain(mDismissMessage).sendToTarget();
}
}
private void sendShowMessage() {
if (mShowMessage != null) {
Message.obtain(mShowMessage).sendToTarget();
}
}
public void dispatchOnCreate(Bundle savedInstanceState) {
if (!mCreated) {
onCreate(savedInstanceState);
mCreated = true;
}
}
protected void onCreate(Bundle savedInstanceState) {
}
protected void onStart() {
if (mActionBar != null)
mActionBar.setShowHideAnimationEnabled(true);
}
protected void onStop() {
if (mActionBar != null)
mActionBar.setShowHideAnimationEnabled(false);
}
private static final String FLOATVIEW_SHOWING_TAG = "android:floatviewShowing";
private static final String FLOATVIEW_HIERARCHY_TAG = "android:floatviewHierachy";
public Bundle onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putBoolean(FLOATVIEW_SHOWING_TAG, mShowing);
if (mCreated) {
bundle.putBundle(FLOATVIEW_HIERARCHY_TAG, mWindow.saveHierarchyState());
}
return bundle;
}
public void onRestoreInstanceState(Bundle savedInstanceState) {
final Bundle floatviewHierarchyState = savedInstanceState.getBundle(FLOATVIEW_HIERARCHY_TAG);
if (floatviewHierarchyState == null) {
return;
}
dispatchOnCreate(savedInstanceState);
mWindow.restoreHierarchyState(floatviewHierarchyState);
if (savedInstanceState.getBoolean(FLOATVIEW_SHOWING_TAG)) {
show(false);
}
}
public Window getWindow() {
return mWindow;
}
public View getCurrentFocus() {
return mWindow != null ? mWindow.getCurrentFocus() : null;
}
public View findViewById(int id) {
return mWindow.findViewById(id);
}
private void makeDefaultContentView() {
if (isDefaultView) {
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
mDefaultFloatView = LayoutInflater.from(mContext).inflate(R.layout.floatview_template_base, null);
setContentView(mDefaultFloatView);
initDefaultFloatView();
}
}
private void initDefaultFloatView() {
mDefaultContent = mDefaultFloatView.findViewById(R.id.float_view_content);
mDefaultContent.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
mLastDownPositionX = event.getX();
mLastDownPositionY = event.getY();
break;
case MotionEvent.ACTION_UP:
mLastUpPositionX = event.getX();
mLastUpPositionY = event.getY();
Log.i(TAG, "mLastDownPositionX = " + mLastDownPositionX + "; mLastUpPositionX = "
+ mLastUpPositionX + "; mLastDownPositionY = " + mLastDownPositionY
+ "; mLastUpPositionY = " + mLastUpPositionY);
if (Math.abs(mLastDownPositionX - mLastUpPositionX) > 6
|| Math.abs(mLastDownPositionY - mLastUpPositionY) > 20) {
isClick = false;
}
break;
default:
break;
}
return false;
}
});
mDefaultContent.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
Log.i(TAG, "mDefaultContent mOnContentClickListener isClick = " + isClick);
if (mOnContentClickListener != null && isClick) {
Log.i(TAG, "mOnContentClickListener not null");
mOnContentClickListener.onClick(view);
}
dismiss();
}
});
mDefaultIcon = (ImageView) mDefaultFloatView.findViewById(R.id.float_view_app_icon);
mDefaultTitle = (TextView) mDefaultFloatView.findViewById(R.id.float_view_app_title);
mDefaultSubTitle = (TextView) mDefaultFloatView.findViewById(R.id.float_view_app_subtitle);
mDefaultTime = (TextView) mDefaultFloatView.findViewById(R.id.float_view_app_time);
}
public void setIcon(int resId) {
mDefaultIcon.setImageResource(resId);
};
public void setIcon(Drawable resDrawable) {
mDefaultIcon.setImageDrawable(resDrawable);
}
public void setIcon(Bitmap bitmap) {
mDefaultIcon.setImageBitmap(bitmap);
}
public void setSubTitle(int resId) {
mDefaultSubTitle.setText(resId);
}
public void setSubTitle(CharSequence text) {
mDefaultSubTitle.setText(text);
}
public void setContentView(int layoutResID) {
View view = LayoutInflater.from(mContext).inflate(layoutResID, null);
setContentView(view);
}
public void setContentView(View view) {
mCustomFloatView = view;
mWindow.setContentView(mCustomFloatView);
}
public void addContentView(View view, ViewGroup.LayoutParams params) {
mWindow.addContentView(view, params);
}
public void setTitle(CharSequence title) {
if (isDefaultView) {
mDefaultTitle.setText(title);
} else {
mWindow.setTitle(title);
mWindow.getAttributes().setTitle(title);
}
}
public void setTitle(int titleId) {
setTitle(mContext.getText(titleId));
}
public void setTime(CharSequence time) {
mDefaultTime.setText(time);
}
public void setTime(int timeId) {
mDefaultTime.setText(timeId);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
event.startTracking();
return true;
}
return false;
}
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
return false;
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking() && !event.isCanceled()) {
onBackPressed();
return true;
}
return false;
}
public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) {
return false;
}
public void onBackPressed() {
if (mCancelable) {
cancel();
}
}
public boolean onKeyShortcut(int keyCode, KeyEvent event) {
return false;
}
public boolean onTouchEvent(MotionEvent event) {
if (mCancelable && mShowing && mWindow.shouldCloseOnTouch(mContext, event)) {
cancel();
return true;
}
return detector.onTouchEvent(event);
}
private int getStatusBarHeight() {
return 0;
}
private void updateFloatViewPosition() {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.x = (int) (xInScreen - xInView);
lp.y = (int) (yInScreen - yInView);
lp.width = viewWidth;
lp.height = viewHeight;
onWindowAttributesChanged(lp);
}
public void setPosition(int x, int y) {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.x = x;
lp.y = y;
onWindowAttributesChanged(lp);
}
public int getX() {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
return lp.x;
}
public int getY() {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
return lp.y;
}
public void setSize(int width, int height) {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = width;
lp.height = height;
viewWidth = width;
viewHeight = height;
onWindowAttributesChanged(lp);
}
public int getWidth() {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
return lp.width;
}
public int getHeight() {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
return lp.height;
}
public void setAlpha(float alpha) {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.alpha = alpha;
onWindowAttributesChanged(lp);
}
public float getAlpha() {
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
return lp.alpha;
}
public boolean onTrackballEvent(MotionEvent event) {
return false;
}
public boolean onGenericMotionEvent(MotionEvent event) {
return false;
}
public void setCancelable(boolean flag) {
mCancelable = flag;
}
public void setCanceledOnTouchOutside(boolean cancel) {
if (cancel && !mCancelable) {
mCancelable = true;
}
mWindow.setCloseOnTouchOutside(cancel);
}
@Override
public void cancel() {
// TODO Auto-generated method stub
if (!mCanceled && mCancelMessage != null) {
mCanceled = true;
Message.obtain(mCancelMessage).sendToTarget();
}
dismiss();
}
public void setOnCancelListener(final OnCancelListener listener) {
if (mCancelAndDismissTaken != null) {
throw new IllegalStateException("OnCancelListener is already taken by " + mCancelAndDismissTaken
+ " and can not be replaced");
}
if (listener != null) {
mCancelMessage = mListenersHandler.obtainMessage(CANCEL, listener);
} else {
mCancelMessage = null;
}
}
public void setCancelMessage(final Message msg) {
mCancelMessage = msg;
}
public void setOnContentClickListener(final OnContentClickListener listener) {
mOnContentClickListener = listener;
}
public void setOnDismissListener(final OnDismissListener listener) {
if (mCancelAndDismissTaken != null) {
throw new IllegalStateException("OnDismissListener is already taken by " + mCancelAndDismissTaken
+ " and can not be replaced");
}
if (listener != null) {
mDismissMessage = mListenersHandler.obtainMessage(DISMISS, listener);
} else {
mDismissMessage = null;
}
}
public void setDismissMessage(final Message msg) {
mDismissMessage = msg;
}
public void setOnShowListener(final onShowListener listener) {
if (listener != null) {
mShowMessage = mListenersHandler.obtainMessage(SHOW, listener);
} else {
mShowMessage = null;
}
}
public boolean takeCancelAndDismissListeners(String msg, final OnCancelListener cancel,
final OnDismissListener dismiss) {
if (mCancelAndDismissTaken != null) {
mCancelAndDismissTaken = null;
} else if (mCancelMessage != null || mDismissMessage != null) {
return false;
}
setOnCancelListener(cancel);
setOnDismissListener(dismiss);
mCancelAndDismissTaken = msg;
return true;
}
public boolean dispatchGenericMotionEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (mWindow.superDispatchGenericMotionEvent(event)) {
return true;
}
return onGenericMotionEvent(event);
}
public boolean dispatchKeyEvent(KeyEvent event) {
// TODO Auto-generated method stubo
if ((mOnKeyListener != null) && (mOnKeyListener.onKey(this, event.getKeyCode(), event))) {
return true;
}
if (mWindow.superDispatchKeyEvent(event)) {
return true;
}
return event.dispatch(this, mDecor != null ? mDecor.getKeyDispatcherState() : null, this);
}
public boolean dispatchKeyShortcutEvent(KeyEvent event) {
// TODO Auto-generated method stub
if (mWindow.superDispatchKeyShortcutEvent(event)) {
return true;
}
return onKeyShortcut(event.getKeyCode(), event);
}
public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
// TODO Auto-generated method stub
event.setClassName(getClass().getName());
event.setPackageName(mContext.getPackageName());
LayoutParams params = getWindow().getAttributes();
boolean isFullScreen = (params.width == LayoutParams.MATCH_PARENT)
&& (params.height == LayoutParams.MATCH_PARENT);
event.setFullScreen(isFullScreen);
return false;
}
public boolean dispatchTouchEvent(MotionEvent event) {
if (mWindow.superDispatchTouchEvent(event)) {
return true;
}
return onTouchEvent(event);
}
public boolean dispatchTrackballEvent(MotionEvent event) {
if (mWindow.superDispatchTrackballEvent(event)) {
return true;
}
return onTrackballEvent(event);
}
public void onActionModeFinished(ActionMode mode) {
if (mode == mActionMode) {
mActionMode = null;
}
}
public void onActionModeStarted(ActionMode mode) {
mActionMode = mode;
}
public void onAttachedToWindow() {
// TODO Auto-generated method stub
}
public void onContentChanged() {
// TODO Auto-generated method stub
}
public boolean onCreatePanelMenu(int featureId, Menu menu) {
// TODO Auto-generated method stub
if (featureId == Window.FEATURE_OPTIONS_PANEL) {
return onCreateOptionsMenu(menu);
}
return false;
}
public View onCreatePanelView(int featureId) {
// TODO Auto-generated method stub
return null;
}
public void onDetachedFromWindow() {
// TODO Auto-generated method stub
}
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// TODO Auto-generated method stub
return false;
}
public boolean onMenuOpened(int featureId, Menu menu) {
// TODO Auto-generated method stub
return false;
}
public void onPanelClosed(int featureId, Menu menu) {
// TODO Auto-generated method stub
}
public boolean onPreparePanel(int featureId, View view, Menu menu) {
// TODO Auto-generated method stub
return false;
}
public boolean onSearchRequested() {
// TODO Auto-generated method stub
final SearchManager searchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
final ComponentName appName = getAssociatedActivity();
if (appName != null && searchManager.getSearchableInfo(appName) != null) {
searchManager.startSearch(null, false, appName, null, false);
dismiss();
return true;
} else {
return false;
}
}
private ComponentName getAssociatedActivity() {
Activity activity = mOwnerActivity;
Context context = getContext();
while (activity == null && context != null) {
if (context instanceof Activity) {
activity = (Activity) mContext;
} else {
context = (context instanceof ContextWrapper) ? ((ContextWrapper) context).getBaseContext() : null;
}
}
return activity == null ? null : activity.getComponentName();
}
public void takeKeyEvents(boolean get) {
mWindow.takeKeyEvents(get);
}
public final boolean requestWindowFeature(int featureId) {
return getWindow().requestFeature(featureId);
}
public final void setFeatureDrawableResource(int featureId, int resId) {
getWindow().setFeatureDrawableResource(featureId, resId);
}
public final void setFeatureDrawableUri(int featureId, Uri uri) {
getWindow().setFeatureDrawableUri(featureId, uri);
}
public final void setFeatureDrawable(int featureId, Drawable drawable) {
getWindow().setFeatureDrawable(featureId, drawable);
}
public final void setFeatureDrawableAlpha(int featureId, int alpha) {
getWindow().setFeatureDrawableAlpha(featureId, alpha);
}
public LayoutInflater getLayoutInflater() {
return getWindow().getLayoutInflater();
}
public void onWindowAttributesChanged(LayoutParams params) {
// TODO Auto-generated method stub
if (mDecor != null) {
mWindowManager.updateViewLayout(mDecor, params);
}
}
public void onWindowFocusChanged(boolean hasFocus) {
// TODO Auto-generated method stub
}
public ActionMode onWindowStartingActionMode(Callback callback) {
// TODO Auto-generated method stub
if (mActionBar != null) {
return mActionBar.startActionMode(callback);
}
return null;
}
public boolean onCreateOptionsMenu(Menu menu) {
return true;
}
public boolean onPrepareOptionsMenu(Menu menu) {
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
return false;
}
public void onOptionsMenuClosed(Menu menu) {
}
public void openOptionsMenu() {
mWindow.openPanel(Window.FEATURE_OPTIONS_PANEL, null);
}
public void closeOptionsMenu() {
mWindow.closePanel(Window.FEATURE_OPTIONS_PANEL);
}
public void invalidateOptionsMenu() {
mWindow.invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
}
public void registerForContextMenu(View view) {
view.setOnCreateContextMenuListener(this);
}
public void unregisterForContextMenu(View view) {
view.setOnCreateContextMenuListener(null);
}
public void openContextMenu(View view) {
view.showContextMenu();
}
public boolean onContextItemSelected(MenuItem item) {
return false;
}
public void onContextMenuClosed(Menu menu) {
}
public final void setVolumeControlStream(int streamType) {
getWindow().setVolumeControlStream(streamType);
}
public final int getVolumeControlStream() {
return getWindow().getVolumeControlStream();
}
public void setOnKeyListener(final OnKeyListener onKeyListener) {
mOnKeyListener = onKeyListener;
}
private static final class ListenersHandler extends Handler {
private WeakReference<FloatInterface> mFloatView;
public ListenersHandler(FloatView view) {
mFloatView = new WeakReference<FloatInterface>(view);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DISMISS:
((OnDismissListener) msg.obj).onDismiss(mFloatView.get());
break;
case CANCEL:
((OnCancelListener) msg.obj).onCancel(mFloatView.get());
break;
case SHOW:
((onShowListener) msg.obj).onShow(mFloatView.get());
break;
}
}
}
public int getAnimationStyle() {
return mAnimationStyle;
}
public void setAnimationStyle(int mAnimationStyle) {
this.mAnimationStyle = mAnimationStyle;
}
private int computeAnimationResource() {
if (mAnimationStyle == -1) {
return showFromTop ? R.style.Animation_DropDownUp_FloatView : R.style.Animation_tws_DropDownDown_FloatView;
}
return mAnimationStyle;
}
public boolean onDown(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// TODO Auto-generated method stub
if (Math.abs(velocityX) > 2000.0f || Math.abs(velocityY) > 2000.0f) {
dismiss();
}
return false;
}
public void onLongPress(MotionEvent e) {
// TODO Auto-generated method stub
}
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
// TODO Auto-generated method stub
switch (e1.getAction()) {
case MotionEvent.ACTION_DOWN:
xInView = e1.getX();
yInView = e1.getY();
xDownInScreen = e1.getRawX();
yDownInScreen = e1.getRawY() - getStatusBarHeight();
xInScreen = e1.getRawX();
yInScreen = e1.getRawY() - getStatusBarHeight();
break;
}
switch (e2.getAction()) {
case MotionEvent.ACTION_MOVE:
xInScreen = e2.getRawX();
yInScreen = e2.getRawY() - getStatusBarHeight();
updateFloatViewPosition();
InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null && mWindow.getCurrentFocus() != null) {
imm.hideSoftInputFromWindow(mWindow.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
break;
}
return false;
}
public void onShowPress(MotionEvent e) {
// TODO Auto-generated method stub
}
public boolean onSingleTapUp(MotionEvent e) {
// TODO Auto-generated method stub
return false;
}
// update
public void update(int resId, String title, String subtitle) {
Drawable drawable = mContext.getResources().getDrawable(resId);
setSlideOutAnimator(drawable, title, subtitle);
}
public void update(Drawable drawable, String title, String subtitle) {
setSlideOutAnimator(drawable, title, subtitle);
}
public void update(int layoutId) {
View view = LayoutInflater.from(mContext).inflate(layoutId, null);
update(view);
}
public void update(View customView) {
dismiss();
setContentView(customView);
show(true);
}
private boolean isAnimatorFinish = false;
public boolean animatorIsFinish() {
return isAnimatorFinish;
}
public void setSlideOutAnimator(final Drawable drawable, final String title, final String subtitle) {
Log.i(TAG, "setSlideOutAnimator");
Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.floatview_shrink_fade_out);
// anim.setDuration(1000);
anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
}
@Override
public void onAnimationRepeat(Animation arg0) {
}
@Override
public void onAnimationEnd(Animation arg0) {
// isAnimatorFinish = true;
mDefaultIcon.setImageDrawable(drawable);
mDefaultTitle.setText(title);
mDefaultSubTitle.setText(subtitle);
setSlideInAnimator();
}
});
Log.i(TAG, "setSlideOutAnimator mCustomFloatView before");
if (mDefaultContent != null) {
Log.d(TAG, "setSlideOutAnimator mCustomFloatView ");
mDefaultContent.startAnimation(anim);
}
Log.i(TAG, "setSlideOutAnimator mCustomFloatView after");
}
public void setSlideInAnimator() {
Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.floatview_grow_fade_in);
anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation arg0) {
}
@Override
public void onAnimationRepeat(Animation arg0) {
}
@Override
public void onAnimationEnd(Animation arg0) {
}
});
if (mDefaultContent != null) {
mDefaultContent.startAnimation(anim);
}
}
private int getScreenDensity() {
int widthPixels = 0;
android.view.WindowManager manager = (android.view.WindowManager) mContext
.getSystemService(Context.WINDOW_SERVICE);
if (manager != null) {
DisplayMetrics dm = new DisplayMetrics();
Display display = manager.getDefaultDisplay();
if (display != null) {
manager.getDefaultDisplay().getMetrics(dm);
widthPixels = dm.widthPixels;
float originDensity = dm.density;
float adaptDensity = 0;
if (widthPixels >= WIDTH_XXH) {
adaptDensity = DENSITY_XXH;
} else if (widthPixels >= WIDTH_XH) {
adaptDensity = DENSITY_XH;
} else if (widthPixels >= WIDTH_H) {
adaptDensity = DENSITY_H;
}
// int temp = (int)(originDensity > adaptDensity ? originDensity
// : adaptDensity);
// Log.e("bruce", "widthPixels = " + widthPixels +
// "; adaptDensity = " + adaptDensity +
// "; originDensity = " + originDensity + "; temp = " + temp);
return (int) (originDensity)/*
* (originDensity > adaptDensity ?
* originDensity : adaptDensity)
*/;
}
}
return 0;
}
private void setFloatViewAnimator() {
AnimatorSet set = new AnimatorSet();
ObjectAnimator anim1 = ObjectAnimator.ofFloat(mCustomFloatView, "alpha", 1f, 0f);
anim1.setDuration(2000);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(mCustomFloatView, "alpha", 0f, 1f);
anim2.setDuration(2000);
set.play(anim1).before(anim2);
set.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator arg0) {
}
@Override
public void onAnimationRepeat(Animator arg0) {
}
@Override
public void onAnimationEnd(Animator arg0) {
}
@Override
public void onAnimationCancel(Animator arg0) {
}
});
set.start();
}
}
// tws-end add global float view::2014-09-13