diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeyActivityEvent.java b/cmds/monkey/src/com/android/commands/monkey/MonkeyActivityEvent.java index 262377a9f..4661d8cc5 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeyActivityEvent.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeyActivityEvent.java @@ -22,7 +22,6 @@ import android.content.Intent; import android.os.Bundle; import android.os.RemoteException; import android.view.IWindowManager; -import android.util.Log; /** * monkey activity event @@ -57,7 +56,7 @@ public class MonkeyActivityEvent extends MonkeyEvent { public int injectEvent(IWindowManager iwm, IActivityManager iam, int verbose) { Intent intent = getEvent(); if (verbose > 0) { - System.out.println(":Switch: " + intent.toURI()); + System.out.println(":Switch: " + intent.toUri(0)); } if (mAlarmTime != 0){ @@ -75,7 +74,7 @@ public class MonkeyActivityEvent extends MonkeyEvent { } catch (SecurityException e) { if (verbose > 0) { System.out.println("** Permissions error starting activity " - + intent.toURI()); + + intent.toUri(0)); } return MonkeyEvent.INJECT_ERROR_SECURITY_EXCEPTION; } diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceNetwork.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceNetwork.java index a9a1db416..dbd616af1 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceNetwork.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceNetwork.java @@ -294,7 +294,7 @@ public class MonkeySourceNetwork implements MonkeyEventSource { // Convert the string to an array of KeyEvent's for // the built in keymap. KeyCharacterMap keyCharacterMap = KeyCharacterMap. - load(KeyCharacterMap.BUILT_IN_KEYBOARD); + load(KeyCharacterMap.VIRTUAL_KEYBOARD); KeyEvent[] events = keyCharacterMap.getEvents(chars); // enqueue all the events we just got. diff --git a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java index a2fa7326a..ab785632b 100644 --- a/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java +++ b/cmds/monkey/src/com/android/commands/monkey/MonkeySourceRandom.java @@ -48,7 +48,7 @@ public class MonkeySourceRandom implements MonkeyEventSource { private static final int[] SYS_KEYS = { KeyEvent.KEYCODE_HOME, KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_CALL, KeyEvent.KEYCODE_ENDCALL, - KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_DOWN, + KeyEvent.KEYCODE_VOLUME_UP, KeyEvent.KEYCODE_VOLUME_DOWN, KeyEvent.KEYCODE_VOLUME_MUTE, KeyEvent.KEYCODE_MUTE, }; /** If a physical key exists? */ diff --git a/samples/ApiDemos/AndroidManifest.xml b/samples/ApiDemos/AndroidManifest.xml index 361bf399d..b425eaa11 100644 --- a/samples/ApiDemos/AndroidManifest.xml +++ b/samples/ApiDemos/AndroidManifest.xml @@ -151,6 +151,14 @@ + + + + + + + @@ -1856,6 +1864,15 @@ + + + + + + + diff --git a/samples/ApiDemos/res/anim/animator_set.xml b/samples/ApiDemos/res/anim/animator_set.xml index 1358de4e6..cab24c532 100644 --- a/samples/ApiDemos/res/anim/animator_set.xml +++ b/samples/ApiDemos/res/anim/animator_set.xml @@ -24,7 +24,6 @@ android:repeatMode="reverse"/> + + + diff --git a/samples/ApiDemos/res/anim/object_animator.xml b/samples/ApiDemos/res/anim/object_animator.xml index ea84aa745..863d42353 100644 --- a/samples/ApiDemos/res/anim/object_animator.xml +++ b/samples/ApiDemos/res/anim/object_animator.xml @@ -16,7 +16,6 @@ + + + + + + + + + + + diff --git a/samples/ApiDemos/res/layout/drag_layout.xml b/samples/ApiDemos/res/layout/drag_layout.xml new file mode 100644 index 000000000..0dd193d03 --- /dev/null +++ b/samples/ApiDemos/res/layout/drag_layout.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/ApiDemos/res/values/attrs.xml b/samples/ApiDemos/res/values/attrs.xml index 53f0034e8..4654d7e87 100644 --- a/samples/ApiDemos/res/values/attrs.xml +++ b/samples/ApiDemos/res/values/attrs.xml @@ -32,4 +32,17 @@ + + + + + + + + + + + + diff --git a/samples/ApiDemos/res/values/strings.xml b/samples/ApiDemos/res/values/strings.xml index 02b6beda0..4eb54c2a9 100644 --- a/samples/ApiDemos/res/values/strings.xml +++ b/samples/ApiDemos/res/values/strings.xml @@ -80,6 +80,11 @@ App/Activity/Persistent State Demonstration of persistent activity state with getPreferences(0).edit() and getPreferences(0). + App/Activity/Recreate + Demonstration recreating an activity, to have + it reconstructed with significant new changes. In this case the theme is changed. + Recreate + App/Activity/Receive Result Pick a result to send, or BACK to cancel. Corky @@ -753,6 +758,12 @@ Cheese hunt Expand Iconify + + + Longpress on a dot to start a drag, then drop over another dot. The destination + dot will append the drag\'s textual conversion to the EditText. + + diff --git a/samples/ApiDemos/src/com/example/android/apis/animation/AnimationLoading.java b/samples/ApiDemos/src/com/example/android/apis/animation/AnimationLoading.java index ab5308be0..88df19fae 100644 --- a/samples/ApiDemos/src/com/example/android/apis/animation/AnimationLoading.java +++ b/samples/ApiDemos/src/com/example/android/apis/animation/AnimationLoading.java @@ -21,6 +21,7 @@ package com.example.android.apis.animation; import android.animation.AnimatorInflater; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.graphics.Color; import com.example.android.apis.R; import java.util.ArrayList; @@ -73,22 +74,21 @@ public class AnimationLoading extends Activity { public MyAnimationView(Context context) { super(context); - addBall(100, 0); - addBall(250, 0); - addBall(400, 0); + addBall(50, 50); + addBall(200, 50); + addBall(350, 50); + addBall(500, 50, Color.GREEN); } private void createAnimation() { if (animation == null) { - ObjectAnimator anim = - (ObjectAnimator) AnimatorInflater. - loadAnimator(getApplicationContext(), R.anim.object_animator); + ObjectAnimator anim = (ObjectAnimator) AnimatorInflater. + loadAnimator(getApplicationContext(), R.anim.object_animator); anim.addUpdateListener(this); anim.setTarget(balls.get(0)); - ValueAnimator fader = - (ValueAnimator) AnimatorInflater.loadAnimator(getApplicationContext(), - R.anim.animator); + ValueAnimator fader = (ValueAnimator) AnimatorInflater. + loadAnimator(getApplicationContext(), R.anim.animator); fader.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { balls.get(1).setAlpha((Float) animation.getAnimatedValue()); @@ -100,8 +100,12 @@ public class AnimationLoading extends Activity { R.anim.animator_set); seq.setTarget(balls.get(2)); + ObjectAnimator colorizer = (ObjectAnimator) AnimatorInflater. + loadAnimator(getApplicationContext(), R.anim.color_animator); + colorizer.setTarget(balls.get(3)); + animation = new AnimatorSet(); - ((AnimatorSet) animation).playTogether(anim, fader, seq); + ((AnimatorSet) animation).playTogether(anim, fader, seq, colorizer); } } @@ -110,25 +114,34 @@ public class AnimationLoading extends Activity { animation.start(); } - private ShapeHolder addBall(float x, float y) { + private ShapeHolder createBall(float x, float y) { OvalShape circle = new OvalShape(); circle.resize(BALL_SIZE, BALL_SIZE); ShapeDrawable drawable = new ShapeDrawable(circle); ShapeHolder shapeHolder = new ShapeHolder(drawable); shapeHolder.setX(x); shapeHolder.setY(y); + return shapeHolder; + } + + private void addBall(float x, float y, int color) { + ShapeHolder shapeHolder = createBall(x, y); + shapeHolder.setColor(color); + balls.add(shapeHolder); + } + + private void addBall(float x, float y) { + ShapeHolder shapeHolder = createBall(x, y); int red = (int)(100 + Math.random() * 155); int green = (int)(100 + Math.random() * 155); int blue = (int)(100 + Math.random() * 155); int color = 0xff000000 | red << 16 | green << 8 | blue; - Paint paint = drawable.getPaint(); + Paint paint = shapeHolder.getShape().getPaint(); int darkColor = 0xff000000 | red/4 << 16 | green/4 << 8 | blue/4; RadialGradient gradient = new RadialGradient(37.5f, 12.5f, 50f, color, darkColor, Shader.TileMode.CLAMP); paint.setShader(gradient); - shapeHolder.setPaint(paint); balls.add(shapeHolder); - return shapeHolder; } @Override diff --git a/samples/ApiDemos/src/com/example/android/apis/animation/ShapeHolder.java b/samples/ApiDemos/src/com/example/android/apis/animation/ShapeHolder.java index 22f88d3e0..2d406723c 100644 --- a/samples/ApiDemos/src/com/example/android/apis/animation/ShapeHolder.java +++ b/samples/ApiDemos/src/com/example/android/apis/animation/ShapeHolder.java @@ -63,6 +63,7 @@ public class ShapeHolder { return color; } public void setColor(int value) { + shape.getPaint().setColor(value); color = value; } public void setGradient(RadialGradient value) { diff --git a/samples/ApiDemos/src/com/example/android/apis/app/ActivityRecreate.java b/samples/ApiDemos/src/com/example/android/apis/app/ActivityRecreate.java new file mode 100644 index 000000000..4c112b3c4 --- /dev/null +++ b/samples/ApiDemos/src/com/example/android/apis/app/ActivityRecreate.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2010 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.example.android.apis.app; + +import com.example.android.apis.R; +import com.example.android.apis.app.LocalServiceActivities.Controller; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; + +public class ActivityRecreate extends Activity { + int mCurTheme; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState != null) { + mCurTheme = savedInstanceState.getInt("theme"); + + // Switch to a new theme different from last theme. + switch (mCurTheme) { + case android.R.style.Theme_Holo_Light: + mCurTheme = android.R.style.Theme_Holo_Dialog; + break; + case android.R.style.Theme_Holo_Dialog: + mCurTheme = android.R.style.Theme_Holo; + break; + default: + mCurTheme = android.R.style.Theme_Holo_Light; + break; + } + setTheme(mCurTheme); + } + + setContentView(R.layout.activity_recreate); + + // Watch for button clicks. + Button button = (Button)findViewById(R.id.recreate); + button.setOnClickListener(mRecreateListener); + } + + @Override + protected void onSaveInstanceState(Bundle savedInstanceState) { + super.onSaveInstanceState(savedInstanceState); + savedInstanceState.putInt("theme", mCurTheme); + } + + private OnClickListener mRecreateListener = new OnClickListener() { + public void onClick(View v) { + recreate(); + } + }; +} diff --git a/samples/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.java b/samples/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.java new file mode 100644 index 000000000..7e8c076e4 --- /dev/null +++ b/samples/ApiDemos/src/com/example/android/apis/view/DragAndDropDemo.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2010 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.example.android.apis.view; + +import com.example.android.apis.R; + +import android.app.Activity; +import android.os.Bundle; +import android.view.DragEvent; +import android.view.View; +import android.widget.TextView; + +public class DragAndDropDemo extends Activity { + TextView mResultText; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.drag_layout); + + TextView text = (TextView) findViewById(R.id.drag_text); + DraggableDot dot = (DraggableDot) findViewById(R.id.drag_dot_1); + dot.setReportView(text); + dot = (DraggableDot) findViewById(R.id.drag_dot_2); + dot.setReportView(text); + dot = (DraggableDot) findViewById(R.id.drag_dot_3); + dot.setReportView(text); + dot = (DraggableDot) findViewById(R.id.drag_dot_4); + dot.setReportView(text); + + mResultText = (TextView) findViewById(R.id.drag_result_text); + mResultText.setOnDragListener(new View.OnDragListener() { + @Override + public boolean onDrag(View v, DragEvent event) { + final int action = event.getAction(); + if (action == DragEvent.ACTION_DRAG_ENDED) { + final boolean dropped = event.getResult(); + mResultText.setText(dropped ? "Dropped!" : "No drop"); + } + return false; + } + }); + } +} \ No newline at end of file diff --git a/samples/ApiDemos/src/com/example/android/apis/view/DraggableDot.java b/samples/ApiDemos/src/com/example/android/apis/view/DraggableDot.java new file mode 100644 index 000000000..b715ba1a9 --- /dev/null +++ b/samples/ApiDemos/src/com/example/android/apis/view/DraggableDot.java @@ -0,0 +1,266 @@ +/* + * Copyright (C) 2010 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.example.android.apis.view; + +import com.example.android.apis.R; + +import android.content.ClipData; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.*; +import android.os.SystemClock; +import android.text.TextPaint; +import android.util.AttributeSet; +import android.util.Log; +import android.view.DragEvent; +import android.view.View; +import android.widget.TextView; + +public class DraggableDot extends View { + static final String TAG = "DraggableDot"; + + private boolean mDragInProgress; + private boolean mHovering; + private boolean mAcceptsDrag; + TextView mReportView; + + private Paint mPaint; + private TextPaint mLegendPaint; + private Paint mGlow; + private static final int NUM_GLOW_STEPS = 10; + private static final int GREEN_STEP = 0x0000FF00 / NUM_GLOW_STEPS; + private static final int WHITE_STEP = 0x00FFFFFF / NUM_GLOW_STEPS; + private static final int ALPHA_STEP = 0xFF000000 / NUM_GLOW_STEPS; + + int mRadius; + int mAnrType; + boolean mLocalOnly; + CharSequence mLegend; + + static final int ANR_NONE = 0; + static final int ANR_THUMBNAIL = 1; + static final int ANR_DROP = 2; + + void sleepSixSeconds() { + // hang forever; good for producing ANRs + long start = SystemClock.uptimeMillis(); + do { + try { Thread.sleep(1000); } catch (InterruptedException e) {} + } while (SystemClock.uptimeMillis() < start + 6000); + } + + // Thumbnail builder that can ANR if desired + class ANRThumbBuilder extends DragThumbnailBuilder { + boolean mDoAnr; + + public ANRThumbBuilder(View view, boolean doAnr) { + super(view); + mDoAnr = doAnr; + } + + @Override + public void onDrawThumbnail(Canvas canvas) { + if (mDoAnr) { + sleepSixSeconds(); + } + super.onDrawThumbnail(canvas); + } + } + + public DraggableDot(Context context, AttributeSet attrs) { + super(context, attrs); + + setFocusable(true); + setClickable(true); + + mLegend = ""; + + mPaint = new Paint(); + mPaint.setAntiAlias(true); + mPaint.setStrokeWidth(6); + mPaint.setColor(0xFFD00000); + + mLegendPaint = new TextPaint(); + mLegendPaint.setAntiAlias(true); + mLegendPaint.setTextAlign(Paint.Align.CENTER); + mLegendPaint.setColor(0xFFF0F0FF); + + mGlow = new Paint(); + mGlow.setAntiAlias(true); + mGlow.setStrokeWidth(1); + mGlow.setStyle(Paint.Style.STROKE); + + // look up any layout-defined attributes + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.DraggableDot); + + final int N = a.getIndexCount(); + for (int i = 0; i < N; i++) { + int attr = a.getIndex(i); + switch (attr) { + case R.styleable.DraggableDot_radius: { + mRadius = a.getDimensionPixelSize(attr, 0); + } break; + + case R.styleable.DraggableDot_legend: { + mLegend = a.getText(attr); + } break; + + case R.styleable.DraggableDot_anr: { + mAnrType = a.getInt(attr, 0); + } break; + + case R.styleable.DraggableDot_localOnly: { + mLocalOnly = a.getBoolean(attr, false); + } break; + } + } + + Log.i(TAG, "DraggableDot @ " + this + " : radius=" + mRadius + " legend='" + mLegend + + "' anr=" + mAnrType + " local=" + mLocalOnly); + + setOnLongClickListener(new View.OnLongClickListener() { + public boolean onLongClick(View v) { + ClipData data = ClipData.newPlainText("dot", null, "Dot : " + v.toString()); + v.startDrag(data, new ANRThumbBuilder(v, mAnrType == ANR_THUMBNAIL), + mLocalOnly, (Object)v); + return true; + } + }); + } + + void setReportView(TextView view) { + mReportView = view; + } + + @Override + protected void onDraw(Canvas canvas) { + float wf = getWidth(); + float hf = getHeight(); + final float cx = wf/2; + final float cy = hf/2; + wf -= getPaddingLeft() + getPaddingRight(); + hf -= getPaddingTop() + getPaddingBottom(); + float rad = (wf < hf) ? wf/2 : hf/2; + canvas.drawCircle(cx, cy, rad, mPaint); + + if (mLegend != null && mLegend.length() > 0) { + canvas.drawText(mLegend, 0, mLegend.length(), + cx, cy + mLegendPaint.getFontSpacing()/2, + mLegendPaint); + } + + // if we're in the middle of a drag, light up as a potential target + if (mDragInProgress && mAcceptsDrag) { + for (int i = NUM_GLOW_STEPS; i > 0; i--) { + int color = (mHovering) ? WHITE_STEP : GREEN_STEP; + color = i*(color | ALPHA_STEP); + mGlow.setColor(color); + canvas.drawCircle(cx, cy, rad, mGlow); + rad -= 0.5f; + canvas.drawCircle(cx, cy, rad, mGlow); + rad -= 0.5f; + } + } + } + + @Override + protected void onMeasure(int widthSpec, int heightSpec) { + int totalDiameter = 2*mRadius + getPaddingLeft() + getPaddingRight(); + setMeasuredDimension(totalDiameter, totalDiameter); + } + + /** + * Drag and drop + */ + @Override + public boolean onDragEvent(DragEvent event) { + boolean result = false; + switch (event.getAction()) { + case DragEvent.ACTION_DRAG_STARTED: { + // claim to accept any dragged content + Log.i(TAG, "Drag started, event=" + event); + // cache whether we accept the drag to return for LOCATION events + mDragInProgress = true; + mAcceptsDrag = result = true; + // Redraw in the new visual state if we are a potential drop target + if (mAcceptsDrag) { + invalidate(); + } + } break; + + case DragEvent.ACTION_DRAG_ENDED: { + Log.i(TAG, "Drag ended."); + if (mAcceptsDrag) { + invalidate(); + } + mDragInProgress = false; + mHovering = false; + } break; + + case DragEvent.ACTION_DRAG_LOCATION: { + // we returned true to DRAG_STARTED, so return true here + Log.i(TAG, "... seeing drag locations ..."); + result = mAcceptsDrag; + } break; + + case DragEvent.ACTION_DROP: { + Log.i(TAG, "Got a drop! dot=" + this + " event=" + event); + if (mAnrType == ANR_DROP) { + sleepSixSeconds(); + } + processDrop(event); + result = true; + } break; + + case DragEvent.ACTION_DRAG_ENTERED: { + Log.i(TAG, "Entered dot @ " + this); + mHovering = true; + invalidate(); + } break; + + case DragEvent.ACTION_DRAG_EXITED: { + Log.i(TAG, "Exited dot @ " + this); + mHovering = false; + invalidate(); + } break; + + default: + Log.i(TAG, "other drag event: " + event); + result = mAcceptsDrag; + break; + } + + return result; + } + + private void processDrop(DragEvent event) { + final ClipData data = event.getClipData(); + final int N = data.getItemCount(); + for (int i = 0; i < N; i++) { + ClipData.Item item = data.getItem(i); + Log.i(TAG, "Dropped item " + i + " : " + item); + if (mReportView != null) { + String text = item.coerceToText(getContext()).toString(); + if (event.getLocalState() == (Object) this) { + text += " : Dropped on self!"; + } + mReportView.setText(text); + } + } + } +} \ No newline at end of file