diff options
| -rw-r--r-- | core/java/android/widget/TextView.java | 56 | ||||
| -rw-r--r-- | docs/html/guide/topics/ui/dialogs.jd | 17 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Bitmap.java | 50 | ||||
| -rw-r--r-- | graphics/java/android/graphics/BitmapFactory.java | 2 | ||||
| -rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 1 |
5 files changed, 101 insertions, 25 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index dabe7baf49cd..c87264a7534f 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -4448,7 +4448,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } hideControllers(); - + switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: /* @@ -5875,7 +5875,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * Return true iff there is a selection inside this text view. */ public boolean hasSelection() { - return getSelectionStart() != getSelectionEnd(); + final int selectionStart = getSelectionStart(); + final int selectionEnd = getSelectionEnd(); + + return selectionStart >= 0 && selectionStart != selectionEnd; } /** @@ -6539,7 +6542,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mShowCursor = SystemClock.uptimeMillis(); ensureEndedBatchEdit(); - + if (focused) { int selStart = getSelectionStart(); int selEnd = getSelectionEnd(); @@ -7068,7 +7071,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return false; } - if (mText.length() > 0 && getSelectionStart() >= 0) { + if (mText.length() > 0 && hasSelection()) { if (mText instanceof Editable && mInput != null) { return true; } @@ -7082,7 +7085,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return false; } - if (mText.length() > 0 && getSelectionStart() >= 0) { + if (mText.length() > 0 && hasSelection()) { return true; } @@ -7203,6 +7206,49 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int minOffset = selectionModifierCursorController.getMinTouchOffset(); int maxOffset = selectionModifierCursorController.getMaxTouchOffset(); + if (minOffset == maxOffset) { + int offset = Math.max(0, Math.min(minOffset, mTransformed.length())); + + // Tolerance, number of charaters around tapped position + final int range = 1; + final int max = mTransformed.length() - 1; + + // 'Smart' word selection: detect position between words + for (int i = -range; i <= range; i++) { + int index = offset + i; + if (index >= 0 && index <= max) { + if (Character.isSpaceChar(mTransformed.charAt(index))) { + // Select current space + selectionStart = index; + selectionEnd = selectionStart + 1; + + // Extend selection to maximum space range + while (selectionStart > 0 && + Character.isSpaceChar(mTransformed.charAt(selectionStart - 1))) { + selectionStart--; + } + while (selectionEnd < max && + Character.isSpaceChar(mTransformed.charAt(selectionEnd))) { + selectionEnd++; + } + + Selection.setSelection((Spannable) mText, selectionStart, selectionEnd); + return; + } + } + } + + // 'Smart' word selection: detect position at beginning or end of text. + if (offset <= range) { + Selection.setSelection((Spannable) mText, 0, 0); + return; + } + if (offset >= (max - range)) { + Selection.setSelection((Spannable) mText, max + 1, max + 1); + return; + } + } + long wordLimits = getWordLimitsAt(minOffset); if (wordLimits >= 0) { selectionStart = (int) (wordLimits >>> 32); diff --git a/docs/html/guide/topics/ui/dialogs.jd b/docs/html/guide/topics/ui/dialogs.jd index 74b544bb985a..d047b2d57753 100644 --- a/docs/html/guide/topics/ui/dialogs.jd +++ b/docs/html/guide/topics/ui/dialogs.jd @@ -472,18 +472,25 @@ public class NotificationTest extends Activity { progressDialog = new ProgressDialog(NotificationTest.this); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage("Loading..."); - progressThread = new ProgressThread(handler); - progressThread.start(); return progressDialog; default: return null; } } + @Override + protected void onPrepareDialog(int id, Dialog dialog) { + switch(id) { + case PROGRESS_DIALOG: + progressDialog.setProgress(0); + progressThread = new ProgressThread(handler); + progressThread.start(); + } + // Define the Handler that receives messages from the thread and update the progress final Handler handler = new Handler() { public void handleMessage(Message msg) { - int total = msg.getData().getInt("total"); + int total = msg.arg1; progressDialog.setProgress(total); if (total >= 100){ dismissDialog(PROGRESS_DIALOG); @@ -514,9 +521,7 @@ public class NotificationTest extends Activity { Log.e("ERROR", "Thread Interrupted"); } Message msg = mHandler.obtainMessage(); - Bundle b = new Bundle(); - b.putInt("total", total); - msg.setData(b); + msg.arg1 = total; mHandler.sendMessage(msg); total++; } diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index d9ee3ec700a8..9a19056dcdd0 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -446,28 +446,30 @@ public final class Bitmap implements Parcelable { Rect srcR = new Rect(x, y, x + width, y + height); RectF dstR = new RectF(0, 0, width, height); + final Config newConfig = source.getConfig() == Config.ARGB_8888 ? + Config.ARGB_8888 : Config.RGB_565; + if (m == null || m.isIdentity()) { - bitmap = createBitmap(neww, newh, - source.hasAlpha() ? Config.ARGB_8888 : Config.RGB_565); + bitmap = createBitmap(neww, newh, newConfig, source.hasAlpha()); paint = null; // not needed } else { - /* the dst should have alpha if the src does, or if our matrix - doesn't preserve rectness - */ - boolean hasAlpha = source.hasAlpha() || !m.rectStaysRect(); + final boolean transformed = !m.rectStaysRect(); + RectF deviceR = new RectF(); m.mapRect(deviceR, dstR); + neww = Math.round(deviceR.width()); newh = Math.round(deviceR.height()); - bitmap = createBitmap(neww, newh, hasAlpha ? Config.ARGB_8888 : Config.RGB_565); - if (hasAlpha) { - bitmap.eraseColor(0); - } + + bitmap = createBitmap(neww, newh, transformed ? Config.ARGB_8888 : newConfig, + transformed || source.hasAlpha()); + canvas.translate(-deviceR.left, -deviceR.top); canvas.concat(m); + paint = new Paint(); paint.setFilterBitmap(filter); - if (!m.rectStaysRect()) { + if (transformed) { paint.setAntiAlias(true); } } @@ -492,8 +494,30 @@ public final class Bitmap implements Parcelable { * @throws IllegalArgumentException if the width or height are <= 0 */ public static Bitmap createBitmap(int width, int height, Config config) { + return createBitmap(width, height, config, true); + } + + /** + * Returns a mutable bitmap with the specified width and height. Its + * initial density is as per {@link #getDensity}. + * + * @param width The width of the bitmap + * @param height The height of the bitmap + * @param config The bitmap config to create. + * @param hasAlpha If the bitmap is ARGB_8888 this flag can be used to mark the + * bitmap as opaque. Doing so will clear the bitmap in black + * instead of transparent. + * + * @throws IllegalArgumentException if the width or height are <= 0 + */ + private static Bitmap createBitmap(int width, int height, Config config, boolean hasAlpha) { Bitmap bm = nativeCreate(null, 0, width, width, height, config.nativeInt, true); - bm.eraseColor(0); // start with black/transparent pixels + if (config == Config.ARGB_8888 && !hasAlpha) { + bm.eraseColor(0xff000000); + nativeSetHasAlpha(bm.mNativeBitmap, hasAlpha); + } else { + bm.eraseColor(0); + } return bm; } @@ -1094,7 +1118,7 @@ public final class Bitmap implements Parcelable { private static native void nativePrepareToDraw(int nativeBitmap); private static native void nativeSetHasAlpha(int nBitmap, boolean hasAlpha); private static native boolean nativeSameAs(int nb0, int nb1); - + /* package */ final int ni() { return mNativeBitmap; } diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index 5dbbd70d2802..dc21a721a894 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -83,7 +83,7 @@ public class BitmapFactory { /** * The pixel density to use for the bitmap. This will always result * in the returned bitmap having a density set for it (see - * {@link Bitmap#setDensity(int) Bitmap.setDensity(int))}. In addition, + * {@link Bitmap#setDensity(int) Bitmap.setDensity(int)}). In addition, * if {@link #inScaled} is set (which it is by default} and this * density does not match {@link #inTargetDensity}, then the bitmap * will be scaled to the target density before being returned. diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 47ab35506cc5..f70bca74942a 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -133,6 +133,7 @@ void OpenGLRenderer::prepare() { glViewport(0, 0, mWidth, mHeight); + glDisable(GL_DITHER); glDisable(GL_SCISSOR_TEST); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |