diff options
author | Daniel Sandler <dsandler@android.com> | 2013-06-12 00:38:25 -0400 |
---|---|---|
committer | Daniel Sandler <dsandler@android.com> | 2013-06-12 00:44:28 -0400 |
commit | 924b993c750e6de8537afb750c2d2b9932efbdac (patch) | |
tree | 9372725b4b25f87565b4413c12e9ea3946033c6e | |
parent | cc8befac3550c81d04ea206c170adae36c9a6c93 (diff) | |
download | android_packages_apps_Trebuchet-924b993c750e6de8537afb750c2d2b9932efbdac.tar.gz android_packages_apps_Trebuchet-924b993c750e6de8537afb750c2d2b9932efbdac.tar.bz2 android_packages_apps_Trebuchet-924b993c750e6de8537afb750c2d2b9932efbdac.zip |
Memory debugging overlay for L3.
Change-Id: Id26e9dcf23017abaffed4015166d57e21e751e6c
-rw-r--r-- | src/com/android/launcher3/Launcher.java | 34 | ||||
-rw-r--r-- | src/com/android/launcher3/LauncherAppState.java | 15 | ||||
-rw-r--r-- | src/com/android/launcher3/WeightWatcher.java | 198 |
3 files changed, 226 insertions, 21 deletions
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 512ed96be..70fa7eb9e 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -70,29 +70,15 @@ import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.text.method.TextKeyListener; import android.util.Log; -import android.view.Display; -import android.view.HapticFeedbackConstants; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.Surface; -import android.view.View; +import android.view.*; import android.view.View.OnLongClickListener; -import android.view.ViewGroup; -import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.inputmethod.InputMethodManager; -import android.widget.Advanceable; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; +import android.widget.*; import com.android.launcher3.R; import com.android.launcher3.DropTarget.DragObject; @@ -121,10 +107,11 @@ public class Launcher extends Activity static final String TAG = "Launcher"; static final boolean LOGD = false; - static final boolean PROFILE_STARTUP = false; + static final boolean PROFILE_STARTUP = true; static final boolean DEBUG_WIDGETS = false; static final boolean DEBUG_STRICT_MODE = false; - static final boolean DEBUG_RESUME_TIME = false; + static final boolean DEBUG_RESUME_TIME = true; + static final boolean DEBUG_MEMORY = true; private static final int MENU_GROUP_WALLPAPER = 1; private static final int MENU_WALLPAPER_SETTINGS = Menu.FIRST + 1; @@ -740,6 +727,7 @@ public class Launcher extends Activity long startTime = 0; if (DEBUG_RESUME_TIME) { startTime = System.currentTimeMillis(); + Log.v(TAG, "Launcher.onResume()"); } super.onResume(); @@ -1022,6 +1010,16 @@ public class Launcher extends Activity if (mSearchDropTargetBar != null) { mSearchDropTargetBar.setup(this, dragController); } + + if (DEBUG_MEMORY) { + Log.v(TAG, "adding WeightWatcher"); + ((FrameLayout) mLauncherView).addView(new WeightWatcher(this), + new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + 44, + Gravity.BOTTOM) + ); + } } /** diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java index fb49d9398..3ac64e7ae 100644 --- a/src/com/android/launcher3/LauncherAppState.java +++ b/src/com/android/launcher3/LauncherAppState.java @@ -36,9 +36,9 @@ public class LauncherAppState { private static float sScreenDensity; private static int sLongPressTimeout = 300; private static final String sSharedPreferencesKey = "com.android.launcher3.prefs"; - WeakReference<LauncherProvider> mLauncherProvider; + private long mUptime; - private static LauncherAppState INSTANCE; + WeakReference<LauncherProvider> mLauncherProvider; private static final LauncherAppState INSTANCE = new LauncherAppState(); @@ -59,6 +59,8 @@ public class LauncherAppState { private void initialize(Context context) { mContext = context; + mUptime = System.currentTimeMillis(); + // set sIsScreenXLarge and sScreenDensity *before* creating icon cache sIsScreenLarge = context.getResources().getBoolean(R.bool.is_large_screen); sScreenDensity = context.getResources().getDisplayMetrics().density; @@ -132,7 +134,7 @@ public class LauncherAppState { return mWidgetPreviewCacheDb; } - void setLauncherProvider(LauncherProvider provider) { + void setLauncherProvider(LauncherProvider provider) { mLauncherProvider = new WeakReference<LauncherProvider>(provider); } @@ -140,6 +142,13 @@ public class LauncherAppState { return mLauncherProvider.get(); } + /** + * @return Milliseconds since the application state was created. + */ + public long getUptime() { + return System.currentTimeMillis() - mUptime; + } + public static String getSharedPreferencesKey() { return sSharedPreferencesKey; } diff --git a/src/com/android/launcher3/WeightWatcher.java b/src/com/android/launcher3/WeightWatcher.java new file mode 100644 index 000000000..15de93cb7 --- /dev/null +++ b/src/com/android/launcher3/WeightWatcher.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2013 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.launcher3; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.os.Debug; +import android.os.Handler; +import android.os.Message; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +public class WeightWatcher extends LinearLayout { + private static final long UPDATE_RATE = 5000; + + private static final int RAM_GRAPH_COLOR = 0x9099CC00; + private static final int TEXT_COLOR = 0x90FFFFFF; + private static final int BACKGROUND_COLOR = 0x40000000; + + private static final int MSG_START = 1; + private static final int MSG_STOP = 2; + private static final int MSG_UPDATE = 3; + + TextView mRamText; + GraphView mRamGraph; + TextView mUptimeText; + + Handler mHandler = new Handler() { + @Override + public void handleMessage(Message m) { + switch (m.what) { + case MSG_START: + mHandler.sendEmptyMessage(MSG_UPDATE); + break; + case MSG_STOP: + mHandler.removeMessages(MSG_UPDATE); + break; + case MSG_UPDATE: + update(); + mHandler.sendEmptyMessageDelayed(MSG_UPDATE, UPDATE_RATE); + break; + } + } + }; + + public WeightWatcher(Context context, AttributeSet attrs) { + super(context, attrs); + + final float dp = getResources().getDisplayMetrics().density; + + setBackgroundColor(BACKGROUND_COLOR); + + mRamText = new TextView(getContext()); + mUptimeText = new TextView(getContext()); + mRamText.setTextColor(TEXT_COLOR); + mUptimeText.setTextColor(TEXT_COLOR); + + final int p = (int)(4*dp); + setPadding(p, 0, p, 0); + + mRamGraph = new GraphView(getContext()); + + LinearLayout.LayoutParams wrapParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ); + wrapParams.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL; + wrapParams.setMarginEnd((int)(8*dp)); + + LinearLayout.LayoutParams fillParams = new LinearLayout.LayoutParams( + 0, + LinearLayout.LayoutParams.MATCH_PARENT, + 1.0f + ); + + addView(mUptimeText, wrapParams); + addView(mRamText, wrapParams); + addView(mRamGraph, fillParams); + } + + public WeightWatcher(Context context) { + this(context, null); + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + mHandler.sendEmptyMessage(MSG_START); + } + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + mRamText.setTextSize(h * 0.25f); + mUptimeText.setTextSize(h * 0.25f); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mHandler.sendEmptyMessage(MSG_STOP); + } + + public String getUptimeString() { + long sec = LauncherAppState.getInstance().getUptime() / 1000; + StringBuilder sb = new StringBuilder(); + long days = sec / 86400; + if (days > 0) { + sec -= days * 86400; + sb.append(days); + sb.append("d"); + } + + long hours = sec / 3600; + if (hours > 0) { + sec -= hours * 3600; + sb.append(hours); + sb.append("h"); + } + + long mins = sec / 60; + if (mins > 0) { + sec -= mins * 60; + sb.append(mins); + sb.append("m"); + } + + sb.append(sec); + sb.append("s"); + return sb.toString(); + } + + void update() { + final long pss = Debug.getPss(); + + mRamGraph.add(pss); + mRamText.setText("pss=" + pss); + mUptimeText.setText("uptime=" + getUptimeString()); + + postInvalidate(); + } + + public static class GraphView extends View { + final long[] data = new long[256]; + long max = 1; + int head = 0; + + Paint paint; + + public GraphView(Context context, AttributeSet attrs) { + super(context, attrs); + + paint = new Paint(); + paint.setColor(RAM_GRAPH_COLOR); + } + + public GraphView(Context context) { + this(context, null); + } + + public void add(long dat) { + head = (head+1) % data.length; + data[head] = dat; + if (dat > max) max = dat; + invalidate(); + } + + @Override + public void onDraw(Canvas c) { + int w = c.getWidth(); + int h = c.getHeight(); + + final float barWidth = (float) w / data.length; + final float scale = (float) h / max; + + for (int i=0; i<data.length; i++) { + c.drawRect(i * barWidth, h - scale * data[i], (i+1) * barWidth, h, paint); + } + } + } +} |