diff --git a/apps/Development/Android.mk b/apps/Development/Android.mk index 1cef54881..fa929b6c3 100644 --- a/apps/Development/Android.mk +++ b/apps/Development/Android.mk @@ -3,6 +3,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := eng +LOCAL_STATIC_JAVA_LIBRARIES := android-common LOCAL_JAVA_LIBRARIES := android.test.runner LOCAL_SRC_FILES := $(call all-subdir-java-files) \ diff --git a/apps/Development/res/layout/development_settings.xml b/apps/Development/res/layout/development_settings.xml index 9c04f5d6a..16c2cdf58 100644 --- a/apps/Development/res/layout/development_settings.xml +++ b/apps/Development/res/layout/development_settings.xml @@ -54,10 +54,16 @@ android:layout_below="@id/wait_for_debugger" android:layout_alignParentLeft="true" /> + + diff --git a/apps/Development/src/com/android/development/DevelopmentSettings.java b/apps/Development/src/com/android/development/DevelopmentSettings.java index 9cb6fc639..c01ea59d6 100644 --- a/apps/Development/src/com/android/development/DevelopmentSettings.java +++ b/apps/Development/src/com/android/development/DevelopmentSettings.java @@ -52,6 +52,7 @@ public class DevelopmentSettings extends Activity { private Button mDebugAppButton; private CheckBox mWaitForDebuggerCB; private CheckBox mAlwaysFinishCB; + private Spinner mPointerLocationSpinner; private CheckBox mShowLoadCB; private CheckBox mShowCpuCB; private CheckBox mEnableGLCB; @@ -68,6 +69,7 @@ public class DevelopmentSettings extends Activity { private String mDebugApp; private boolean mWaitForDebugger; private boolean mAlwaysFinish; + private int mPointerLocation; private int mProcessLimit; private boolean mShowSleep; private boolean mShowXmpp; @@ -94,6 +96,16 @@ public class DevelopmentSettings extends Activity { mWaitForDebuggerCB.setOnClickListener(mWaitForDebuggerClicked); mAlwaysFinishCB = (CheckBox)findViewById(R.id.always_finish); mAlwaysFinishCB.setOnClickListener(mAlwaysFinishClicked); + mPointerLocationSpinner = (Spinner)findViewById(R.id.pointer_location); + mPointerLocationSpinner.setOnItemSelectedListener(mPointerLocationChanged); + ArrayAdapter adapter = new ArrayAdapter( + this, + android.R.layout.simple_spinner_item, + new String[] { + "No Pointer Location", + "Pointer Location" }); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + mPointerLocationSpinner.setAdapter(adapter); mShowLoadCB = (CheckBox)findViewById(R.id.show_load); mShowLoadCB.setOnClickListener(mShowLoadClicked); mShowCpuCB = (CheckBox)findViewById(R.id.show_cpu); @@ -113,7 +125,7 @@ public class DevelopmentSettings extends Activity { mCompatibilityModeCB.setOnClickListener(mCompatibilityModeClicked); mMaxProcsSpinner = (Spinner)findViewById(R.id.max_procs); mMaxProcsSpinner.setOnItemSelectedListener(mMaxProcsChanged); - ArrayAdapter adapter = new ArrayAdapter( + adapter = new ArrayAdapter( this, android.R.layout.simple_spinner_item, new String[] { @@ -169,6 +181,7 @@ public class DevelopmentSettings extends Activity { super.onResume(); updateDebugOptions(); updateFinishOptions(); + updatePointerLocationOptions(); updateProcessLimitOptions(); updateSharedOptions(); updateFlingerOptions(); @@ -221,6 +234,17 @@ public class DevelopmentSettings extends Activity { mAlwaysFinishCB.setChecked(mAlwaysFinish); } + private void writePointerLocationOptions() { + Settings.System.putInt(getContentResolver(), + Settings.System.POINTER_LOCATION, mPointerLocation); + } + + private void updatePointerLocationOptions() { + mPointerLocation = Settings.System.getInt(getContentResolver(), + Settings.System.POINTER_LOCATION, 0); + mPointerLocationSpinner.setSelection(mPointerLocation); + } + private void writeProcessLimitOptions() { try { ActivityManagerNative.getDefault().setProcessLimit(mProcessLimit); @@ -420,6 +444,18 @@ public class DevelopmentSettings extends Activity { } }; + private Spinner.OnItemSelectedListener mPointerLocationChanged + = new Spinner.OnItemSelectedListener() { + public void onItemSelected(android.widget.AdapterView av, View v, + int position, long id) { + mPointerLocation = position; + writePointerLocationOptions(); + } + + public void onNothingSelected(android.widget.AdapterView av) { + } + }; + private Spinner.OnItemSelectedListener mMaxProcsChanged = new Spinner.OnItemSelectedListener() { public void onItemSelected(android.widget.AdapterView av, View v, diff --git a/apps/Development/src/com/android/development/PointerLocation.java b/apps/Development/src/com/android/development/PointerLocation.java index 38b4af2dc..88828b095 100644 --- a/apps/Development/src/com/android/development/PointerLocation.java +++ b/apps/Development/src/com/android/development/PointerLocation.java @@ -16,20 +16,11 @@ package com.android.development; -import android.app.Activity; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Paint.FontMetricsInt; -import android.os.Bundle; -import android.util.Log; -import android.view.MotionEvent; -import android.view.ViewConfiguration; -import android.view.WindowManager; -import android.view.VelocityTracker; -import android.view.View; +import com.android.common.ui.PointerLocationView; -import java.util.ArrayList; +import android.app.Activity; +import android.os.Bundle; +import android.view.WindowManager; /** * Demonstrates wrapping a layout in a ScrollView. @@ -39,304 +30,11 @@ public class PointerLocation extends Activity { @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); - setContentView(new MyView(this)); + setContentView(new PointerLocationView(this)); // Make the screen full bright for this activity. WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.screenBrightness = 1.0f; getWindow().setAttributes(lp); } - - public static class PointerState { - private final ArrayList mXs = new ArrayList(); - private final ArrayList mYs = new ArrayList(); - private boolean mCurDown; - private int mCurX; - private int mCurY; - private float mCurPressure; - private float mCurSize; - private int mCurWidth; - private VelocityTracker mVelocity; - } - - public class MyView extends View { - private final ViewConfiguration mVC; - private final Paint mTextPaint; - private final Paint mTextBackgroundPaint; - private final Paint mTextLevelPaint; - private final Paint mPaint; - private final Paint mTargetPaint; - private final Paint mPathPaint; - private final FontMetricsInt mTextMetrics = new FontMetricsInt(); - private int mHeaderBottom; - private boolean mCurDown; - private int mCurNumPointers; - private int mMaxNumPointers; - private final ArrayList mPointers - = new ArrayList(); - - public MyView(Context c) { - super(c); - mVC = ViewConfiguration.get(c); - mTextPaint = new Paint(); - mTextPaint.setAntiAlias(true); - mTextPaint.setTextSize(10 - * getResources().getDisplayMetrics().density); - mTextPaint.setARGB(255, 0, 0, 0); - mTextBackgroundPaint = new Paint(); - mTextBackgroundPaint.setAntiAlias(false); - mTextBackgroundPaint.setARGB(128, 255, 255, 255); - mTextLevelPaint = new Paint(); - mTextLevelPaint.setAntiAlias(false); - mTextLevelPaint.setARGB(192, 255, 0, 0); - mPaint = new Paint(); - mPaint.setAntiAlias(true); - mPaint.setARGB(255, 255, 255, 255); - mPaint.setStyle(Paint.Style.STROKE); - mPaint.setStrokeWidth(2); - mTargetPaint = new Paint(); - mTargetPaint.setAntiAlias(false); - mTargetPaint.setARGB(255, 0, 0, 192); - mPathPaint = new Paint(); - mPathPaint.setAntiAlias(false); - mPathPaint.setARGB(255, 0, 96, 255); - mPaint.setStyle(Paint.Style.STROKE); - mPaint.setStrokeWidth(1); - - PointerState ps = new PointerState(); - ps.mVelocity = VelocityTracker.obtain(); - mPointers.add(ps); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - mTextPaint.getFontMetricsInt(mTextMetrics); - mHeaderBottom = -mTextMetrics.ascent+mTextMetrics.descent+2; - Log.i("foo", "Metrics: ascent=" + mTextMetrics.ascent - + " descent=" + mTextMetrics.descent - + " leading=" + mTextMetrics.leading - + " top=" + mTextMetrics.top - + " bottom=" + mTextMetrics.bottom); - } - - @Override - protected void onDraw(Canvas canvas) { - final int w = getWidth(); - final int itemW = w/7; - final int base = -mTextMetrics.ascent+1; - final int bottom = mHeaderBottom; - - final int NP = mPointers.size(); - - if (NP > 0) { - final PointerState ps = mPointers.get(0); - canvas.drawRect(0, 0, itemW-1, bottom,mTextBackgroundPaint); - canvas.drawText("P: " + mCurNumPointers + " / " + mMaxNumPointers, - 1, base, mTextPaint); - - final int N = ps.mXs.size(); - if ((mCurDown && ps.mCurDown) || N == 0) { - canvas.drawRect(itemW, 0, (itemW * 2) - 1, bottom, mTextBackgroundPaint); - canvas.drawText("X: " + ps.mCurX, 1 + itemW, base, mTextPaint); - canvas.drawRect(itemW * 2, 0, (itemW * 3) - 1, bottom, mTextBackgroundPaint); - canvas.drawText("Y: " + ps.mCurY, 1 + itemW * 2, base, mTextPaint); - } else { - float dx = ps.mXs.get(N-1) - ps.mXs.get(0); - float dy = ps.mYs.get(N-1) - ps.mYs.get(0); - canvas.drawRect(itemW, 0, (itemW * 2) - 1, bottom, - Math.abs(dx) < mVC.getScaledTouchSlop() - ? mTextBackgroundPaint : mTextLevelPaint); - canvas.drawText("dX: " + String.format("%.1f", dx), 1 + itemW, base, mTextPaint); - canvas.drawRect(itemW * 2, 0, (itemW * 3) - 1, bottom, - Math.abs(dy) < mVC.getScaledTouchSlop() - ? mTextBackgroundPaint : mTextLevelPaint); - canvas.drawText("dY: " + String.format("%.1f", dy), 1 + itemW * 2, base, mTextPaint); - } - - canvas.drawRect(itemW * 3, 0, (itemW * 4) - 1, bottom, mTextBackgroundPaint); - int velocity = ps.mVelocity == null ? 0 : (int) (ps.mVelocity.getXVelocity() * 1000); - canvas.drawText("Xv: " + velocity, 1 + itemW * 3, base, mTextPaint); - - canvas.drawRect(itemW * 4, 0, (itemW * 5) - 1, bottom, mTextBackgroundPaint); - velocity = ps.mVelocity == null ? 0 : (int) (ps.mVelocity.getYVelocity() * 1000); - canvas.drawText("Yv: " + velocity, 1 + itemW * 4, base, mTextPaint); - - canvas.drawRect(itemW * 5, 0, (itemW * 6) - 1, bottom, mTextBackgroundPaint); - canvas.drawRect(itemW * 5, 0, (itemW * 5) + (ps.mCurPressure * itemW) - 1, - bottom, mTextLevelPaint); - canvas.drawText("Prs: " + String.format("%.2f", ps.mCurPressure), 1 + itemW * 5, - base, mTextPaint); - - canvas.drawRect(itemW * 6, 0, w, bottom, mTextBackgroundPaint); - canvas.drawRect(itemW * 6, 0, (itemW * 6) + (ps.mCurSize * itemW) - 1, - bottom, mTextLevelPaint); - canvas.drawText("Size: " + String.format("%.2f", ps.mCurSize), 1 + itemW * 6, - base, mTextPaint); - } - - for (int p=0; p> MotionEvent.ACTION_POINTER_ID_SHIFT; - while (NP <= id) { - PointerState ps = new PointerState(); - ps.mVelocity = VelocityTracker.obtain(); - mPointers.add(ps); - NP++; - } - final PointerState ps = mPointers.get(id); - ps.mVelocity = VelocityTracker.obtain(); - ps.mCurDown = true; - Log.i("Pointer", "Pointer " + (id+1) + ": DOWN"); - } - - final int NI = event.getPointerCount(); - - mCurDown = action != MotionEvent.ACTION_UP - && action != MotionEvent.ACTION_CANCEL; - mCurNumPointers = mCurDown ? NI : 0; - if (mMaxNumPointers < mCurNumPointers) { - mMaxNumPointers = mCurNumPointers; - } - - for (int i=0; i> MotionEvent.ACTION_POINTER_ID_SHIFT; - final PointerState ps = mPointers.get(id); - ps.mXs.add(Float.NaN); - ps.mYs.add(Float.NaN); - ps.mCurDown = false; - Log.i("Pointer", "Pointer " + (id+1) + ": UP"); - } - - if (action == MotionEvent.ACTION_UP) { - for (int i=0; i