diff options
Diffstat (limited to 'java/src')
9 files changed, 125 insertions, 52 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index ba9cb1f1e..1ce61fbcc 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -888,10 +888,9 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack mDrawingHandler.dismissGestureFloatingPreviewText(mGestureFloatingPreviewTextLingerTimeout); } - public void showGesturePreviewTrail(final PointerTracker tracker, - final boolean isOldestTracker) { + public void showGesturePreviewTrail(final PointerTracker tracker) { locatePreviewPlacerView(); - mPreviewPlacerView.invalidatePointer(tracker, isOldestTracker); + mPreviewPlacerView.invalidatePointer(tracker); } // Note that this method is called from a non-UI thread. diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 036372c37..469076f59 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -83,7 +83,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { public void dismissKeyPreview(PointerTracker tracker); public void showSlidingKeyInputPreview(PointerTracker tracker); public void dismissSlidingKeyInputPreview(); - public void showGesturePreviewTrail(PointerTracker tracker, boolean isOldestTracker); + public void showGesturePreviewTrail(PointerTracker tracker); } public interface TimerProxy { @@ -709,8 +709,8 @@ public final class PointerTracker implements PointerTrackerQueue.Element { return sPointerTrackerQueue.size(); } - private static boolean isOldestTrackerInQueue(final PointerTracker tracker) { - return sPointerTrackerQueue.getOldestElement() == tracker; + public boolean isOldestTrackerInQueue() { + return sPointerTrackerQueue.getOldestElement() == this; } private void mayStartBatchInput(final Key key) { @@ -732,7 +732,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { dismissAllMoreKeysPanels(); } mTimerProxy.cancelLongPressTimer(); - mDrawingProxy.showGesturePreviewTrail(this, isOldestTrackerInQueue(this)); + mDrawingProxy.showGesturePreviewTrail(this); } public void updateBatchInputByTimer(final long eventTime) { @@ -748,7 +748,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (mIsTrackingCanceled) { return; } - mDrawingProxy.showGesturePreviewTrail(this, isOldestTrackerInQueue(this)); + mDrawingProxy.showGesturePreviewTrail(this); } private void updateBatchInput(final long eventTime) { @@ -789,7 +789,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { if (mIsTrackingCanceled) { return; } - mDrawingProxy.showGesturePreviewTrail(this, isOldestTrackerInQueue(this)); + mDrawingProxy.showGesturePreviewTrail(this); } private void cancelBatchInput() { diff --git a/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java b/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java index 501bde006..cf47b14b4 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java +++ b/java/src/com/android/inputmethod/keyboard/internal/AbstractDrawingPreview.java @@ -17,6 +17,7 @@ package com.android.inputmethod.keyboard.internal; import android.graphics.Canvas; +import android.view.View; import com.android.inputmethod.keyboard.PointerTracker; @@ -25,9 +26,18 @@ import com.android.inputmethod.keyboard.PointerTracker; * GestureFloatingPrevewText, GestureTrail, and SlidingKeyInputPreview. */ public abstract class AbstractDrawingPreview { + private final View mDrawingView; private boolean mPreviewEnabled; - public void setPreviewEnabled(final boolean enabled) { + protected AbstractDrawingPreview(final View drawingView) { + mDrawingView = drawingView; + } + + public final View getDrawingView() { + return mDrawingView; + } + + public final void setPreviewEnabled(final boolean enabled) { mPreviewEnabled = enabled; } @@ -35,6 +45,14 @@ public abstract class AbstractDrawingPreview { return mPreviewEnabled; } + public void setKeyboardGeometry(final int[] originCoords, final int width, final int height) { + // Default implementation is empty. + } + + public void onDetachFromWindow() { + // Default implementation is empty. + } + /** * Draws the preview * @param canvas The canvas where the preview is drawn. @@ -43,7 +61,7 @@ public abstract class AbstractDrawingPreview { /** * Set the position of the preview. - * @param pt The new location of the preview is based on the points in PointerTracker pt. + * @param tracker The new location of the preview is based on the points in PointerTracker. */ - public abstract void setPreviewPosition(final PointerTracker pt); + public abstract void setPreviewPosition(final PointerTracker tracker); } diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingPreviewText.java b/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingPreviewText.java index 2c5bb598d..e21f86d44 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingPreviewText.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureFloatingPreviewText.java @@ -16,7 +16,6 @@ package com.android.inputmethod.keyboard.internal; -import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; @@ -24,6 +23,7 @@ import android.graphics.Paint.Align; import android.graphics.Rect; import android.graphics.RectF; import android.text.TextUtils; +import android.view.View; import com.android.inputmethod.keyboard.PointerTracker; import com.android.inputmethod.latin.CoordinateUtils; @@ -98,16 +98,18 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { PREVIEW_TEXT_ARRAY_CAPACITY); protected SuggestedWords mSuggestedWords = SuggestedWords.EMPTY; - protected final Context mContext; public final int[] mLastPointerCoords = CoordinateUtils.newInstance(); - public GestureFloatingPreviewText(final TypedArray typedArray, final Context context) { + public GestureFloatingPreviewText(final View drawingView, final TypedArray typedArray) { + super(drawingView); mParams = new GesturePreviewTextParams(typedArray); mHighlightedWordIndex = 0; - mContext = context; } public void setSuggetedWords(final SuggestedWords suggestedWords) { + if (!isPreviewEnabled()) { + return; + } mSuggestedWords = suggestedWords; updatePreviewPosition(); } @@ -120,8 +122,13 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { } @Override - public void setPreviewPosition(final PointerTracker pt) { - pt.getLastCoordinates(mLastPointerCoords); + public void setPreviewPosition(final PointerTracker tracker) { + final boolean needsToUpdateLastPointer = + tracker.isOldestTrackerInQueue() && isPreviewEnabled(); + if (!needsToUpdateLastPointer) { + return; + } + tracker.getLastCoordinates(mLastPointerCoords); updatePreviewPosition(); } @@ -164,7 +171,7 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { final float rectWidth = textWidth + hPad * 2.0f; final float rectHeight = textHeight + vPad * 2.0f; - final int displayWidth = mContext.getResources().getDisplayMetrics().widthPixels; + final int displayWidth = getDrawingView().getResources().getDisplayMetrics().widthPixels; final float rectX = Math.min( Math.max(CoordinateUtils.x(mLastPointerCoords) - rectWidth / 2.0f, 0.0f), displayWidth - rectWidth); @@ -176,5 +183,7 @@ public class GestureFloatingPreviewText extends AbstractDrawingPreview { final int textY = (int)(rectY + vPad) + textHeight; mPreviewTextXArray.add(0, textX); mPreviewTextYArray.add(0, textY); + // TODO: Should narrow the invalidate region. + getDrawingView().invalidate(); } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java b/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java index d34474227..83a06cb48 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java +++ b/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java @@ -41,7 +41,7 @@ import com.android.inputmethod.latin.SuggestedWords; public final class PreviewPlacerView extends RelativeLayout { private final int[] mKeyboardViewOrigin = CoordinateUtils.newInstance(); - // TODO: Consolidate gesture preview trail with {@link KeyboardView} + // TODO: Separate gesture preview trail drawing code into separate class. private final SparseArray<GesturePreviewTrail> mGesturePreviewTrails = CollectionUtils.newSparseArray(); private final Params mGesturePreviewTrailParams; @@ -55,6 +55,7 @@ public final class PreviewPlacerView extends RelativeLayout { private final Rect mOffscreenSrcRect = new Rect(); private final Rect mDirtyRect = new Rect(); private final Rect mGesturePreviewTrailBoundsRect = new Rect(); // per trail + // TODO: Move these AbstractDrawingPvreiew objects to MainKeyboardView. private final GestureFloatingPreviewText mGestureFloatingPreviewText; private boolean mShowSlidingKeyInputPreview; private final int[] mRubberBandFrom = CoordinateUtils.newInstance(); @@ -104,7 +105,7 @@ public final class PreviewPlacerView extends RelativeLayout { attrs, R.styleable.MainKeyboardView, defStyle, R.style.MainKeyboardView); // TODO: mGestureFloatingPreviewText could be an instance of GestureFloatingPreviewText or // MultiGesturePreviewText, depending on the user's choice in the settings. - mGestureFloatingPreviewText = new GestureFloatingPreviewText(mainKeyboardViewAttr, context); + mGestureFloatingPreviewText = new GestureFloatingPreviewText(this, mainKeyboardViewAttr); mGesturePreviewTrailParams = new Params(mainKeyboardViewAttr); mainKeyboardViewAttr.recycle(); @@ -120,11 +121,14 @@ public final class PreviewPlacerView extends RelativeLayout { setLayerType(LAYER_TYPE_HARDWARE, layerPaint); } - public void setKeyboardViewGeometry(final int[] originCoords, final int w, final int h) { + public void setKeyboardViewGeometry(final int[] originCoords, final int width, + final int height) { CoordinateUtils.copy(mKeyboardViewOrigin, originCoords); - mOffscreenOffsetY = (int)(h * GestureStroke.EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO); - mOffscreenWidth = w; - mOffscreenHeight = mOffscreenOffsetY + h; + mGestureFloatingPreviewText.setKeyboardGeometry(originCoords, width, height); + mOffscreenOffsetY = (int)( + height * GestureStroke.EXTRA_GESTURE_TRAIL_AREA_ABOVE_KEYBOARD_RATIO); + mOffscreenWidth = width; + mOffscreenHeight = mOffscreenOffsetY + height; } public void setGesturePreviewMode(final boolean drawsGesturePreviewTrail, @@ -133,12 +137,8 @@ public final class PreviewPlacerView extends RelativeLayout { mGestureFloatingPreviewText.setPreviewEnabled(drawsGestureFloatingPreviewText); } - public void invalidatePointer(final PointerTracker tracker, final boolean isOldestTracker) { - final boolean needsToUpdateLastPointer = - isOldestTracker && mGestureFloatingPreviewText.isPreviewEnabled(); - if (needsToUpdateLastPointer) { - mGestureFloatingPreviewText.setPreviewPosition(tracker); - } + public void invalidatePointer(final PointerTracker tracker) { + mGestureFloatingPreviewText.setPreviewPosition(tracker); if (mDrawsGesturePreviewTrail) { GesturePreviewTrail trail; @@ -150,10 +150,8 @@ public final class PreviewPlacerView extends RelativeLayout { } } trail.addStroke(tracker.getGestureStrokeWithPreviewPoints(), tracker.getDownTime()); - } - // TODO: Should narrow the invalidate region. - if (mDrawsGesturePreviewTrail || needsToUpdateLastPointer) { + // TODO: Should narrow the invalidate region. invalidate(); } } @@ -175,6 +173,8 @@ public final class PreviewPlacerView extends RelativeLayout { @Override protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mGestureFloatingPreviewText.onDetachFromWindow(); freeOffscreenBuffer(); } @@ -254,9 +254,7 @@ public final class PreviewPlacerView extends RelativeLayout { } public void setGestureFloatingPreviewText(final SuggestedWords suggestedWords) { - if (!mGestureFloatingPreviewText.isPreviewEnabled()) return; mGestureFloatingPreviewText.setSuggetedWords(suggestedWords); - invalidate(); } private void drawSlidingKeyInputPreview(final Canvas canvas) { diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java index 5eab292fc..d725b9f14 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java @@ -25,6 +25,7 @@ import android.text.TextUtils; import android.util.Log; import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -162,9 +163,9 @@ public final class BinaryDictionaryFileDumper { InputStream inputStream = null; InputStream uncompressedStream = null; InputStream decryptedStream = null; - BufferedInputStream bufferedStream = null; + BufferedInputStream bufferedInputStream = null; File outputFile = null; - FileOutputStream outputStream = null; + BufferedOutputStream bufferedOutputStream = null; AssetFileDescriptor afd = null; final Uri wordListUri = wordListUriBuilder.build(); try { @@ -178,7 +179,6 @@ public final class BinaryDictionaryFileDumper { // Just to be sure, delete the file. This may fail silently, and return false: this // is the right thing to do, as we just want to continue anyway. outputFile.delete(); - outputStream = new FileOutputStream(outputFile); // Get the appropriate decryption method for this try switch (mode) { case COMPRESSED_CRYPTED_COMPRESSED: @@ -206,10 +206,11 @@ public final class BinaryDictionaryFileDumper { inputStream = originalSourceStream; break; } - bufferedStream = new BufferedInputStream(inputStream); - checkMagicAndCopyFileTo(bufferedStream, outputStream); - outputStream.flush(); - outputStream.close(); + bufferedInputStream = new BufferedInputStream(inputStream); + bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(outputFile)); + checkMagicAndCopyFileTo(bufferedInputStream, bufferedOutputStream); + bufferedOutputStream.flush(); + bufferedOutputStream.close(); final File finalFile = new File(finalFileName); finalFile.delete(); if (!outputFile.renameTo(finalFile)) { @@ -241,12 +242,12 @@ public final class BinaryDictionaryFileDumper { if (null != inputStream) inputStream.close(); if (null != uncompressedStream) uncompressedStream.close(); if (null != decryptedStream) decryptedStream.close(); - if (null != bufferedStream) bufferedStream.close(); + if (null != bufferedInputStream) bufferedInputStream.close(); } catch (Exception e) { Log.e(TAG, "Exception while closing a file descriptor : " + e); } try { - if (null != outputStream) outputStream.close(); + if (null != bufferedOutputStream) bufferedOutputStream.close(); } catch (Exception e) { Log.e(TAG, "Exception while closing a file : " + e); } @@ -301,9 +302,8 @@ public final class BinaryDictionaryFileDumper { * @param input the stream to be copied. * @param output an output stream to copy the data to. */ - // TODO: make output a BufferedOutputStream - private static void checkMagicAndCopyFileTo(final BufferedInputStream input, - final FileOutputStream output) throws FileNotFoundException, IOException { + public static void checkMagicAndCopyFileTo(final BufferedInputStream input, + final BufferedOutputStream output) throws FileNotFoundException, IOException { // Check the magic number final int length = MAGIC_NUMBER_VERSION_2.length; final byte[] magicNumberBuffer = new byte[length]; diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java index 83dabbede..ecb63e890 100644 --- a/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java +++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryGetter.java @@ -56,7 +56,7 @@ final class BinaryDictionaryGetter { private static final String COMMON_PREFERENCES_NAME = "LatinImeDictPrefs"; // Name of the category for the main dictionary - private static final String MAIN_DICTIONARY_CATEGORY = "main"; + public static final String MAIN_DICTIONARY_CATEGORY = "main"; public static final String ID_CATEGORY_SEPARATOR = ":"; // The key considered to read the version attribute in a dictionary file. diff --git a/java/src/com/android/inputmethod/latin/DebugSettings.java b/java/src/com/android/inputmethod/latin/DebugSettings.java index 905852a22..ad52adfa0 100644 --- a/java/src/com/android/inputmethod/latin/DebugSettings.java +++ b/java/src/com/android/inputmethod/latin/DebugSettings.java @@ -77,6 +77,7 @@ public final class DebugSettings extends PreferenceFragment public boolean onPreferenceClick(final Preference arg0) { ExternalDictionaryGetterForDebug.chooseAndInstallDictionary( getActivity()); + mServiceNeedsRestart = true; return true; } }); diff --git a/java/src/com/android/inputmethod/latin/ExternalDictionaryGetterForDebug.java b/java/src/com/android/inputmethod/latin/ExternalDictionaryGetterForDebug.java index 5f91d039e..03e87636e 100644 --- a/java/src/com/android/inputmethod/latin/ExternalDictionaryGetterForDebug.java +++ b/java/src/com/android/inputmethod/latin/ExternalDictionaryGetterForDebug.java @@ -21,12 +21,17 @@ import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Environment; +import android.util.Log; import com.android.inputmethod.latin.makedict.BinaryDictIOUtils; import com.android.inputmethod.latin.makedict.FormatSpec.FileHeader; import com.android.inputmethod.latin.makedict.UnsupportedFormatException; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Locale; @@ -121,13 +126,56 @@ public class ExternalDictionaryGetterForDebug { }).setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { - installFile(file, header); + installFile(context, file, header); dialog.dismiss(); } }).create().show(); } - private static void installFile(final File file, final FileHeader header) { - // TODO: actually install the dictionary + private static void installFile(final Context context, final File file, + final FileHeader header) { + BufferedOutputStream outputStream = null; + File tempFile = null; + try { + final String locale = + header.mDictionaryOptions.mAttributes.get(DICTIONARY_LOCALE_ATTRIBUTE); + // Create the id for a main dictionary for this locale + final String id = BinaryDictionaryGetter.MAIN_DICTIONARY_CATEGORY + + BinaryDictionaryGetter.ID_CATEGORY_SEPARATOR + locale; + final String finalFileName = + BinaryDictionaryGetter.getCacheFileName(id, locale, context); + final String tempFileName = BinaryDictionaryGetter.getTempFileName(id, context); + tempFile = new File(tempFileName); + tempFile.delete(); + outputStream = new BufferedOutputStream(new FileOutputStream(tempFile)); + final BufferedInputStream bufferedStream = new BufferedInputStream( + new FileInputStream(file)); + BinaryDictionaryFileDumper.checkMagicAndCopyFileTo(bufferedStream, outputStream); + outputStream.flush(); + final File finalFile = new File(finalFileName); + finalFile.delete(); + if (!tempFile.renameTo(finalFile)) { + throw new IOException("Can't move the file to its final name"); + } + } catch (IOException e) { + // There was an error: show a dialog + new AlertDialog.Builder(context) + .setTitle(R.string.error) + .setMessage(e.toString()) + .setPositiveButton(android.R.string.ok, new OnClickListener() { + @Override + public void onClick(final DialogInterface dialog, final int which) { + dialog.dismiss(); + } + }).create().show(); + return; + } finally { + try { + if (null != outputStream) outputStream.close(); + if (null != tempFile) tempFile.delete(); + } catch (IOException e) { + // Don't do anything + } + } } } |