From 05b840d6b7576a30165f26f0b9c4c44136120e2d Mon Sep 17 00:00:00 2001
From: Dmitry Oleshko <doleshko@productengine.com>
Date: Thu, 17 Dec 2009 13:53:59 +0200
Subject: fixed normal bug (EXT-3435) All voice notifications should look
 similar and according to the Voice UI Spec

- added new voice notification that replaced notification toasts
- now LLOutgoingCallDialog manages visibility of its controls on its own

--HG--
branch : product-engine
---
 indra/newview/llimview.cpp                         | 117 +++++++++++++--------
 indra/newview/llimview.h                           |   7 +-
 indra/newview/llvoicechannel.cpp                   |   5 +-
 .../skins/default/xui/en/floater_outgoing_call.xml |  26 ++++-
 4 files changed, 104 insertions(+), 51 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index ad30b844a9..28d9f2170d 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -93,7 +93,8 @@ const static std::string ADHOC_NAME_SUFFIX(" Conference");
 std::string LLCallDialogManager::sPreviousSessionlName = "";
 std::string LLCallDialogManager::sCurrentSessionlName = "";
 LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL;
-
+LLVoiceChannel::EState LLCallDialogManager::sOldState = LLVoiceChannel::STATE_READY;
+const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-1417BF03DDB4");
 //
 // Globals
 //
@@ -1280,12 +1281,22 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
 void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
 {
 	LLSD mCallDialogPayload;
-	LLOutgoingCallDialog* ocd;
+	LLOutgoingCallDialog* ocd = NULL;
+
+	if(sOldState == new_state)
+	{
+		return;
+	}
+
+	sOldState = new_state;
 
 	mCallDialogPayload["session_id"] = sSession->mSessionID;
 	mCallDialogPayload["session_name"] = sSession->mName;
 	mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;
 	mCallDialogPayload["old_channel_name"] = sPreviousSessionlName;
+	mCallDialogPayload["state"] = new_state;
+	mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
+	mCallDialogPayload["session_type"] = sSession->mSessionType;
 
 	switch(new_state)
 	{			
@@ -1295,46 +1306,10 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 		{
 			return;
 		}
-
-		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
-		if (ocd)
-		{
-			ocd->getChild<LLTextBox>("calling")->setVisible(true);
-			ocd->getChild<LLTextBox>("leaving")->setVisible(true);
-			ocd->getChild<LLTextBox>("connecting")->setVisible(false);
-			ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
-			ocd->getChild<LLButton>("Cancel")->setVisible(true);
-		}
-		return;
-
-	case LLVoiceChannel::STATE_RINGING :
-		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
-		if (ocd)
-		{
-			ocd->getChild<LLTextBox>("calling")->setVisible(false);
-			ocd->getChild<LLTextBox>("leaving")->setVisible(true);
-			ocd->getChild<LLTextBox>("connecting")->setVisible(true);
-			ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
-			ocd->getChild<LLButton>("Cancel")->setVisible(true);
-		}
-		return;
-
-	case LLVoiceChannel::STATE_ERROR :
-		mCallDialogPayload["start_timer"] = true;
-		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
-		if (ocd)
-		{
-			ocd->getChild<LLTextBox>("calling")->setVisible(false);
-			ocd->getChild<LLTextBox>("leaving")->setVisible(false);
-			ocd->getChild<LLTextBox>("connecting")->setVisible(false);
-			ocd->getChild<LLTextBox>("noanswer")->setVisible(true);
-			ocd->getChild<LLButton>("Cancel")->setVisible(false);
-		}
-		return;
+		break;
 
 	case LLVoiceChannel::STATE_CONNECTED :
-	case LLVoiceChannel::STATE_HUNG_UP :
-		ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+		ocd = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
 		if (ocd)
 		{
 			ocd->closeFloater();
@@ -1345,6 +1320,11 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
 		break;
 	}
 
+	ocd = LLFloaterReg::getTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+	if(ocd)
+	{
+		ocd->show(mCallDialogPayload);
+	}	
 }
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1374,12 +1354,13 @@ void LLCallDialog::onOpen(const LLSD& key)
 LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
 LLCallDialog(payload)
 {
-	LLOutgoingCallDialog* instance = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", payload);
+	LLOutgoingCallDialog* instance = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
 	if(instance && instance->getVisible())
 	{
 		instance->onCancel(instance);
 	}	
 }
+
 void LLOutgoingCallDialog::draw()
 {
 	if (lifetimeHasExpired())
@@ -1408,10 +1389,14 @@ void LLOutgoingCallDialog::onLifetimeExpired()
 	closeFloater();
 }
 
-void LLOutgoingCallDialog::onOpen(const LLSD& key)
+void LLOutgoingCallDialog::show(const LLSD& key)
 {
-	LLCallDialog::onOpen(key);
+	mPayload = key;
+
+	// hide all text at first
+	hideAllText();
 
+	// customize text strings
 	// tell the user which voice channel they are leaving
 	if (!mPayload["old_channel_name"].asString().empty())
 	{
@@ -1422,6 +1407,12 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 		childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
 	}
 
+	if (!mPayload["disconnected_channel_name"].asString().empty())
+	{
+		childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+		childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+	}
+
 	std::string callee_name = mPayload["session_name"].asString();
 	if (callee_name == "anonymous")
 	{
@@ -1438,12 +1429,48 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
 
 	// stop timer by default
 	mLifetimeTimer.stop();
-	if(mPayload.has("start_timer"))
+
+	// show only necessary strings and controls
+	switch(mPayload["state"].asInteger())
 	{
-		mLifetimeTimer.reset();
+	case LLVoiceChannel::STATE_CALL_STARTED :
+		getChild<LLTextBox>("calling")->setVisible(true);
+		getChild<LLTextBox>("leaving")->setVisible(true);
+		break;
+	case LLVoiceChannel::STATE_RINGING :
+		getChild<LLTextBox>("leaving")->setVisible(true);
+		getChild<LLTextBox>("connecting")->setVisible(true);
+		break;
+	case LLVoiceChannel::STATE_ERROR :
+		getChild<LLTextBox>("noanswer")->setVisible(true);
+		getChild<LLButton>("Cancel")->setVisible(false);
+		mLifetimeTimer.start();
+		break;
+	case LLVoiceChannel::STATE_HUNG_UP :
+		if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION)
+		{
+			getChild<LLTextBox>("nearby_P2P")->setVisible(true);
+		} 
+		else
+		{
+			getChild<LLTextBox>("nearby")->setVisible(true);
+		}
+		getChild<LLButton>("Cancel")->setVisible(false);
+		mLifetimeTimer.start();
 	}
+
+	openFloater(LLOutgoingCallDialog::OCD_KEY);
 }
 
+void LLOutgoingCallDialog::hideAllText()
+{
+	getChild<LLTextBox>("calling")->setVisible(false);
+	getChild<LLTextBox>("leaving")->setVisible(false);
+	getChild<LLTextBox>("connecting")->setVisible(false);
+	getChild<LLTextBox>("nearby_P2P")->setVisible(false);
+	getChild<LLTextBox>("nearby")->setVisible(false);
+	getChild<LLTextBox>("noanswer")->setVisible(false);
+}
 
 //static
 void LLOutgoingCallDialog::onCancel(void* user_data)
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 6eb3f3d07f..09f0c9df71 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -467,6 +467,7 @@ protected:
 	static std::string sPreviousSessionlName;
 	static std::string sCurrentSessionlName;
 	static LLIMModel::LLIMSession* sSession;
+	static LLVoiceChannel::EState sOldState;
 };
 
 class LLCallDialog : public LLDockableFloater
@@ -504,14 +505,18 @@ public:
 	LLOutgoingCallDialog(const LLSD& payload);
 
 	/*virtual*/ BOOL postBuild();
-	/*virtual*/ void onOpen(const LLSD& key);
+	void show(const LLSD& key);
 
 	static void onCancel(void* user_data);
+	static const LLUUID OCD_KEY;
 
 	// check timer state
 	/*virtual*/ void draw();
 
 private:
+
+	// hide all text boxes
+	void hideAllText();
 	// lifetime timer for NO_ANSWER notification
 	LLTimer	mLifetimeTimer;
 	// lifetime duration for NO_ANSWER notification
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index fd4e7bb91f..60a2c3b638 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -229,7 +229,6 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)
 		{
 			// if forceably removed from channel
 			// update the UI and revert to default channel
-			LLNotificationsUtil::add("VoiceChannelDisconnected", mNotifyArgs);
 			deactivate();
 		}
 		mIgnoreNextSessionLeave = FALSE;
@@ -741,6 +740,7 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
 	case STATUS_LEFT_CHANNEL:
 		if (callStarted() && !mIgnoreNextSessionLeave && !sSuspended)
 		{
+			// *TODO: use it to show DECLINE voice notification
 			if (mState == STATE_RINGING)
 			{
 				// other user declined call
@@ -748,8 +748,7 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
 			}
 			else
 			{
-				// other user hung up
-				LLNotificationsUtil::add("VoiceChannelDisconnectedP2P", mNotifyArgs);
+				// other user hung up				
 			}
 			deactivate();
 		}
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index ae4d5042ef..c6bc093c6c 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -69,7 +69,29 @@ Calling [CALLEE_NAME]
      word_wrap="true">
 No Answer.  Please try again later.
     </text>
-    <text
+  <text
+   font="SansSerifLarge"
+   height="40"
+   layout="topleft"
+   left="77"
+   name="nearby"
+   top="27"
+   width="315"
+   word_wrap="true">
+    You have been disconnected from [VOICE_CHANNEL_NAME].  You will now be reconnected to Nearby Voice Chat.
+  </text>
+  <text
+   font="SansSerifLarge"
+   height="40"
+   layout="topleft"
+   left="77"
+   name="nearby_P2P"
+   top="27"
+   width="315"
+   word_wrap="true">
+    [VOICE_CHANNEL_NAME] has ended the call.  You will now be reconnected to Nearby Voice Chat.
+  </text>
+  <text
      font="SansSerif"
      height="50"
      layout="topleft"
@@ -80,7 +102,7 @@ No Answer.  Please try again later.
      word_wrap="true">
 Leaving [CURRENT_CHAT].
     </text>
-    <button
+  <button
      height="24"
      label="Cancel"
      label_selected="Cancel"
-- 
cgit v1.2.3