From 08545aec7627643c17f642a3597133bf0965af54 Mon Sep 17 00:00:00 2001
From: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
Date: Fri, 26 Oct 2012 16:11:42 -0400
Subject: [PATCH] #17013: Move in SipCall logic to prevent action occuring in
 wrong state

---
 .../sflphone/client/CallActivity.java         | 18 ++-----
 .../sflphone/client/SipCall.java              | 49 +++++++++++++++----
 2 files changed, 42 insertions(+), 25 deletions(-)

diff --git a/src/com/savoirfairelinux/sflphone/client/CallActivity.java b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
index 6d31e6fc5..91c52b0e7 100644
--- a/src/com/savoirfairelinux/sflphone/client/CallActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/CallActivity.java
@@ -129,26 +129,14 @@ public class CallActivity extends Activity implements OnClickListener
                 mCall.notifyServiceAnswer(service);
                 break;
             case R.id.buttonhangup:
-                if((mCall.getCallStateInt() == SipCall.CALL_STATE_NONE) ||
-                   (mCall.getCallStateInt() == SipCall.CALL_STATE_CURRENT) ||
-                   (mCall.getCallStateInt() == SipCall.CALL_STATE_HOLD)) {
-                    mCall.notifyServiceHangup(service);
+                if(mCall.notifyServiceHangup(service))
                     finish();
-                }
-                else if(mCall.getCallStateInt() == SipCall.CALL_STATE_RINGING) {
-                    mCall.notifyServiceRefuse(service);
-                    finish();
-                }
                 break;
             case R.id.buttonhold:
-                if(mCall.getCallStateInt() == SipCall.CALL_STATE_CURRENT) {
-                    mCall.notifyServiceHold(service);
-                }
+                mCall.notifyServiceHold(service);
                 break;
             case R.id.buttonunhold:
-                if(mCall.getCallStateInt() == SipCall.CALL_STATE_HOLD) {
-                    mCall.notifyServiceUnhold(service);
-                }
+                mCall.notifyServiceUnhold(service);
                 break;
             default:
                 Log.e(TAG, "Invalid button clicked");
diff --git a/src/com/savoirfairelinux/sflphone/client/SipCall.java b/src/com/savoirfairelinux/sflphone/client/SipCall.java
index 70bd65b74..05aefb2bb 100644
--- a/src/com/savoirfairelinux/sflphone/client/SipCall.java
+++ b/src/com/savoirfairelinux/sflphone/client/SipCall.java
@@ -299,12 +299,12 @@ public class SipCall
         
     }
 
-    public void notifyServiceAnswer(ISipService service)
+    public boolean notifyServiceAnswer(ISipService service)
     {
         int callState = getCallStateInt();
         if((callState != CALL_STATE_RINGING) &&
            (callState != CALL_STATE_NONE)) {
-            return;
+            return false;
         }
 
         try {
@@ -312,6 +312,8 @@ public class SipCall
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
+
+        return true;
     }
 
     /**
@@ -331,40 +333,67 @@ public class SipCall
     /**
      * Perform hangup action and send request to the service
      */
-    public void notifyServiceHangup(ISipService service)
+    public boolean notifyServiceHangup(ISipService service)
     {
         try {
-            service.hangUp(mCallInfo.mCallID);
+            if((getCallStateInt() == SipCall.CALL_STATE_NONE) ||
+               (getCallStateInt() == SipCall.CALL_STATE_CURRENT) ||
+               (getCallStateInt() == SipCall.CALL_STATE_HOLD)) {
+                service.hangUp(mCallInfo.mCallID);
+                return true;
+
+            }
+            else if(getCallStateInt() == SipCall.CALL_STATE_RINGING) {
+                service.refuse(mCallInfo.mCallID);
+                return true;
+            }
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
+
+        return false;
     }
 
-    public void notifyServiceRefuse(ISipService service)
+    public boolean notifyServiceRefuse(ISipService service)
     {
         try {
-            service.refuse(mCallInfo.mCallID);
+            if(getCallStateInt() == SipCall.CALL_STATE_RINGING) {
+                service.refuse(mCallInfo.mCallID);
+                return true;
+            }
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
+
+        return false;
     }
 
-    public void notifyServiceHold(ISipService service)
+    public boolean notifyServiceHold(ISipService service)
     {
         try {
-            service.hold(mCallInfo.mCallID);
+            if(getCallStateInt() == SipCall.CALL_STATE_CURRENT) {
+                service.hold(mCallInfo.mCallID);
+                return true;
+            }
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
+
+        return false;
     }
 
-    public void notifyServiceUnhold(ISipService service)
+    public boolean notifyServiceUnhold(ISipService service)
     {
         try {
-            service.unhold(mCallInfo.mCallID);
+            if(getCallStateInt() == SipCall.CALL_STATE_HOLD) {
+                service.unhold(mCallInfo.mCallID);
+                return true;
+            }
         } catch (RemoteException e) {
             Log.e(TAG, "Cannot call service method", e);
         }
+
+        return false;
     }
 
     public void addToConference()
-- 
GitLab