diff options
Diffstat (limited to 'core/java/android/gadget/GadgetHostView.java')
-rw-r--r-- | core/java/android/gadget/GadgetHostView.java | 312 |
1 files changed, 0 insertions, 312 deletions
diff --git a/core/java/android/gadget/GadgetHostView.java b/core/java/android/gadget/GadgetHostView.java deleted file mode 100644 index 5cbd988..0000000 --- a/core/java/android/gadget/GadgetHostView.java +++ /dev/null @@ -1,312 +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 android.gadget; - -import android.content.Context; -import android.content.pm.PackageManager; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; -import android.util.Config; -import android.util.Log; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.Animation; -import android.widget.FrameLayout; -import android.widget.RemoteViews; -import android.widget.TextView; - -/** - * Provides the glue to show gadget views. This class offers automatic animation - * between updates, and will try recycling old views for each incoming - * {@link RemoteViews}. - */ -public class GadgetHostView extends FrameLayout { - static final String TAG = "GadgetHostView"; - static final boolean LOGD = false; - static final boolean CROSSFADE = false; - - static final int VIEW_MODE_NOINIT = 0; - static final int VIEW_MODE_CONTENT = 1; - static final int VIEW_MODE_ERROR = 2; - static final int VIEW_MODE_DEFAULT = 3; - - static final int FADE_DURATION = 1000; - - // When we're inflating the initialLayout for a gadget, we only allow - // views that are allowed in RemoteViews. - static final LayoutInflater.Filter sInflaterFilter = new LayoutInflater.Filter() { - public boolean onLoadClass(Class clazz) { - return clazz.isAnnotationPresent(RemoteViews.RemoteView.class); - } - }; - - Context mContext; - - int mGadgetId; - GadgetProviderInfo mInfo; - View mView; - int mViewMode = VIEW_MODE_NOINIT; - int mLayoutId = -1; - long mFadeStartTime = -1; - Bitmap mOld; - Paint mOldPaint = new Paint(); - - /** - * Create a host view. Uses default fade animations. - */ - public GadgetHostView(Context context) { - this(context, android.R.anim.fade_in, android.R.anim.fade_out); - } - - /** - * Create a host view. Uses specified animations when pushing - * {@link #updateGadget(RemoteViews)}. - * - * @param animationIn Resource ID of in animation to use - * @param animationOut Resource ID of out animation to use - */ - public GadgetHostView(Context context, int animationIn, int animationOut) { - super(context); - mContext = context; - } - - /** - * Set the gadget that will be displayed by this view. - */ - public void setGadget(int gadgetId, GadgetProviderInfo info) { - mGadgetId = gadgetId; - mInfo = info; - } - - public int getGadgetId() { - return mGadgetId; - } - - public GadgetProviderInfo getGadgetInfo() { - return mInfo; - } - - /** - * Process a set of {@link RemoteViews} coming in as an update from the - * gadget provider. Will animate into these new views as needed. - */ - public void updateGadget(RemoteViews remoteViews) { - if (LOGD) Log.d(TAG, "updateGadget called mOld=" + mOld); - - boolean recycled = false; - View content = null; - Exception exception = null; - - // Capture the old view into a bitmap so we can do the crossfade. - if (CROSSFADE) { - if (mFadeStartTime < 0) { - if (mView != null) { - final int width = mView.getWidth(); - final int height = mView.getHeight(); - try { - mOld = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - } catch (OutOfMemoryError e) { - // we just won't do the fade - mOld = null; - } - if (mOld != null) { - //mView.drawIntoBitmap(mOld); - } - } - } - } - - if (remoteViews == null) { - if (mViewMode == VIEW_MODE_DEFAULT) { - // We've already done this -- nothing to do. - return; - } - content = getDefaultView(); - mLayoutId = -1; - mViewMode = VIEW_MODE_DEFAULT; - } else { - int layoutId = remoteViews.getLayoutId(); - - // If our stale view has been prepared to match active, and the new - // layout matches, try recycling it - if (content == null && layoutId == mLayoutId) { - try { - remoteViews.reapply(mContext, mView); - content = mView; - recycled = true; - if (LOGD) Log.d(TAG, "was able to recycled existing layout"); - } catch (RuntimeException e) { - exception = e; - } - } - - // Try normal RemoteView inflation - if (content == null) { - try { - content = remoteViews.apply(mContext, this); - if (LOGD) Log.d(TAG, "had to inflate new layout"); - } catch (RuntimeException e) { - exception = e; - } - } - - mLayoutId = layoutId; - mViewMode = VIEW_MODE_CONTENT; - } - - if (content == null) { - if (mViewMode == VIEW_MODE_ERROR) { - // We've already done this -- nothing to do. - return ; - } - Log.w(TAG, "updateGadget couldn't find any view, using error view", exception); - content = getErrorView(); - mViewMode = VIEW_MODE_ERROR; - } - - if (!recycled) { - prepareView(content); - addView(content); - } - - if (mView != content) { - removeView(mView); - mView = content; - } - - if (CROSSFADE) { - if (mFadeStartTime < 0) { - // if there is already an animation in progress, don't do anything -- - // the new view will pop in on top of the old one during the cross fade, - // and that looks okay. - mFadeStartTime = SystemClock.uptimeMillis(); - invalidate(); - } - } - } - - protected boolean drawChild(Canvas canvas, View child, long drawingTime) { - if (CROSSFADE) { - int alpha; - int l = child.getLeft(); - int t = child.getTop(); - if (mFadeStartTime > 0) { - alpha = (int)(((drawingTime-mFadeStartTime)*255)/FADE_DURATION); - if (alpha > 255) { - alpha = 255; - } - Log.d(TAG, "drawChild alpha=" + alpha + " l=" + l + " t=" + t - + " w=" + child.getWidth()); - if (alpha != 255 && mOld != null) { - mOldPaint.setAlpha(255-alpha); - //canvas.drawBitmap(mOld, l, t, mOldPaint); - } - } else { - alpha = 255; - } - int restoreTo = canvas.saveLayerAlpha(l, t, child.getWidth(), child.getHeight(), alpha, - Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); - boolean rv = super.drawChild(canvas, child, drawingTime); - canvas.restoreToCount(restoreTo); - if (alpha < 255) { - invalidate(); - } else { - mFadeStartTime = -1; - if (mOld != null) { - mOld.recycle(); - mOld = null; - } - } - return rv; - } else { - return super.drawChild(canvas, child, drawingTime); - } - } - - /** - * Prepare the given view to be shown. This might include adjusting - * {@link FrameLayout.LayoutParams} before inserting. - */ - protected void prepareView(View view) { - // Take requested dimensions from parent, but apply default gravity. - ViewGroup.LayoutParams requested = view.getLayoutParams(); - if (requested == null) { - requested = new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, - LayoutParams.FILL_PARENT); - } - - FrameLayout.LayoutParams params = - new FrameLayout.LayoutParams(requested.width, requested.height); - params.gravity = Gravity.CENTER; - view.setLayoutParams(params); - } - - /** - * Inflate and return the default layout requested by gadget provider. - */ - protected View getDefaultView() { - View defaultView = null; - Exception exception = null; - - try { - if (mInfo != null) { - Context theirContext = mContext.createPackageContext( - mInfo.provider.getPackageName(), 0 /* no flags */); - LayoutInflater inflater = (LayoutInflater) - theirContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - inflater = inflater.cloneInContext(theirContext); - inflater.setFilter(sInflaterFilter); - defaultView = inflater.inflate(mInfo.initialLayout, this, false); - } else { - Log.w(TAG, "can't inflate defaultView because mInfo is missing"); - } - } catch (PackageManager.NameNotFoundException e) { - exception = e; - } catch (RuntimeException e) { - exception = e; - } - - if (exception != null && LOGD) { - Log.w(TAG, "Error inflating gadget " + mInfo, exception); - } - - if (defaultView == null) { - if (LOGD) Log.d(TAG, "getDefaultView couldn't find any view, so inflating error"); - defaultView = getErrorView(); - } - - return defaultView; - } - - /** - * Inflate and return a view that represents an error state. - */ - protected View getErrorView() { - TextView tv = new TextView(mContext); - tv.setText(com.android.internal.R.string.gadget_host_error_inflating); - // TODO: get this color from somewhere. - tv.setBackgroundColor(Color.argb(127, 0, 0, 0)); - return tv; - } -} |