19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1745ce864ef41ce90938cc34d42a8e1075f69e7a61Dianne Hackbornpackage com.android.systemui;
1845ce864ef41ce90938cc34d42a8e1075f69e7a61Dianne Hackborn
1945ce864ef41ce90938cc34d42a8e1075f69e7a61Dianne Hackbornimport com.android.internal.os.ProcessStats;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Service;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Paint;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class LoadAverageService extends Service {
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private View mView;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final class Stats extends ProcessStats {
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String mLoadText;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadWidth;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Paint mPaint;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Stats(Paint paint) {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(false);
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPaint = paint;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onLoadChanged(float load1, float load5, float load15) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadText = load1 + " / " + load5 + " / " + load15;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadWidth = (int)mPaint.measureText(mLoadText);
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int onMeasureProcessName(String name) {
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (int)mPaint.measureText(name);
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private class LoadView extends View {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Handler mHandler = new Handler() {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void handleMessage(Message msg) {
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (msg.what == 1) {
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStats.update();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    updateDisplay();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Message m = obtainMessage(1);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    sendMessageDelayed(m, 2000);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private final Stats mStats;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Paint mLoadPaint;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Paint mAddedPaint;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Paint mRemovedPaint;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Paint mShadowPaint;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Paint mShadow2Paint;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Paint mIrqPaint;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Paint mSystemPaint;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private Paint mUserPaint;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private float mAscent;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mFH;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mNeededWidth;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mNeededHeight;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LoadView(Context c) {
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(c);
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setPadding(4, 4, 4, 4);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //setBackgroundResource(com.android.internal.R.drawable.load_average_background);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // Need to scale text size by density...  but we won't do it
96ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // linearly, because with higher dps it is nice to squeeze the
97ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // text a bit to fit more of it.  And with lower dps, trying to
98ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            // go much smaller will result in unreadable text.
99ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            int textSize = 10;
100ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            float density = c.getResources().getDisplayMetrics().density;
101ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            if (density < 1) {
102ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                textSize = 9;
103ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            } else {
104ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                textSize = (int)(10*density);
105ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                if (textSize < 10) {
106ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    textSize = 10;
107ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                }
108ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadPaint = new Paint();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadPaint.setAntiAlias(true);
111ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            mLoadPaint.setTextSize(textSize);
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadPaint.setARGB(255, 255, 255, 255);
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAddedPaint = new Paint();
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAddedPaint.setAntiAlias(true);
116ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            mAddedPaint.setTextSize(textSize);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAddedPaint.setARGB(255, 128, 255, 128);
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRemovedPaint = new Paint();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRemovedPaint.setAntiAlias(true);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRemovedPaint.setStrikeThruText(true);
122ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            mRemovedPaint.setTextSize(textSize);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRemovedPaint.setARGB(255, 255, 128, 128);
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mShadowPaint = new Paint();
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mShadowPaint.setAntiAlias(true);
127ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            mShadowPaint.setTextSize(textSize);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //mShadowPaint.setFakeBoldText(true);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mShadowPaint.setARGB(192, 0, 0, 0);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadPaint.setShadowLayer(4, 0, 0, 0xff000000);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mShadow2Paint = new Paint();
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mShadow2Paint.setAntiAlias(true);
134ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            mShadow2Paint.setTextSize(textSize);
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //mShadow2Paint.setFakeBoldText(true);
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mShadow2Paint.setARGB(192, 0, 0, 0);
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadPaint.setShadowLayer(2, 0, 0, 0xff000000);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIrqPaint = new Paint();
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIrqPaint.setARGB(0x80, 0, 0, 0xff);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIrqPaint.setShadowLayer(2, 0, 0, 0xff000000);
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSystemPaint = new Paint();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSystemPaint.setARGB(0x80, 0xff, 0, 0);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSystemPaint.setShadowLayer(2, 0, 0, 0xff000000);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUserPaint = new Paint();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUserPaint.setARGB(0x80, 0, 0xff, 0);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSystemPaint.setShadowLayer(2, 0, 0, 0xff000000);
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAscent = mLoadPaint.ascent();
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            float descent = mLoadPaint.descent();
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFH = (int)(descent - mAscent + .5f);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats = new Stats(mLoadPaint);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.init();
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            updateDisplay();
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected void onAttachedToWindow() {
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onAttachedToWindow();
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.sendEmptyMessage(1);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        protected void onDetachedFromWindow() {
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onDetachedFromWindow();
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.removeMessages(1);
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
171ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
172ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            setMeasuredDimension(resolveSize(mNeededWidth, widthMeasureSpec),
173ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                    resolveSize(mNeededHeight, heightMeasureSpec));
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onDraw(Canvas canvas) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super.onDraw(canvas);
179ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            final int W = mNeededWidth;
180ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            final int RIGHT = getWidth()-1;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Stats stats = mStats;
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int userTime = stats.getLastUserTime();
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int systemTime = stats.getLastSystemTime();
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int iowaitTime = stats.getLastIoWaitTime();
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int irqTime = stats.getLastIrqTime();
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int softIrqTime = stats.getLastSoftIrqTime();
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int idleTime = stats.getLastIdleTime();
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int totalTime = userTime+systemTime+iowaitTime+irqTime+softIrqTime+idleTime;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (totalTime == 0) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int userW = (userTime*W)/totalTime;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int systemW = (systemTime*W)/totalTime;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int irqW = ((iowaitTime+irqTime+softIrqTime)*W)/totalTime;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
198ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            int x = RIGHT - mPaddingRight;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int top = mPaddingTop + 2;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int bottom = mPaddingTop + mFH - 2;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (irqW > 0) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas.drawRect(x-irqW, top, x, bottom, mIrqPaint);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                x -= irqW;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (systemW > 0) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas.drawRect(x-systemW, top, x, bottom, mSystemPaint);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                x -= systemW;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (userW > 0) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas.drawRect(x-userW, top, x, bottom, mUserPaint);
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                x -= userW;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int y = mPaddingTop - (int)mAscent;
216ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            canvas.drawText(stats.mLoadText, RIGHT-mPaddingRight-stats.mLoadWidth-1,
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    y-1, mShadowPaint);
218ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            canvas.drawText(stats.mLoadText, RIGHT-mPaddingRight-stats.mLoadWidth-1,
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    y+1, mShadowPaint);
220ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            canvas.drawText(stats.mLoadText, RIGHT-mPaddingRight-stats.mLoadWidth+1,
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    y-1, mShadow2Paint);
222ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            canvas.drawText(stats.mLoadText, RIGHT-mPaddingRight-stats.mLoadWidth+1,
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    y+1, mShadow2Paint);
224ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            canvas.drawText(stats.mLoadText, RIGHT-mPaddingRight-stats.mLoadWidth,
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    y, mLoadPaint);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int N = stats.countWorkingStats();
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<N; i++) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Stats.Stats st = stats.getWorkingStats(i);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                y += mFH;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                top += mFH;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bottom += mFH;
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                userW = (st.rel_utime*W)/totalTime;
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                systemW = (st.rel_stime*W)/totalTime;
236ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                x = RIGHT - mPaddingRight;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (systemW > 0) {
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    canvas.drawRect(x-systemW, top, x, bottom, mSystemPaint);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    x -= systemW;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (userW > 0) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    canvas.drawRect(x-userW, top, x, bottom, mUserPaint);
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    x -= userW;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
246ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                canvas.drawText(st.name, RIGHT-mPaddingRight-st.nameWidth-1,
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        y-1, mShadowPaint);
248ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                canvas.drawText(st.name, RIGHT-mPaddingRight-st.nameWidth-1,
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        y+1, mShadowPaint);
250ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                canvas.drawText(st.name, RIGHT-mPaddingRight-st.nameWidth+1,
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        y-1, mShadow2Paint);
252ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                canvas.drawText(st.name, RIGHT-mPaddingRight-st.nameWidth+1,
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        y+1, mShadow2Paint);
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Paint p = mLoadPaint;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (st.added) p = mAddedPaint;
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (st.removed) p = mRemovedPaint;
257ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn                canvas.drawText(st.name, RIGHT-mPaddingRight-st.nameWidth, y, p);
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void updateDisplay() {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Stats stats = mStats;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int NW = stats.countWorkingStats();
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int maxWidth = stats.mLoadWidth;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=0; i<NW; i++) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Stats.Stats st = stats.getWorkingStats(i);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (st.nameWidth > maxWidth) {
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    maxWidth = st.nameWidth;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int neededWidth = mPaddingLeft + mPaddingRight + maxWidth;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int neededHeight = mPaddingTop + mPaddingBottom + (mFH*(1+NW));
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (neededWidth != mNeededWidth || neededHeight != mNeededHeight) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNeededWidth = neededWidth;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mNeededHeight = neededHeight;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout();
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                invalidate();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onCreate() {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onCreate();
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = new LoadView(this);
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
290ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            WindowManager.LayoutParams.MATCH_PARENT,
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams.WRAP_CONTENT,
2923b2b354ec1ba070eae13391d004d97a3e1403050Jeff Brown            WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY,
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            PixelFormat.TRANSLUCENT);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        params.gravity = Gravity.RIGHT | Gravity.TOP;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        params.setTitle("Load Average");
2982ed9946441a2913fb7aa8ca1fa24262205da9f23Dianne Hackborn        WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        wm.addView(mView, params);
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onDestroy() {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onDestroy();
3052ed9946441a2913fb7aa8ca1fa24262205da9f23Dianne Hackborn        ((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(mView);
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mView = null;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IBinder onBind(Intent intent) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
315