blob: 8681e23c80678162dfb9ac351319c66765db2a55 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.plugin.editing;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import io.flutter.Log;
import org.json.JSONException;
import org.json.JSONObject;
/// A representation of the change that occured to an editing state, along with the resulting
/// composing and selection regions.
public final class TextEditingDelta {
private @NonNull CharSequence oldText;
private @NonNull CharSequence deltaText;
private int deltaStart;
private int deltaEnd;
private int newSelectionStart;
private int newSelectionEnd;
private int newComposingStart;
private int newComposingEnd;
private static final String TAG = "TextEditingDelta";
public TextEditingDelta(
@NonNull CharSequence oldEditable,
int replacementDestinationStart,
int replacementDestinationEnd,
@NonNull CharSequence replacementSource,
int selectionStart,
int selectionEnd,
int composingStart,
int composingEnd) {
newSelectionStart = selectionStart;
newSelectionEnd = selectionEnd;
newComposingStart = composingStart;
newComposingEnd = composingEnd;
setDeltas(
oldEditable,
replacementSource.toString(),
replacementDestinationStart,
replacementDestinationEnd);
}
// Non text update delta constructor.
public TextEditingDelta(
@NonNull CharSequence oldText,
int selectionStart,
int selectionEnd,
int composingStart,
int composingEnd) {
newSelectionStart = selectionStart;
newSelectionEnd = selectionEnd;
newComposingStart = composingStart;
newComposingEnd = composingEnd;
setDeltas(oldText, "", -1, -1);
}
@VisibleForTesting
@NonNull
public CharSequence getOldText() {
return oldText;
}
@VisibleForTesting
@NonNull
public CharSequence getDeltaText() {
return deltaText;
}
@VisibleForTesting
public int getDeltaStart() {
return deltaStart;
}
@VisibleForTesting
public int getDeltaEnd() {
return deltaEnd;
}
@VisibleForTesting
public int getNewSelectionStart() {
return newSelectionStart;
}
@VisibleForTesting
public int getNewSelectionEnd() {
return newSelectionEnd;
}
@VisibleForTesting
public int getNewComposingStart() {
return newComposingStart;
}
@VisibleForTesting
public int getNewComposingEnd() {
return newComposingEnd;
}
private void setDeltas(
@NonNull CharSequence oldText, @NonNull CharSequence newText, int newStart, int newExtent) {
this.oldText = oldText;
deltaText = newText;
deltaStart = newStart;
deltaEnd = newExtent;
}
@NonNull
public JSONObject toJSON() {
JSONObject delta = new JSONObject();
try {
delta.put("oldText", oldText.toString());
delta.put("deltaText", deltaText.toString());
delta.put("deltaStart", deltaStart);
delta.put("deltaEnd", deltaEnd);
delta.put("selectionBase", newSelectionStart);
delta.put("selectionExtent", newSelectionEnd);
delta.put("composingBase", newComposingStart);
delta.put("composingExtent", newComposingEnd);
} catch (JSONException e) {
Log.e(TAG, "unable to create JSONObject: " + e);
}
return delta;
}
}