Fixed normal bugs EXT-1628 ([BSI] - New IM system isn't sending typing notifications anymore) and EXT-1629 ([BSI] - add hint in IM window when Resident is typing)
--HG-- branch : product-enginemeow-7.2.2
parent
e4b3b5f7df
commit
f22f829b86
|
|
@ -61,7 +61,14 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
|
|||
mLastMessageIndex(-1),
|
||||
mDialog(IM_NOTHING_SPECIAL),
|
||||
mChatHistory(NULL),
|
||||
mInputEditor(NULL),
|
||||
mInputEditor(NULL),
|
||||
mSavedTitle(),
|
||||
mTypingStart(),
|
||||
mShouldSendTypingState(false),
|
||||
mMeTyping(false),
|
||||
mOtherTyping(false),
|
||||
mTypingTimer(),
|
||||
mTypingTimeoutTimer(),
|
||||
mPositioned(false),
|
||||
mSessionInitialized(false)
|
||||
{
|
||||
|
|
@ -95,6 +102,7 @@ void LLIMFloater::onFocusReceived()
|
|||
// virtual
|
||||
void LLIMFloater::onClose(bool app_quitting)
|
||||
{
|
||||
setTyping(false);
|
||||
gIMMgr->leaveSession(mSessionID);
|
||||
}
|
||||
|
||||
|
|
@ -141,6 +149,7 @@ void LLIMFloater::onSendMsg( LLUICtrl* ctrl, void* userdata )
|
|||
{
|
||||
LLIMFloater* self = (LLIMFloater*) userdata;
|
||||
self->sendMsg();
|
||||
self->setTyping(false);
|
||||
}
|
||||
|
||||
void LLIMFloater::sendMsg()
|
||||
|
|
@ -228,12 +237,27 @@ BOOL LLIMFloater::postBuild()
|
|||
LLLogChat::loadHistory(getTitle(), &chatFromLogFile, (void *)this);
|
||||
}
|
||||
|
||||
mTypingStart = LLTrans::getString("IM_typing_start_string");
|
||||
|
||||
//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
|
||||
//see LLFloaterIMPanel for how it is done (IB)
|
||||
|
||||
return LLDockableFloater::postBuild();
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLIMFloater::draw()
|
||||
{
|
||||
if ( mMeTyping )
|
||||
{
|
||||
// Time out if user hasn't typed for a while.
|
||||
if ( mTypingTimeoutTimer.getElapsedTimeF32() > LLAgent::TYPING_TIMEOUT_SECS )
|
||||
{
|
||||
setTyping(false);
|
||||
}
|
||||
}
|
||||
LLFloater::draw();
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
|
|
@ -450,7 +474,7 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
|
|||
void LLIMFloater::onInputEditorFocusLost(LLFocusableElement* caller, void* userdata)
|
||||
{
|
||||
LLIMFloater* self = (LLIMFloater*) userdata;
|
||||
self->setTyping(FALSE);
|
||||
self->setTyping(false);
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
@ -460,19 +484,118 @@ void LLIMFloater::onInputEditorKeystroke(LLLineEditor* caller, void* userdata)
|
|||
std::string text = self->mInputEditor->getText();
|
||||
if (!text.empty())
|
||||
{
|
||||
self->setTyping(TRUE);
|
||||
self->setTyping(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Deleting all text counts as stopping typing.
|
||||
self->setTyping(FALSE);
|
||||
self->setTyping(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//just a stub for now
|
||||
void LLIMFloater::setTyping(BOOL typing)
|
||||
void LLIMFloater::setTyping(bool typing)
|
||||
{
|
||||
if ( typing )
|
||||
{
|
||||
// Started or proceeded typing, reset the typing timeout timer
|
||||
mTypingTimeoutTimer.reset();
|
||||
}
|
||||
|
||||
if ( mMeTyping != typing )
|
||||
{
|
||||
// Typing state is changed
|
||||
mMeTyping = typing;
|
||||
// So, should send current state
|
||||
mShouldSendTypingState = true;
|
||||
// In case typing is started, send state after some delay
|
||||
mTypingTimer.reset();
|
||||
}
|
||||
|
||||
// Don't want to send typing indicators to multiple people, potentially too
|
||||
// much network traffic. Only send in person-to-person IMs.
|
||||
if ( mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL )
|
||||
{
|
||||
if ( mMeTyping )
|
||||
{
|
||||
if ( mTypingTimer.getElapsedTimeF32() > 1.f )
|
||||
{
|
||||
// Still typing, send 'start typing' notification
|
||||
LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, TRUE);
|
||||
mShouldSendTypingState = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Send 'stop typing' notification immediately
|
||||
LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, FALSE);
|
||||
mShouldSendTypingState = false;
|
||||
}
|
||||
}
|
||||
|
||||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
|
||||
if (speaker_mgr)
|
||||
speaker_mgr->setSpeakerTyping(gAgent.getID(), FALSE);
|
||||
|
||||
}
|
||||
|
||||
void LLIMFloater::processIMTyping(const LLIMInfo* im_info, BOOL typing)
|
||||
{
|
||||
if ( typing )
|
||||
{
|
||||
// other user started typing
|
||||
addTypingIndicator(im_info);
|
||||
}
|
||||
else
|
||||
{
|
||||
// other user stopped typing
|
||||
removeTypingIndicator(im_info);
|
||||
}
|
||||
}
|
||||
|
||||
void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info)
|
||||
{
|
||||
// We may have lost a "stop-typing" packet, don't add it twice
|
||||
if ( im_info && !mOtherTyping )
|
||||
{
|
||||
mOtherTyping = true;
|
||||
|
||||
// Create typing is started title string
|
||||
LLUIString typing_start(mTypingStart);
|
||||
typing_start.setArg("[NAME]", im_info->mName);
|
||||
|
||||
// Save and set new title
|
||||
mSavedTitle = getTitle();
|
||||
setTitle (typing_start);
|
||||
|
||||
// Update speaker
|
||||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
|
||||
if ( speaker_mgr )
|
||||
{
|
||||
speaker_mgr->setSpeakerTyping(im_info->mFromID, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info)
|
||||
{
|
||||
if ( mOtherTyping )
|
||||
{
|
||||
mOtherTyping = false;
|
||||
|
||||
// Revert the title to saved one
|
||||
setTitle(mSavedTitle);
|
||||
|
||||
if ( im_info )
|
||||
{
|
||||
// Update speaker
|
||||
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID);
|
||||
if ( speaker_mgr )
|
||||
{
|
||||
speaker_mgr->setSpeakerTyping(im_info->mFromID, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void LLIMFloater::chatFromLogFile(LLLogChat::ELogLineType type, std::string line, void* userdata)
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@ public:
|
|||
// LLView overrides
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void setVisible(BOOL visible);
|
||||
// Check typing timeout timer.
|
||||
/*virtual*/ void draw();
|
||||
|
||||
// LLFloater overrides
|
||||
/*virtual*/ void onClose(bool app_quitting);
|
||||
|
|
@ -85,6 +87,7 @@ public:
|
|||
void setPositioned(bool b) { mPositioned = b; };
|
||||
|
||||
void onVisibilityChange(const LLSD& new_visibility);
|
||||
void processIMTyping(const LLIMInfo* im_info, BOOL typing);
|
||||
|
||||
private:
|
||||
// process focus events to set a currently active session
|
||||
|
|
@ -94,7 +97,7 @@ private:
|
|||
static void onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );
|
||||
static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);
|
||||
static void onInputEditorKeystroke(LLLineEditor* caller, void* userdata);
|
||||
void setTyping(BOOL typing);
|
||||
void setTyping(bool typing);
|
||||
void onSlide();
|
||||
static void* createPanelIMControl(void* userdata);
|
||||
static void* createPanelGroupControl(void* userdata);
|
||||
|
|
@ -103,6 +106,11 @@ private:
|
|||
|
||||
static void chatFromLogFile(LLLogChat::ELogLineType type, std::string line, void* userdata);
|
||||
|
||||
// Add the "User is typing..." indicator.
|
||||
void addTypingIndicator(const LLIMInfo* im_info);
|
||||
|
||||
// Remove the "User is typing..." indicator.
|
||||
void removeTypingIndicator(const LLIMInfo* im_info = NULL);
|
||||
|
||||
LLPanelChatControlPanel* mControlPanel;
|
||||
LLUUID mSessionID;
|
||||
|
|
@ -114,6 +122,14 @@ private:
|
|||
LLLineEditor* mInputEditor;
|
||||
bool mPositioned;
|
||||
|
||||
std::string mSavedTitle;
|
||||
LLUIString mTypingStart;
|
||||
bool mMeTyping;
|
||||
bool mOtherTyping;
|
||||
bool mShouldSendTypingState;
|
||||
LLFrameTimer mTypingTimer;
|
||||
LLFrameTimer mTypingTimeoutTimer;
|
||||
|
||||
bool mSessionInitialized;
|
||||
LLSD mQueuedMsgsForInit;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1991,6 +1991,12 @@ void LLIMMgr::processIMTypingCore(const LLIMInfo* im_info, BOOL typing)
|
|||
{
|
||||
floater->processIMTyping(im_info, typing);
|
||||
}
|
||||
|
||||
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
|
||||
if ( im_floater )
|
||||
{
|
||||
im_floater->processIMTyping(im_info, typing);
|
||||
}
|
||||
}
|
||||
|
||||
class LLViewerChatterBoxSessionStartReply : public LLHTTPNode
|
||||
|
|
|
|||
|
|
@ -264,10 +264,6 @@
|
|||
<string name="TrackYourCamera">Track your camera</string>
|
||||
<string name="ControlYourCamera">Control your camera</string>
|
||||
|
||||
<!-- IM -->
|
||||
<string name="IM_logging_string">-- Instant message logging enabled --</string>
|
||||
<string name="Unnamed">(Unnamed)</string>
|
||||
|
||||
<!-- Sim Access labels -->
|
||||
<string name="SIM_ACCESS_PG">PG</string>
|
||||
<string name="SIM_ACCESS_MATURE">Mature</string>
|
||||
|
|
@ -2884,7 +2880,11 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
|
|||
Failed to start viewer
|
||||
</string>
|
||||
|
||||
<!-- IM system messages -->
|
||||
<!-- IM system messages -->
|
||||
<string name="IM_logging_string">-- Instant message logging enabled --</string>
|
||||
<string name="IM_typing_start_string">[NAME] is typing...</string>
|
||||
<string name="Unnamed">(Unnamed)</string>
|
||||
|
||||
<string name="ringing-im">
|
||||
Joining Voice Chat...
|
||||
</string>
|
||||
|
|
|
|||
Loading…
Reference in New Issue