From f795954e9a60575e624501ca49b691f95400b804 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Tue, 11 Oct 2011 11:38:53 +0200 Subject: [PATCH] Use Android SlidingTab for incoming call activity. --- .../jog_tab_bar_left_end_confirm_green.9.png | Bin 0 -> 5892 bytes .../jog_tab_bar_left_end_normal.9.png | Bin 0 -> 3952 bytes .../jog_tab_bar_left_end_pressed.9.png | Bin 0 -> 5656 bytes .../jog_tab_bar_right_end_confirm_red.9.png | Bin 0 -> 6029 bytes .../jog_tab_bar_right_end_normal.9.png | Bin 0 -> 3332 bytes .../jog_tab_bar_right_end_pressed.9.png | Bin 0 -> 5754 bytes .../jog_tab_left_confirm_green.png | Bin 0 -> 5039 bytes res/drawable-hdpi/jog_tab_left_normal.png | Bin 0 -> 4523 bytes res/drawable-hdpi/jog_tab_left_pressed.png | Bin 0 -> 4437 bytes .../jog_tab_right_confirm_red.png | Bin 0 -> 4684 bytes res/drawable-hdpi/jog_tab_right_normal.png | Bin 0 -> 4241 bytes res/drawable-hdpi/jog_tab_right_pressed.png | Bin 0 -> 4148 bytes res/drawable-hdpi/jog_tab_target_green.png | Bin 0 -> 1119 bytes res/drawable-hdpi/jog_tab_target_red.png | Bin 0 -> 1123 bytes res/drawable/jog_tab_bar_left_answer.xml | 28 + res/drawable/jog_tab_bar_right_decline.xml | 28 + res/drawable/jog_tab_left_answer.xml | 28 + res/drawable/jog_tab_right_decline.xml | 28 + res/layout/incoming.xml | 28 +- res/values/slidingtab_style.xml | 31 + src/org/linphone/IncomingCallActivity.java | 74 +- src/org/linphone/ui/SlidingTab.java | 844 ++++++++++++++++++ 22 files changed, 1046 insertions(+), 43 deletions(-) create mode 100644 res/drawable-hdpi/jog_tab_bar_left_end_confirm_green.9.png create mode 100644 res/drawable-hdpi/jog_tab_bar_left_end_normal.9.png create mode 100644 res/drawable-hdpi/jog_tab_bar_left_end_pressed.9.png create mode 100644 res/drawable-hdpi/jog_tab_bar_right_end_confirm_red.9.png create mode 100644 res/drawable-hdpi/jog_tab_bar_right_end_normal.9.png create mode 100644 res/drawable-hdpi/jog_tab_bar_right_end_pressed.9.png create mode 100644 res/drawable-hdpi/jog_tab_left_confirm_green.png create mode 100644 res/drawable-hdpi/jog_tab_left_normal.png create mode 100644 res/drawable-hdpi/jog_tab_left_pressed.png create mode 100644 res/drawable-hdpi/jog_tab_right_confirm_red.png create mode 100644 res/drawable-hdpi/jog_tab_right_normal.png create mode 100644 res/drawable-hdpi/jog_tab_right_pressed.png create mode 100644 res/drawable-hdpi/jog_tab_target_green.png create mode 100644 res/drawable-hdpi/jog_tab_target_red.png create mode 100644 res/drawable/jog_tab_bar_left_answer.xml create mode 100644 res/drawable/jog_tab_bar_right_decline.xml create mode 100644 res/drawable/jog_tab_left_answer.xml create mode 100644 res/drawable/jog_tab_right_decline.xml create mode 100644 res/values/slidingtab_style.xml create mode 100644 src/org/linphone/ui/SlidingTab.java diff --git a/res/drawable-hdpi/jog_tab_bar_left_end_confirm_green.9.png b/res/drawable-hdpi/jog_tab_bar_left_end_confirm_green.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7c4f40ea9dd2a772f7e01952d3d696c19a61a325 GIT binary patch literal 5892 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 Hu0mjfS_f)D literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/jog_tab_bar_right_end_normal.9.png b/res/drawable-hdpi/jog_tab_bar_right_end_normal.9.png new file mode 100644 index 0000000000000000000000000000000000000000..49ec1184fd04cec4e68670ab0b92bea85731296e GIT binary patch literal 3332 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/jog_tab_left_confirm_green.png b/res/drawable-hdpi/jog_tab_left_confirm_green.png new file mode 100644 index 0000000000000000000000000000000000000000..23acc95f1752db20993a7e978b9dc5b89f26906c GIT binary patch literal 5039 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 JPDHLkV1m5vQ#Jqq literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/jog_tab_left_pressed.png b/res/drawable-hdpi/jog_tab_left_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..86f49c685b6850fd743103ffd2a671c2f7c18d94 GIT binary patch literal 4437 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 blB4v0i0N9p=A%!W00000NkvXXu0mjfj8IT5 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/jog_tab_right_confirm_red.png b/res/drawable-hdpi/jog_tab_right_confirm_red.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0fa47540913ca35d02c7c3c8e4484fbc1b8abc GIT binary patch literal 4684 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/jog_tab_right_pressed.png b/res/drawable-hdpi/jog_tab_right_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..3d75c0d9be88a52b43d570dbd4d6e7990a804f12 GIT binary patch literal 4148 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 literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/jog_tab_target_red.png b/res/drawable-hdpi/jog_tab_target_red.png new file mode 100644 index 0000000000000000000000000000000000000000..8db20bb6333337df212eebe1623dbef6dfb58c56 GIT binary patch literal 1123 zcmV-p1f2VcP)z1^@s6u-S^R0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU$1xZ9fRCwC#na^(~0myI7u7S1JXSCYd^m?GoN`s_PxVOQ53v_Zc>?L&>DMhd&fwov0Q*UC-& zsh~=zUs1tk00*+VG5N+zuRK-UGhP_UZyk$*FmVzxR9a?v=4$EUJ70Wqe#Nn;vH9HH z0FJ!;%%Q2*kGyzX_kt~cy91%)K;$QhN{Rqk*Fnh*fTN1$duP7<{Ieg=eu`aZ`b|M^ zIePl=u~V-;J2@3D)iZYOCb)GI+*TX>_6qnb9q>?8_fW#~jf0OqUQi7qH(Oq4qyNHs zfZ_{cJ3{f2OAx4_51fo0;$-pQR581)VAYnA%rM)?_Yo4rpeRg5^|&p75bGhX4cX>&BO4AF%?p41F^}=8 zy(4&X|M19|jhWLNM_v**$vRql6VgWr2%`|lmtuT?v9NQl7qEAy(1+c20|FQ488ZjU zG!5Rn-BxD{dvH`TPNR#vZC7sF1K9jnzctul_+i$;?HFKi0?>3owDF@VMRHyU1Z<&Lhu72g%OY-yn`1=5iwGG9C6^fVfPu=4QRGJ$I45R8t)D%c1w5AdLu|| zNdjehP6t~X{Z7;0OKsCsR239i2GOn5`Csa?As_NxXqy!LazDWIH;bhuHIo5B5QQW_ zi1kG_ilW3mYQ_MHL9zM)=FeCEJa@@ksVitGbPa^2#aWTFpdj6%B&Z#21f5IhbII$} zDF($_>!|Q%Z&mkCKD2i*tEf0?86=d9nZ{CXOG%_ENg{>@O-***oSRBJ7$0tQn$DQEmH)1K z?ZF*`Lt=FBenY5=B;$0%ii2x-Tx%d1dUUq&cjN8Z?-#4>*2n1k?(H*Zqx*m!mZNkp zjBFj6Jod;F`F-1WW`;5YDs|SajyJzlwZ6K1u~jka)9F3%HOji18;zck(e%nJqV}K$ z(>~gYS5QBt3wjmhZ{|*>qN9dU_oa0z4r&=yOY2-VUnG9z&Hx55fB_6(00S7n00uCC p0SsUO0~o*n1~B0N1^7pR0RWZlvnGP#>^1-Z002ovPDHLkV1h~234{Ou literal 0 HcmV?d00001 diff --git a/res/drawable/jog_tab_bar_left_answer.xml b/res/drawable/jog_tab_bar_left_answer.xml new file mode 100644 index 000000000..32ce3dcda --- /dev/null +++ b/res/drawable/jog_tab_bar_left_answer.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/res/drawable/jog_tab_bar_right_decline.xml b/res/drawable/jog_tab_bar_right_decline.xml new file mode 100644 index 000000000..83183ac1b --- /dev/null +++ b/res/drawable/jog_tab_bar_right_decline.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/res/drawable/jog_tab_left_answer.xml b/res/drawable/jog_tab_left_answer.xml new file mode 100644 index 000000000..18ec7fa15 --- /dev/null +++ b/res/drawable/jog_tab_left_answer.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/res/drawable/jog_tab_right_decline.xml b/res/drawable/jog_tab_right_decline.xml new file mode 100644 index 000000000..a3bca5e92 --- /dev/null +++ b/res/drawable/jog_tab_right_decline.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/res/layout/incoming.xml b/res/layout/incoming.xml index 1f3d8277f..401c254d0 100644 --- a/res/layout/incoming.xml +++ b/res/layout/incoming.xml @@ -4,7 +4,8 @@ android:layout_width="fill_parent" android:layout_height="fill_parent"> - @@ -12,7 +13,8 @@ + android:layout_below="@id/incoming_text" + android:layout_centerHorizontal="true" android:paddingTop="30dip"> - - - - + diff --git a/res/values/slidingtab_style.xml b/res/values/slidingtab_style.xml new file mode 100644 index 000000000..81c1693f6 --- /dev/null +++ b/res/values/slidingtab_style.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/org/linphone/IncomingCallActivity.java b/src/org/linphone/IncomingCallActivity.java index 540302b83..e21727c60 100644 --- a/src/org/linphone/IncomingCallActivity.java +++ b/src/org/linphone/IncomingCallActivity.java @@ -24,6 +24,8 @@ import org.linphone.core.LinphoneAddress; import org.linphone.core.LinphoneCall; import org.linphone.core.Log; import org.linphone.core.LinphoneCall.State; +import org.linphone.ui.SlidingTab; +import org.linphone.ui.SlidingTab.OnTriggerListener; import android.app.Activity; import android.content.Intent; @@ -32,7 +34,6 @@ import android.os.Bundle; import android.view.KeyEvent; import android.view.View; import android.view.WindowManager; -import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; @@ -43,13 +44,14 @@ import android.widget.Toast; * * @author Guillaume Beraudo */ -public class IncomingCallActivity extends Activity implements OnClickListener, LinphoneManagerReadyListener, LinphoneOnCallStateChangedListener { +public class IncomingCallActivity extends Activity implements LinphoneManagerReadyListener, LinphoneOnCallStateChangedListener, OnTriggerListener { private TextView mNameView; private TextView mNumberView; private ImageView mPictureView; private LinphoneCall mCall; - private LinphoneManagerWaitHelper helper; + private LinphoneManagerWaitHelper mHelper; + private SlidingTab mIncomingCallWidget; private void findIncomingCall(Intent intent) { String stringUri = intent.getStringExtra("stringUri"); @@ -68,15 +70,24 @@ public class IncomingCallActivity extends Activity implements OnClickListener, L mNumberView = (TextView) findViewById(R.id.incoming_caller_number); mPictureView = (ImageView) findViewById(R.id.incoming_picture); - findViewById(R.id.Decline).setOnClickListener(this); - findViewById(R.id.Answer).setOnClickListener(this); - // set this flag so this activity will stay in front of the keyguard int flags = WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; flags |= WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; getWindow().addFlags(flags); - helper = new LinphoneManagerWaitHelper(this, this); + + // "Dial-to-answer" widget for incoming calls. + mIncomingCallWidget = (SlidingTab) findViewById(R.id.sliding_widget); + + // For now, we only need to show two states: answer and decline. + // TODO: make left hint work +// mIncomingCallWidget.setLeftHintText(R.string.slide_to_answer_hint); +// mIncomingCallWidget.setRightHintText(R.string.slide_to_decline_hint); + + mIncomingCallWidget.setOnTriggerListener(this); + + + mHelper = new LinphoneManagerWaitHelper(this, this); super.onCreate(savedInstanceState); } @@ -108,7 +119,7 @@ public class IncomingCallActivity extends Activity implements OnClickListener, L @Override protected void onResume() { super.onResume(); - helper.doManagerDependentOnResume(); + mHelper.doManagerDependentOnResume(); } @Override @@ -126,24 +137,6 @@ public class IncomingCallActivity extends Activity implements OnClickListener, L return super.onKeyDown(keyCode, event); } - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.Answer: - if (!LinphoneManager.getInstance().acceptCall(mCall)) { - // the above method takes care of Samsung Galaxy S - Toast.makeText(this, R.string.couldnt_accept_call, Toast.LENGTH_LONG); - } - break; - case R.id.Decline: - LinphoneManager.getLc().terminateCall(mCall); - break; - default: - throw new RuntimeException(); - } - finish(); - } - @Override public void onCallStateChanged(LinphoneCall call, State state, String msg) { if (call == mCall && State.CallEnd == state) { @@ -151,4 +144,33 @@ public class IncomingCallActivity extends Activity implements OnClickListener, L } } + private void decline() { + LinphoneManager.getLc().terminateCall(mCall); + } + private void answer() { + if (!LinphoneManager.getInstance().acceptCall(mCall)) { + // the above method takes care of Samsung Galaxy S + Toast.makeText(this, R.string.couldnt_accept_call, Toast.LENGTH_LONG); + } + } + @Override + public void onGrabbedStateChange(View v, int grabbedState) { + } + + @Override + public void onTrigger(View v, int whichHandle) { + switch (whichHandle) { + case OnTriggerListener.LEFT_HANDLE: + answer(); + finish(); + break; + case OnTriggerListener.RIGHT_HANDLE: + decline(); + finish(); + break; + default: + break; + } + } + } diff --git a/src/org/linphone/ui/SlidingTab.java b/src/org/linphone/ui/SlidingTab.java new file mode 100644 index 000000000..c58670e39 --- /dev/null +++ b/src/org/linphone/ui/SlidingTab.java @@ -0,0 +1,844 @@ +/* + * Derived from Android "SlidingTab" source. + * Copyright (C) 2009 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 org.linphone.ui; + + +import org.linphone.R; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Vibrator; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.LinearInterpolator; +import android.view.animation.TranslateAnimation; +import android.view.animation.Animation.AnimationListener; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.ImageView.ScaleType; + +/** + * A special widget containing two Sliders and a threshold for each. Moving either slider beyond + * the threshold will cause the registered OnTriggerListener.onTrigger() to be called with + * whichHandle being {@link OnTriggerListener#LEFT_HANDLE} or {@link OnTriggerListener#RIGHT_HANDLE} + * Equivalently, selecting a tab will result in a call to + * {@link OnTriggerListener#onGrabbedStateChange(View, int)} with one of these two states. Releasing + * the tab will result in whichHandle being {@link OnTriggerListener#NO_HANDLE}. + * + */ +public class SlidingTab extends ViewGroup { + private static final String LOG_TAG = "SlidingTab"; + private static final int HORIZONTAL = 0; // as defined in attrs.xml + private static final int VERTICAL = 1; + + // TODO: Make these configurable + private static final float THRESHOLD = 2.0f / 3.0f; + private static final long VIBRATE_SHORT = 30; + private static final long VIBRATE_LONG = 40; + private static final int TRACKING_MARGIN = 50; + private static final int ANIM_DURATION = 250; // Time for most animations (in ms) + private static final int ANIM_TARGET_TIME = 500; // Time to show targets (in ms) + private boolean mHoldLeftOnTransition = false; + private boolean mHoldRightOnTransition = false; + + private OnTriggerListener mOnTriggerListener; + private int mGrabbedState = OnTriggerListener.NO_HANDLE; + private boolean mTriggered = false; + private Vibrator mVibrator; + + /** + * Either {@link #HORIZONTAL} or {@link #VERTICAL}. + */ + private int mOrientation; + + private Slider mLeftSlider; + private Slider mRightSlider; + private Slider mCurrentSlider; + private boolean mTracking; + private float mThreshold; + private Slider mOtherSlider; + private boolean mAnimating; + private Rect mTmpRect; + + /** + * Listener used to reset the view when the current animation completes. + */ + private final AnimationListener mAnimationDoneListener = new AnimationListener() { + public void onAnimationStart(Animation animation) { + + } + + public void onAnimationRepeat(Animation animation) { + + } + + public void onAnimationEnd(Animation animation) { + onAnimationDone(); + } + }; + + /** + * Interface definition for a callback to be invoked when a tab is triggered + * by moving it beyond a threshold. + */ + public interface OnTriggerListener { + /** + * The interface was triggered because the user let go of the handle without reaching the + * threshold. + */ + public static final int NO_HANDLE = 0; + + /** + * The interface was triggered because the user grabbed the left handle and moved it past + * the threshold. + */ + public static final int LEFT_HANDLE = 1; + + /** + * The interface was triggered because the user grabbed the right handle and moved it past + * the threshold. + */ + public static final int RIGHT_HANDLE = 2; + + /** + * Called when the user moves a handle beyond the threshold. + * + * @param v The view that was triggered. + * @param whichHandle Which "dial handle" the user grabbed, + * either {@link #LEFT_HANDLE}, {@link #RIGHT_HANDLE}. + */ + void onTrigger(View v, int whichHandle); + + /** + * Called when the "grabbed state" changes (i.e. when the user either grabs or releases + * one of the handles.) + * + * @param v the view that was triggered + * @param grabbedState the new state: {@link #NO_HANDLE}, {@link #LEFT_HANDLE}, + * or {@link #RIGHT_HANDLE}. + */ + void onGrabbedStateChange(View v, int grabbedState); + } + + /** + * Simple container class for all things pertinent to a slider. + * A slider consists of 3 Views: + * + * {@link #tab} is the tab shown on the screen in the default state. + * {@link #text} is the view revealed as the user slides the tab out. + * {@link #target} is the target the user must drag the slider past to trigger the slider. + * + */ + private static class Slider { + /** + * Tab alignment - determines which side the tab should be drawn on + */ + public static final int ALIGN_LEFT = 0; + public static final int ALIGN_RIGHT = 1; + public static final int ALIGN_TOP = 2; + public static final int ALIGN_BOTTOM = 3; + public static final int ALIGN_UNKNOWN = 4; + + /** + * States for the view. + */ + private static final int STATE_NORMAL = 0; + private static final int STATE_PRESSED = 1; + private static final int STATE_ACTIVE = 2; + + private final ImageView tab; + private final TextView text; + private final ImageView target; + private int currentState = STATE_NORMAL; + private int alignment = ALIGN_UNKNOWN; + private int alignment_value; + + /** + * Constructor + * + * @param parent the container view of this one + * @param tabId drawable for the tab + * @param barId drawable for the bar + * @param targetId drawable for the target + */ + Slider(ViewGroup parent, int iconId, int tabId, int barId, int targetId) { + // Create tab + tab = new ImageView(parent.getContext()); + tab.setImageResource(iconId); + tab.setBackgroundResource(tabId); + tab.setScaleType(ScaleType.CENTER); + tab.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT)); + + // Create hint TextView + text = new TextView(parent.getContext()); + text.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.FILL_PARENT)); + text.setBackgroundResource(barId); + text.setTextAppearance(parent.getContext(), R.style.TextAppearance_SlidingTabNormal); + // hint.setSingleLine(); // Hmm.. this causes the text to disappear off-screen + + // Create target + target = new ImageView(parent.getContext()); + target.setImageResource(targetId); + target.setScaleType(ScaleType.CENTER); + target.setLayoutParams( + new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + target.setVisibility(View.INVISIBLE); + + parent.addView(target); // this needs to be first - relies on painter's algorithm + parent.addView(tab); + parent.addView(text); + } + + void setIcon(int iconId) { + tab.setImageResource(iconId); + } + + void setTabBackgroundResource(int tabId) { + tab.setBackgroundResource(tabId); + } + + void setBarBackgroundResource(int barId) { + text.setBackgroundResource(barId); + } + + void setHintText(int resId) { + text.setText(resId); + } + + void hide() { + boolean horiz = alignment == ALIGN_LEFT || alignment == ALIGN_RIGHT; + int dx = horiz ? (alignment == ALIGN_LEFT ? alignment_value - tab.getRight() + : alignment_value - tab.getLeft()) : 0; + int dy = horiz ? 0 : (alignment == ALIGN_TOP ? alignment_value - tab.getBottom() + : alignment_value - tab.getTop()); + + Animation trans = new TranslateAnimation(0, dx, 0, dy); + trans.setDuration(ANIM_DURATION); + trans.setFillAfter(true); + tab.startAnimation(trans); + text.startAnimation(trans); + target.setVisibility(View.INVISIBLE); + } + + void show(boolean animate) { + text.setVisibility(View.VISIBLE); + tab.setVisibility(View.VISIBLE); + //target.setVisibility(View.INVISIBLE); + if (animate) { + boolean horiz = alignment == ALIGN_LEFT || alignment == ALIGN_RIGHT; + int dx = horiz ? (alignment == ALIGN_LEFT ? tab.getWidth() : -tab.getWidth()) : 0; + int dy = horiz ? 0: (alignment == ALIGN_TOP ? tab.getHeight() : -tab.getHeight()); + + Animation trans = new TranslateAnimation(-dx, 0, -dy, 0); + trans.setDuration(ANIM_DURATION); + tab.startAnimation(trans); + text.startAnimation(trans); + } + } + + void setState(int state) { + text.setPressed(state == STATE_PRESSED); + tab.setPressed(state == STATE_PRESSED); + if (state == STATE_ACTIVE) { + final int[] activeState = new int[] {android.R.attr.state_active}; + if (text.getBackground().isStateful()) { + text.getBackground().setState(activeState); + } + if (tab.getBackground().isStateful()) { + tab.getBackground().setState(activeState); + } + text.setTextAppearance(text.getContext(), R.style.TextAppearance_SlidingTabActive); + } else { + text.setTextAppearance(text.getContext(), R.style.TextAppearance_SlidingTabNormal); + } + currentState = state; + } + + void showTarget() { + AlphaAnimation alphaAnim = new AlphaAnimation(0.0f, 1.0f); + alphaAnim.setDuration(ANIM_TARGET_TIME); + target.startAnimation(alphaAnim); + target.setVisibility(View.VISIBLE); + } + + void reset(boolean animate) { + setState(STATE_NORMAL); + text.setVisibility(View.VISIBLE); + text.setTextAppearance(text.getContext(), R.style.TextAppearance_SlidingTabNormal); + tab.setVisibility(View.VISIBLE); + target.setVisibility(View.INVISIBLE); + final boolean horiz = alignment == ALIGN_LEFT || alignment == ALIGN_RIGHT; + int dx = horiz ? (alignment == ALIGN_LEFT ? alignment_value - tab.getLeft() + : alignment_value - tab.getRight()) : 0; + int dy = horiz ? 0 : (alignment == ALIGN_TOP ? alignment_value - tab.getTop() + : alignment_value - tab.getBottom()); + if (animate) { + TranslateAnimation trans = new TranslateAnimation(0, dx, 0, dy); + trans.setDuration(ANIM_DURATION); + trans.setFillAfter(false); + text.startAnimation(trans); + tab.startAnimation(trans); + } else { + if (horiz) { + text.offsetLeftAndRight(dx); + tab.offsetLeftAndRight(dx); + } else { + text.offsetTopAndBottom(dy); + tab.offsetTopAndBottom(dy); + } + text.clearAnimation(); + tab.clearAnimation(); + target.clearAnimation(); + } + } + + void setTarget(int targetId) { + target.setImageResource(targetId); + } + + /** + * Layout the given widgets within the parent. + * + * @param l the parent's left border + * @param t the parent's top border + * @param r the parent's right border + * @param b the parent's bottom border + * @param alignment which side to align the widget to + */ + void layout(int l, int t, int r, int b, int alignment) { + this.alignment = alignment; + final Drawable tabBackground = tab.getBackground(); + final int handleWidth = tabBackground.getIntrinsicWidth(); + final int handleHeight = tabBackground.getIntrinsicHeight(); + final Drawable targetDrawable = target.getDrawable(); + final int targetWidth = targetDrawable.getIntrinsicWidth(); + final int targetHeight = targetDrawable.getIntrinsicHeight(); + final int parentWidth = r - l; + final int parentHeight = b - t; + + final int leftTarget = (int) (THRESHOLD * parentWidth) - targetWidth + handleWidth / 2; + final int rightTarget = (int) ((1.0f - THRESHOLD) * parentWidth) - handleWidth / 2; + final int left = (parentWidth - handleWidth) / 2; + final int right = left + handleWidth; + + if (alignment == ALIGN_LEFT || alignment == ALIGN_RIGHT) { + // horizontal + final int targetTop = (parentHeight - targetHeight) / 2; + final int targetBottom = targetTop + targetHeight; + final int top = (parentHeight - handleHeight) / 2; + final int bottom = (parentHeight + handleHeight) / 2; + if (alignment == ALIGN_LEFT) { + tab.layout(0, top, handleWidth, bottom); + text.layout(0 - parentWidth, top, 0, bottom); + text.setGravity(Gravity.RIGHT); + target.layout(leftTarget, targetTop, leftTarget + targetWidth, targetBottom); + alignment_value = l; + } else { + tab.layout(parentWidth - handleWidth, top, parentWidth, bottom); + text.layout(parentWidth, top, parentWidth + parentWidth, bottom); + target.layout(rightTarget, targetTop, rightTarget + targetWidth, targetBottom); + text.setGravity(Gravity.TOP); + alignment_value = r; + } + } else { + // vertical + final int targetLeft = (parentWidth - targetWidth) / 2; + final int targetRight = (parentWidth + targetWidth) / 2; + final int top = (int) (THRESHOLD * parentHeight) + handleHeight / 2 - targetHeight; + final int bottom = (int) ((1.0f - THRESHOLD) * parentHeight) - handleHeight / 2; + if (alignment == ALIGN_TOP) { + tab.layout(left, 0, right, handleHeight); + text.layout(left, 0 - parentHeight, right, 0); + target.layout(targetLeft, top, targetRight, top + targetHeight); + alignment_value = t; + } else { + tab.layout(left, parentHeight - handleHeight, right, parentHeight); + text.layout(left, parentHeight, right, parentHeight + parentHeight); + target.layout(targetLeft, bottom, targetRight, bottom + targetHeight); + alignment_value = b; + } + } + } + + public void updateDrawableStates() { + setState(currentState); + } + + /** + * Ensure all the dependent widgets are measured. + */ + public void measure() { + tab.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + text.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + } + + /** + * Get the measured tab width. Must be called after {@link Slider#measure()}. + * @return + */ + public int getTabWidth() { + return tab.getMeasuredWidth(); + } + + /** + * Get the measured tab width. Must be called after {@link Slider#measure()}. + * @return + */ + public int getTabHeight() { + return tab.getMeasuredHeight(); + } + + /** + * Start animating the slider. Note we need two animations since an Animator + * keeps internal state of the invalidation region which is just the view being animated. + * + * @param anim1 + * @param anim2 + */ + public void startAnimation(Animation anim1, Animation anim2) { + tab.startAnimation(anim1); + text.startAnimation(anim2); + } + + public void hideTarget() { + target.clearAnimation(); + target.setVisibility(View.INVISIBLE); + } + } + + public SlidingTab(Context context) { + this(context, null); + } + + /** + * Constructor used when this widget is created from a layout file. + */ + public SlidingTab(Context context, AttributeSet attrs) { + super(context, attrs); + + // Allocate a temporary once that can be used everywhere. + mTmpRect = new Rect(); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SlidingTab); + mOrientation = a.getInt(org.linphone.R.styleable.SlidingTab_orientation, HORIZONTAL); + a.recycle(); + mLeftSlider = new Slider(this, + R.drawable.startcall_green, + R.drawable.jog_tab_left_answer, + R.drawable.jog_tab_bar_left_answer, + R.drawable.jog_tab_target_green + ); + mRightSlider = new Slider(this, + R.drawable.stopcall_red, + R.drawable.jog_tab_right_decline, + R.drawable.jog_tab_bar_right_decline, + R.drawable.jog_tab_target_red + ); + + // setBackgroundColor(0x80808080); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); + int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); + + int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); + int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); + + if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { + Log.e("SlidingTab", "SlidingTab cannot have UNSPECIFIED MeasureSpec" + +"(wspec=" + widthSpecMode + ", hspec=" + heightSpecMode + ")", + new RuntimeException(LOG_TAG + "stack:")); + } + + mLeftSlider.measure(); + mRightSlider.measure(); + final int leftTabWidth = mLeftSlider.getTabWidth(); + final int rightTabWidth = mRightSlider.getTabWidth(); + final int leftTabHeight = mLeftSlider.getTabHeight(); + final int rightTabHeight = mRightSlider.getTabHeight(); + final int width; + final int height; + if (isHorizontal()) { + width = Math.max(widthSpecSize, leftTabWidth + rightTabWidth); + height = Math.max(leftTabHeight, rightTabHeight); + } else { + width = Math.max(leftTabWidth, rightTabHeight); + height = Math.max(heightSpecSize, leftTabHeight + rightTabHeight); + } + setMeasuredDimension(width, height); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + final int action = event.getAction(); + final float x = event.getX(); + final float y = event.getY(); + + if (mAnimating) { + return false; + } + + View leftHandle = mLeftSlider.tab; + leftHandle.getHitRect(mTmpRect); + boolean leftHit = mTmpRect.contains((int) x, (int) y); + + View rightHandle = mRightSlider.tab; + rightHandle.getHitRect(mTmpRect); + boolean rightHit = mTmpRect.contains((int)x, (int) y); + + if (!mTracking && !(leftHit || rightHit)) { + return false; + } + + switch (action) { + case MotionEvent.ACTION_DOWN: { + mTracking = true; + mTriggered = false; + vibrate(VIBRATE_SHORT); + if (leftHit) { + mCurrentSlider = mLeftSlider; + mOtherSlider = mRightSlider; + mThreshold = isHorizontal() ? THRESHOLD : 1.0f - THRESHOLD; + setGrabbedState(OnTriggerListener.LEFT_HANDLE); + } else { + mCurrentSlider = mRightSlider; + mOtherSlider = mLeftSlider; + mThreshold = isHorizontal() ? 1.0f - THRESHOLD : THRESHOLD; + setGrabbedState(OnTriggerListener.RIGHT_HANDLE); + } + mCurrentSlider.setState(Slider.STATE_PRESSED); + mCurrentSlider.showTarget(); + mOtherSlider.hide(); + break; + } + } + + return true; + } + + /** + * Reset the tabs to their original state and stop any existing animation. + * Animate them back into place if animate is true. + * + * @param animate + */ + public void reset(boolean animate) { + mLeftSlider.reset(animate); + mRightSlider.reset(animate); + if (!animate) { + mAnimating = false; + } + } + + @Override + public void setVisibility(int visibility) { + // Clear animations so sliders don't continue to animate when we show the widget again. + if (visibility != getVisibility() && visibility == View.INVISIBLE) { + reset(false); + } + super.setVisibility(visibility); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (mTracking) { + final int action = event.getAction(); + final float x = event.getX(); + final float y = event.getY(); + + switch (action) { + case MotionEvent.ACTION_MOVE: + if (withinView(x, y, this) ) { + moveHandle(x, y); + float position = isHorizontal() ? x : y; + float target = mThreshold * (isHorizontal() ? getWidth() : getHeight()); + boolean thresholdReached; + if (isHorizontal()) { + thresholdReached = mCurrentSlider == mLeftSlider ? + position > target : position < target; + } else { + thresholdReached = mCurrentSlider == mLeftSlider ? + position < target : position > target; + } + if (!mTriggered && thresholdReached) { + mTriggered = true; + mTracking = false; + mCurrentSlider.setState(Slider.STATE_ACTIVE); + boolean isLeft = mCurrentSlider == mLeftSlider; + dispatchTriggerEvent(isLeft ? + OnTriggerListener.LEFT_HANDLE : OnTriggerListener.RIGHT_HANDLE); + + startAnimating(isLeft ? mHoldLeftOnTransition : mHoldRightOnTransition); + setGrabbedState(OnTriggerListener.NO_HANDLE); + } + break; + } + // Intentionally fall through - we're outside tracking rectangle + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mTracking = false; + mTriggered = false; + mOtherSlider.show(true); + mCurrentSlider.reset(false); + mCurrentSlider.hideTarget(); + mCurrentSlider = null; + mOtherSlider = null; + setGrabbedState(OnTriggerListener.NO_HANDLE); + break; + } + } + + return mTracking || super.onTouchEvent(event); + } + + void startAnimating(final boolean holdAfter) { + mAnimating = true; + final Animation trans1; + final Animation trans2; + final Slider slider = mCurrentSlider; + final int dx; + final int dy; + if (isHorizontal()) { + int right = slider.tab.getRight(); + int width = slider.tab.getWidth(); + int left = slider.tab.getLeft(); + int viewWidth = getWidth(); + int holdOffset = holdAfter ? 0 : width; // how much of tab to show at the end of anim + dx = slider == mRightSlider ? - (right + viewWidth - holdOffset) + : (viewWidth - left) + viewWidth - holdOffset; + dy = 0; + } else { + int top = slider.tab.getTop(); + int bottom = slider.tab.getBottom(); + int height = slider.tab.getHeight(); + int viewHeight = getHeight(); + int holdOffset = holdAfter ? 0 : height; // how much of tab to show at end of anim + dx = 0; + dy = slider == mRightSlider ? (top + viewHeight - holdOffset) + : - ((viewHeight - bottom) + viewHeight - holdOffset); + } + trans1 = new TranslateAnimation(0, dx, 0, dy); + trans1.setDuration(ANIM_DURATION); + trans1.setInterpolator(new LinearInterpolator()); + trans1.setFillAfter(true); + trans2 = new TranslateAnimation(0, dx, 0, dy); + trans2.setDuration(ANIM_DURATION); + trans2.setInterpolator(new LinearInterpolator()); + trans2.setFillAfter(true); + + trans1.setAnimationListener(new AnimationListener() { + public void onAnimationEnd(Animation animation) { + Animation anim; + if (holdAfter) { + anim = new TranslateAnimation(dx, dx, dy, dy); + anim.setDuration(1000); // plenty of time for transitions + mAnimating = false; + } else { + anim = new AlphaAnimation(0.5f, 1.0f); + anim.setDuration(ANIM_DURATION); + resetView(); + } + anim.setAnimationListener(mAnimationDoneListener); + + /* Animation can be the same for these since the animation just holds */ + mLeftSlider.startAnimation(anim, anim); + mRightSlider.startAnimation(anim, anim); + } + + public void onAnimationRepeat(Animation animation) { + + } + + public void onAnimationStart(Animation animation) { + + } + + }); + + slider.hideTarget(); + slider.startAnimation(trans1, trans2); + } + + private void onAnimationDone() { + resetView(); + mAnimating = false; + } + + private boolean withinView(final float x, final float y, final View view) { + return isHorizontal() && y > - TRACKING_MARGIN && y < TRACKING_MARGIN + view.getHeight() + || !isHorizontal() && x > -TRACKING_MARGIN && x < TRACKING_MARGIN + view.getWidth(); + } + + private boolean isHorizontal() { + return mOrientation == HORIZONTAL; + } + + private void resetView() { + mLeftSlider.reset(false); + mRightSlider.reset(false); + // onLayout(true, getLeft(), getTop(), getLeft() + getWidth(), getTop() + getHeight()); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + if (!changed) return; + + // Center the widgets in the view + mLeftSlider.layout(l, t, r, b, isHorizontal() ? Slider.ALIGN_LEFT : Slider.ALIGN_BOTTOM); + mRightSlider.layout(l, t, r, b, isHorizontal() ? Slider.ALIGN_RIGHT : Slider.ALIGN_TOP); + } + + private void moveHandle(float x, float y) { + final View handle = mCurrentSlider.tab; + final View content = mCurrentSlider.text; + if (isHorizontal()) { + int deltaX = (int) x - handle.getLeft() - (handle.getWidth() / 2); + handle.offsetLeftAndRight(deltaX); + content.offsetLeftAndRight(deltaX); + } else { + int deltaY = (int) y - handle.getTop() - (handle.getHeight() / 2); + handle.offsetTopAndBottom(deltaY); + content.offsetTopAndBottom(deltaY); + } + invalidate(); // TODO: be more conservative about what we're invalidating + } + + /** + * Sets the left handle icon to a given resource. + * + * The resource should refer to a Drawable object, or use 0 to remove + * the icon. + * + * @param iconId the resource ID of the icon drawable + * @param targetId the resource of the target drawable + * @param barId the resource of the bar drawable (stateful) + * @param tabId the resource of the + */ + public void setLeftTabResources(int iconId, int targetId, int barId, int tabId) { + mLeftSlider.setIcon(iconId); + mLeftSlider.setTarget(targetId); + mLeftSlider.setBarBackgroundResource(barId); + mLeftSlider.setTabBackgroundResource(tabId); + mLeftSlider.updateDrawableStates(); + } + + /** + * Sets the left handle hint text to a given resource string. + * + * @param resId + */ + public void setLeftHintText(int resId) { + if (isHorizontal()) { + mLeftSlider.setHintText(resId); + } + } + + /** + * Sets the right handle icon to a given resource. + * + * The resource should refer to a Drawable object, or use 0 to remove + * the icon. + * + * @param iconId the resource ID of the icon drawable + * @param targetId the resource of the target drawable + * @param barId the resource of the bar drawable (stateful) + * @param tabId the resource of the + */ + public void setRightTabResources(int iconId, int targetId, int barId, int tabId) { + mRightSlider.setIcon(iconId); + mRightSlider.setTarget(targetId); + mRightSlider.setBarBackgroundResource(barId); + mRightSlider.setTabBackgroundResource(tabId); + mRightSlider.updateDrawableStates(); + } + + /** + * Sets the left handle hint text to a given resource string. + * + * @param resId + */ + public void setRightHintText(int resId) { + if (isHorizontal()) { + mRightSlider.setHintText(resId); + } + } + + public void setHoldAfterTrigger(boolean holdLeft, boolean holdRight) { + mHoldLeftOnTransition = holdLeft; + mHoldRightOnTransition = holdRight; + } + + /** + * Triggers haptic feedback. + */ + private synchronized void vibrate(long duration) { + if (mVibrator == null) { + mVibrator = (android.os.Vibrator) + getContext().getSystemService(Context.VIBRATOR_SERVICE); + } + mVibrator.vibrate(duration); + } + + /** + * Registers a callback to be invoked when the user triggers an event. + * + * @param listener the OnDialTriggerListener to attach to this view + */ + public void setOnTriggerListener(OnTriggerListener listener) { + mOnTriggerListener = listener; + } + + /** + * Dispatches a trigger event to listener. Ignored if a listener is not set. + * @param whichHandle the handle that triggered the event. + */ + private void dispatchTriggerEvent(int whichHandle) { + vibrate(VIBRATE_LONG); + if (mOnTriggerListener != null) { + mOnTriggerListener.onTrigger(this, whichHandle); + } + } + + /** + * Sets the current grabbed state, and dispatches a grabbed state change + * event to our listener. + */ + private void setGrabbedState(int newState) { + if (newState != mGrabbedState) { + mGrabbedState = newState; + if (mOnTriggerListener != null) { + mOnTriggerListener.onGrabbedStateChange(this, mGrabbedState); + } + } + } +}