2021-06-27 20:44:35 +00:00
|
|
|
package androidx.constraintlayout.motion.widget;
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.res.TypedArray;
|
|
|
|
import android.graphics.RectF;
|
|
|
|
import android.util.AttributeSet;
|
|
|
|
import android.util.Log;
|
|
|
|
import android.util.SparseIntArray;
|
|
|
|
import android.view.View;
|
|
|
|
import android.view.ViewGroup;
|
|
|
|
import androidx.constraintlayout.widget.R;
|
|
|
|
import c.d.b.a.a;
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.HashSet;
|
|
|
|
public class KeyTrigger extends Key {
|
|
|
|
public static final int KEY_TYPE = 5;
|
|
|
|
public static final String NAME = "KeyTrigger";
|
|
|
|
private static final String TAG = "KeyTrigger";
|
|
|
|
public RectF mCollisionRect;
|
|
|
|
private String mCross = null;
|
|
|
|
private int mCurveFit = -1;
|
|
|
|
private Method mFireCross;
|
|
|
|
private boolean mFireCrossReset;
|
|
|
|
private float mFireLastPos;
|
|
|
|
private Method mFireNegativeCross;
|
|
|
|
private boolean mFireNegativeReset;
|
|
|
|
private Method mFirePositiveCross;
|
|
|
|
private boolean mFirePositiveReset;
|
|
|
|
private float mFireThreshold;
|
|
|
|
private String mNegativeCross;
|
|
|
|
private String mPositiveCross;
|
|
|
|
private boolean mPostLayout;
|
|
|
|
public RectF mTargetRect;
|
|
|
|
private int mTriggerCollisionId;
|
|
|
|
private View mTriggerCollisionView;
|
|
|
|
private int mTriggerID;
|
|
|
|
private int mTriggerReceiver;
|
|
|
|
public float mTriggerSlack;
|
|
|
|
|
|
|
|
public static class Loader {
|
|
|
|
private static final int COLLISION = 9;
|
|
|
|
private static final int CROSS = 4;
|
|
|
|
private static final int FRAME_POS = 8;
|
|
|
|
private static final int NEGATIVE_CROSS = 1;
|
|
|
|
private static final int POSITIVE_CROSS = 2;
|
|
|
|
private static final int POST_LAYOUT = 10;
|
|
|
|
private static final int TARGET_ID = 7;
|
|
|
|
private static final int TRIGGER_ID = 6;
|
|
|
|
private static final int TRIGGER_RECEIVER = 11;
|
|
|
|
private static final int TRIGGER_SLACK = 5;
|
|
|
|
private static SparseIntArray mAttrMap;
|
|
|
|
|
|
|
|
static {
|
|
|
|
SparseIntArray sparseIntArray = new SparseIntArray();
|
|
|
|
mAttrMap = sparseIntArray;
|
|
|
|
sparseIntArray.append(R.styleable.KeyTrigger_framePosition, 8);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_onCross, 4);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_onNegativeCross, 1);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_onPositiveCross, 2);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_motionTarget, 7);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_triggerId, 6);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_triggerSlack, 5);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_motion_triggerOnCollision, 9);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_motion_postLayoutCollision, 10);
|
|
|
|
mAttrMap.append(R.styleable.KeyTrigger_triggerReceiver, 11);
|
|
|
|
}
|
|
|
|
|
|
|
|
private Loader() {
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void read(KeyTrigger keyTrigger, TypedArray typedArray, Context context) {
|
|
|
|
int indexCount = typedArray.getIndexCount();
|
|
|
|
for (int i = 0; i < indexCount; i++) {
|
|
|
|
int index = typedArray.getIndex(i);
|
|
|
|
switch (mAttrMap.get(index)) {
|
|
|
|
case 1:
|
|
|
|
KeyTrigger.access$102(keyTrigger, typedArray.getString(index));
|
|
|
|
continue;
|
|
|
|
case 2:
|
|
|
|
KeyTrigger.access$202(keyTrigger, typedArray.getString(index));
|
|
|
|
continue;
|
|
|
|
case 4:
|
|
|
|
KeyTrigger.access$302(keyTrigger, typedArray.getString(index));
|
|
|
|
continue;
|
|
|
|
case 5:
|
|
|
|
keyTrigger.mTriggerSlack = typedArray.getFloat(index, keyTrigger.mTriggerSlack);
|
|
|
|
continue;
|
|
|
|
case 6:
|
|
|
|
KeyTrigger.access$402(keyTrigger, typedArray.getResourceId(index, KeyTrigger.access$400(keyTrigger)));
|
|
|
|
continue;
|
|
|
|
case 7:
|
|
|
|
if (MotionLayout.IS_IN_EDIT_MODE) {
|
|
|
|
int resourceId = typedArray.getResourceId(index, keyTrigger.mTargetId);
|
|
|
|
keyTrigger.mTargetId = resourceId;
|
|
|
|
if (resourceId == -1) {
|
|
|
|
keyTrigger.mTargetString = typedArray.getString(index);
|
|
|
|
} else {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
} else if (typedArray.peekValue(index).type == 3) {
|
|
|
|
keyTrigger.mTargetString = typedArray.getString(index);
|
|
|
|
} else {
|
|
|
|
keyTrigger.mTargetId = typedArray.getResourceId(index, keyTrigger.mTargetId);
|
|
|
|
}
|
|
|
|
case 8:
|
|
|
|
int integer = typedArray.getInteger(index, keyTrigger.mFramePosition);
|
|
|
|
keyTrigger.mFramePosition = integer;
|
|
|
|
KeyTrigger.access$002(keyTrigger, (((float) integer) + 0.5f) / 100.0f);
|
|
|
|
continue;
|
|
|
|
case 9:
|
|
|
|
KeyTrigger.access$502(keyTrigger, typedArray.getResourceId(index, KeyTrigger.access$500(keyTrigger)));
|
|
|
|
continue;
|
|
|
|
case 10:
|
|
|
|
KeyTrigger.access$602(keyTrigger, typedArray.getBoolean(index, KeyTrigger.access$600(keyTrigger)));
|
|
|
|
continue;
|
|
|
|
case 11:
|
|
|
|
KeyTrigger.access$702(keyTrigger, typedArray.getResourceId(index, KeyTrigger.access$700(keyTrigger)));
|
|
|
|
break;
|
|
|
|
}
|
2021-10-14 23:16:01 +00:00
|
|
|
StringBuilder O = a.O("unused attribute 0x");
|
|
|
|
O.append(Integer.toHexString(index));
|
|
|
|
O.append(" ");
|
|
|
|
O.append(mAttrMap.get(index));
|
|
|
|
Log.e("KeyTrigger", O.toString());
|
2021-06-27 20:44:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public KeyTrigger() {
|
|
|
|
int i = Key.UNSET;
|
|
|
|
this.mTriggerReceiver = i;
|
|
|
|
this.mNegativeCross = null;
|
|
|
|
this.mPositiveCross = null;
|
|
|
|
this.mTriggerID = i;
|
|
|
|
this.mTriggerCollisionId = i;
|
|
|
|
this.mTriggerCollisionView = null;
|
|
|
|
this.mTriggerSlack = 0.1f;
|
|
|
|
this.mFireCrossReset = true;
|
|
|
|
this.mFireNegativeReset = true;
|
|
|
|
this.mFirePositiveReset = true;
|
|
|
|
this.mFireThreshold = Float.NaN;
|
|
|
|
this.mPostLayout = false;
|
|
|
|
this.mCollisionRect = new RectF();
|
|
|
|
this.mTargetRect = new RectF();
|
|
|
|
this.mType = 5;
|
|
|
|
this.mCustomConstraints = new HashMap<>();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ float access$002(KeyTrigger keyTrigger, float f) {
|
|
|
|
keyTrigger.mFireThreshold = f;
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ String access$102(KeyTrigger keyTrigger, String str) {
|
|
|
|
keyTrigger.mNegativeCross = str;
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ String access$202(KeyTrigger keyTrigger, String str) {
|
|
|
|
keyTrigger.mPositiveCross = str;
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ String access$302(KeyTrigger keyTrigger, String str) {
|
|
|
|
keyTrigger.mCross = str;
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ int access$400(KeyTrigger keyTrigger) {
|
|
|
|
return keyTrigger.mTriggerID;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ int access$402(KeyTrigger keyTrigger, int i) {
|
|
|
|
keyTrigger.mTriggerID = i;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ int access$500(KeyTrigger keyTrigger) {
|
|
|
|
return keyTrigger.mTriggerCollisionId;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ int access$502(KeyTrigger keyTrigger, int i) {
|
|
|
|
keyTrigger.mTriggerCollisionId = i;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ boolean access$600(KeyTrigger keyTrigger) {
|
|
|
|
return keyTrigger.mPostLayout;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ boolean access$602(KeyTrigger keyTrigger, boolean z2) {
|
|
|
|
keyTrigger.mPostLayout = z2;
|
|
|
|
return z2;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ int access$700(KeyTrigger keyTrigger) {
|
|
|
|
return keyTrigger.mTriggerReceiver;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static /* synthetic */ int access$702(KeyTrigger keyTrigger, int i) {
|
|
|
|
keyTrigger.mTriggerReceiver = i;
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setUpRect(RectF rectF, View view, boolean z2) {
|
|
|
|
rectF.top = (float) view.getTop();
|
|
|
|
rectF.bottom = (float) view.getBottom();
|
|
|
|
rectF.left = (float) view.getLeft();
|
|
|
|
rectF.right = (float) view.getRight();
|
|
|
|
if (z2) {
|
|
|
|
view.getMatrix().mapRect(rectF);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
|
|
public void addValues(HashMap<String, SplineSet> hashMap) {
|
|
|
|
}
|
|
|
|
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:108:? A[ADDED_TO_REGION, RETURN, SYNTHETIC] */
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:36:0x008d */
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:41:0x00a2 */
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:47:0x00b7 */
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:54:0x00cf */
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:66:0x00fb */
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:73:0x011b A[SYNTHETIC, Splitter:B:73:0x011b] */
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:86:0x018c A[SYNTHETIC, Splitter:B:86:0x018c] */
|
|
|
|
/* JADX WARNING: Removed duplicated region for block: B:95:0x01f5 */
|
|
|
|
public void conditionallyFire(float f, View view) {
|
|
|
|
boolean z2;
|
|
|
|
boolean z3;
|
|
|
|
boolean z4;
|
|
|
|
boolean z5;
|
|
|
|
boolean z6;
|
|
|
|
boolean z7 = true;
|
|
|
|
if (this.mTriggerCollisionId != Key.UNSET) {
|
|
|
|
if (this.mTriggerCollisionView == null) {
|
|
|
|
this.mTriggerCollisionView = ((ViewGroup) view.getParent()).findViewById(this.mTriggerCollisionId);
|
|
|
|
}
|
|
|
|
setUpRect(this.mCollisionRect, this.mTriggerCollisionView, this.mPostLayout);
|
|
|
|
setUpRect(this.mTargetRect, view, this.mPostLayout);
|
|
|
|
if (this.mCollisionRect.intersect(this.mTargetRect)) {
|
|
|
|
if (this.mFireCrossReset) {
|
|
|
|
this.mFireCrossReset = false;
|
|
|
|
z4 = true;
|
|
|
|
} else {
|
|
|
|
z4 = false;
|
|
|
|
}
|
|
|
|
if (this.mFirePositiveReset) {
|
|
|
|
this.mFirePositiveReset = false;
|
|
|
|
z3 = true;
|
|
|
|
} else {
|
|
|
|
z3 = false;
|
|
|
|
}
|
|
|
|
this.mFireNegativeReset = true;
|
|
|
|
z2 = false;
|
|
|
|
this.mFireLastPos = f;
|
|
|
|
if (z2 || z4 || z3) {
|
|
|
|
((MotionLayout) view.getParent()).fireTrigger(this.mTriggerID, z3, f);
|
|
|
|
}
|
|
|
|
if (this.mTriggerReceiver != Key.UNSET) {
|
|
|
|
view = ((MotionLayout) view.getParent()).findViewById(this.mTriggerReceiver);
|
|
|
|
}
|
|
|
|
if (z2 && this.mNegativeCross != null) {
|
|
|
|
if (this.mFireNegativeCross == null) {
|
|
|
|
try {
|
|
|
|
this.mFireNegativeCross = view.getClass().getMethod(this.mNegativeCross, new Class[0]);
|
|
|
|
} catch (NoSuchMethodException unused) {
|
2021-10-14 23:16:01 +00:00
|
|
|
StringBuilder O = a.O("Could not find method \"");
|
|
|
|
O.append(this.mNegativeCross);
|
|
|
|
O.append("\"on class ");
|
|
|
|
O.append(view.getClass().getSimpleName());
|
|
|
|
O.append(" ");
|
|
|
|
O.append(Debug.getName(view));
|
|
|
|
Log.e("KeyTrigger", O.toString());
|
2021-06-27 20:44:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
this.mFireNegativeCross.invoke(view, new Object[0]);
|
|
|
|
}
|
|
|
|
if (z3 && this.mPositiveCross != null) {
|
|
|
|
if (this.mFirePositiveCross == null) {
|
|
|
|
try {
|
|
|
|
this.mFirePositiveCross = view.getClass().getMethod(this.mPositiveCross, new Class[0]);
|
|
|
|
} catch (NoSuchMethodException unused2) {
|
2021-10-14 23:16:01 +00:00
|
|
|
StringBuilder O2 = a.O("Could not find method \"");
|
|
|
|
O2.append(this.mPositiveCross);
|
|
|
|
O2.append("\"on class ");
|
|
|
|
O2.append(view.getClass().getSimpleName());
|
|
|
|
O2.append(" ");
|
|
|
|
O2.append(Debug.getName(view));
|
|
|
|
Log.e("KeyTrigger", O2.toString());
|
2021-06-27 20:44:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
this.mFirePositiveCross.invoke(view, new Object[0]);
|
|
|
|
}
|
|
|
|
if (!z4 && this.mCross != null) {
|
|
|
|
if (this.mFireCross == null) {
|
|
|
|
try {
|
|
|
|
this.mFireCross = view.getClass().getMethod(this.mCross, new Class[0]);
|
|
|
|
} catch (NoSuchMethodException unused3) {
|
2021-10-14 23:16:01 +00:00
|
|
|
StringBuilder O3 = a.O("Could not find method \"");
|
|
|
|
O3.append(this.mCross);
|
|
|
|
O3.append("\"on class ");
|
|
|
|
O3.append(view.getClass().getSimpleName());
|
|
|
|
O3.append(" ");
|
|
|
|
O3.append(Debug.getName(view));
|
|
|
|
Log.e("KeyTrigger", O3.toString());
|
2021-06-27 20:44:35 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
this.mFireCross.invoke(view, new Object[0]);
|
|
|
|
return;
|
|
|
|
} catch (Exception unused4) {
|
2021-10-14 23:16:01 +00:00
|
|
|
StringBuilder O4 = a.O("Exception in call \"");
|
|
|
|
O4.append(this.mCross);
|
|
|
|
O4.append("\"on class ");
|
|
|
|
O4.append(view.getClass().getSimpleName());
|
|
|
|
O4.append(" ");
|
|
|
|
O4.append(Debug.getName(view));
|
|
|
|
Log.e("KeyTrigger", O4.toString());
|
2021-06-27 20:44:35 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (!this.mFireCrossReset) {
|
|
|
|
this.mFireCrossReset = true;
|
|
|
|
z4 = true;
|
|
|
|
} else {
|
|
|
|
z4 = false;
|
|
|
|
}
|
|
|
|
if (this.mFireNegativeReset) {
|
|
|
|
this.mFireNegativeReset = false;
|
|
|
|
z6 = true;
|
|
|
|
} else {
|
|
|
|
z6 = false;
|
|
|
|
}
|
|
|
|
this.mFirePositiveReset = true;
|
|
|
|
z2 = z6;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (this.mFireCrossReset) {
|
|
|
|
float f2 = this.mFireThreshold;
|
|
|
|
if ((this.mFireLastPos - f2) * (f - f2) < 0.0f) {
|
|
|
|
this.mFireCrossReset = false;
|
|
|
|
z4 = true;
|
|
|
|
if (!this.mFireNegativeReset) {
|
|
|
|
float f3 = this.mFireThreshold;
|
|
|
|
float f4 = f - f3;
|
|
|
|
if ((this.mFireLastPos - f3) * f4 < 0.0f && f4 < 0.0f) {
|
|
|
|
this.mFireNegativeReset = false;
|
|
|
|
z5 = true;
|
|
|
|
if (this.mFirePositiveReset) {
|
|
|
|
float f5 = this.mFireThreshold;
|
|
|
|
float f6 = f - f5;
|
|
|
|
if ((this.mFireLastPos - f5) * f6 >= 0.0f || f6 <= 0.0f) {
|
|
|
|
z7 = false;
|
|
|
|
} else {
|
|
|
|
this.mFirePositiveReset = false;
|
|
|
|
}
|
|
|
|
z3 = z7;
|
|
|
|
z2 = z5;
|
|
|
|
this.mFireLastPos = f;
|
|
|
|
((MotionLayout) view.getParent()).fireTrigger(this.mTriggerID, z3, f);
|
|
|
|
if (this.mTriggerReceiver != Key.UNSET) {
|
|
|
|
}
|
|
|
|
if (this.mFireNegativeCross == null) {
|
|
|
|
}
|
|
|
|
this.mFireNegativeCross.invoke(view, new Object[0]);
|
|
|
|
if (this.mFirePositiveCross == null) {
|
|
|
|
}
|
|
|
|
this.mFirePositiveCross.invoke(view, new Object[0]);
|
|
|
|
if (!z4) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (Math.abs(f - this.mFireThreshold) > this.mTriggerSlack) {
|
|
|
|
this.mFirePositiveReset = true;
|
|
|
|
}
|
|
|
|
z2 = z5;
|
|
|
|
}
|
|
|
|
} else if (Math.abs(f - this.mFireThreshold) > this.mTriggerSlack) {
|
|
|
|
this.mFireNegativeReset = true;
|
|
|
|
}
|
|
|
|
z5 = false;
|
|
|
|
if (this.mFirePositiveReset) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (Math.abs(f - this.mFireThreshold) > this.mTriggerSlack) {
|
|
|
|
this.mFireCrossReset = true;
|
|
|
|
}
|
|
|
|
z4 = false;
|
|
|
|
if (!this.mFireNegativeReset) {
|
|
|
|
}
|
|
|
|
z5 = false;
|
|
|
|
if (this.mFirePositiveReset) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
z3 = false;
|
|
|
|
this.mFireLastPos = f;
|
|
|
|
((MotionLayout) view.getParent()).fireTrigger(this.mTriggerID, z3, f);
|
|
|
|
if (this.mTriggerReceiver != Key.UNSET) {
|
|
|
|
}
|
|
|
|
if (this.mFireNegativeCross == null) {
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
this.mFireNegativeCross.invoke(view, new Object[0]);
|
|
|
|
} catch (Exception unused5) {
|
2021-10-14 23:16:01 +00:00
|
|
|
StringBuilder O5 = a.O("Exception in call \"");
|
|
|
|
O5.append(this.mNegativeCross);
|
|
|
|
O5.append("\"on class ");
|
|
|
|
O5.append(view.getClass().getSimpleName());
|
|
|
|
O5.append(" ");
|
|
|
|
O5.append(Debug.getName(view));
|
|
|
|
Log.e("KeyTrigger", O5.toString());
|
2021-06-27 20:44:35 +00:00
|
|
|
}
|
|
|
|
if (this.mFirePositiveCross == null) {
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
this.mFirePositiveCross.invoke(view, new Object[0]);
|
|
|
|
} catch (Exception unused6) {
|
2021-10-14 23:16:01 +00:00
|
|
|
StringBuilder O6 = a.O("Exception in call \"");
|
|
|
|
O6.append(this.mPositiveCross);
|
|
|
|
O6.append("\"on class ");
|
|
|
|
O6.append(view.getClass().getSimpleName());
|
|
|
|
O6.append(" ");
|
|
|
|
O6.append(Debug.getName(view));
|
|
|
|
Log.e("KeyTrigger", O6.toString());
|
2021-06-27 20:44:35 +00:00
|
|
|
}
|
|
|
|
if (!z4) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
|
|
public void getAttributeNames(HashSet<String> hashSet) {
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getCurveFit() {
|
|
|
|
return this.mCurveFit;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
|
|
public void load(Context context, AttributeSet attributeSet) {
|
|
|
|
Loader.read(this, context.obtainStyledAttributes(attributeSet, R.styleable.KeyTrigger), context);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override // androidx.constraintlayout.motion.widget.Key
|
|
|
|
public void setValue(String str, Object obj) {
|
|
|
|
}
|
|
|
|
}
|