From 617bc0eded9b8df2d800a75eab107c079c468e9f Mon Sep 17 00:00:00 2001
From: Mnikolenko Productengine <mnikolenko@productengine.com>
Date: Tue, 4 Oct 2016 19:07:05 +0300
Subject: [PATCH] MAINT-6779 Allow to use last pic from Abuse report floater
 after relog

---
 .../app_settings/settings_per_account.xml     | 11 +++
 indra/newview/llfloaterreporter.cpp           | 78 +++++++++++++++----
 indra/newview/llfloaterreporter.h             |  9 ++-
 .../skins/default/xui/en/notifications.xml    | 15 +++-
 4 files changed, 96 insertions(+), 17 deletions(-)

diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index fd6b1b5b3f0..bed392d738d 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -242,6 +242,17 @@
         <key>Value</key>
         <integer>0</integer>
       </map>
+    <key>PreviousScreenshotForReport</key>
+    <map>
+      <key>Comment</key>
+      <string>Use Previous Screenshot for Abuse report</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <!-- Settings below are for back compatibility only.
     They are not used in current viewer anymore. But they can't be removed to avoid
     influence on previous versions of the viewer in case of settings are not used or default value
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index a6ce0ba6780..790e2b3ad15 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -37,6 +37,7 @@
 #include "llcachename.h"
 #include "llcheckboxctrl.h"
 #include "llfontgl.h"
+#include "llimagebmp.h"
 #include "llimagej2c.h"
 #include "llinventory.h"
 #include "llnotificationsutil.h"
@@ -76,6 +77,7 @@
 #include "llselectmgr.h"
 #include "llversioninfo.h"
 #include "lluictrlfactory.h"
+#include "llviewercontrol.h"
 #include "llviewernetwork.h"
 
 #include "llagentui.h"
@@ -86,6 +88,7 @@
 #include "llcorehttputil.h"
 #include "llviewerassetupload.h"
 
+const std::string SCREEN_PREV_FILENAME = "screen_report_last.bmp";
 
 //=========================================================================
 //-----------------------------------------------------------------------------
@@ -181,11 +184,6 @@ BOOL LLFloaterReporter::postBuild()
 	}
 	setPosBox(pos);
 
-	// Take a screenshot, but don't draw this floater.
-	setVisible(FALSE);
-	takeScreenshot();
-	setVisible(TRUE);
-
 	// Default text to be blank
 	getChild<LLUICtrl>("object_name")->setValue(LLStringUtil::null);
 	getChild<LLUICtrl>("owner_name")->setValue(LLStringUtil::null);
@@ -769,18 +767,24 @@ void LLFloaterReporter::sendReportViaCaps(std::string url, std::string sshot_url
 	}
 }
 
-void LLFloaterReporter::takeScreenshot()
+void LLFloaterReporter::takeScreenshot(bool use_prev_screenshot)
 {
-	const S32 IMAGE_WIDTH = 1024;
-	const S32 IMAGE_HEIGHT = 768;
-
-	LLPointer<LLImageRaw> raw = new LLImageRaw;
-	if( !gViewerWindow->rawSnapshot(raw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE, FALSE))
+	gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", TRUE);
+	if(!use_prev_screenshot)
 	{
-		LL_WARNS() << "Unable to take screenshot" << LL_ENDL;
-		return;
+		std::string screenshot_filename(gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + SCREEN_PREV_FILENAME);
+		LLPointer<LLImageBMP> bmp_image = new LLImageBMP;
+		if(bmp_image->encode(mImageRaw, 0.0f))
+		{
+			bmp_image->save(screenshot_filename);
+		}
+	}
+	else
+	{
+		mImageRaw = mPrevImageRaw;
 	}
-	LLPointer<LLImageJ2C> upload_data = LLViewerTextureList::convertToUploadFile(raw);
+
+	LLPointer<LLImageJ2C> upload_data = LLViewerTextureList::convertToUploadFile(mImageRaw);
 
 	// create a resource data
 	mResourceDatap->mInventoryType = LLInventoryType::IT_NONE;
@@ -812,7 +816,7 @@ void LLFloaterReporter::takeScreenshot()
 	// store in the image list so it doesn't try to fetch from the server
 	LLPointer<LLViewerFetchedTexture> image_in_list = 
 		LLViewerTextureManager::getFetchedTexture(mResourceDatap->mAssetInfo.mUuid);
-	image_in_list->createGLTexture(0, raw, 0, TRUE, LLGLTexture::OTHER);
+	image_in_list->createGLTexture(0, mImageRaw, 0, TRUE, LLGLTexture::OTHER);
 	
 	// the texture picker then uses that texture
 	LLTextureCtrl* texture = getChild<LLTextureCtrl>("screenshot");
@@ -822,7 +826,46 @@ void LLFloaterReporter::takeScreenshot()
 		texture->setDefaultImageAssetID(mResourceDatap->mAssetInfo.mUuid);
 		texture->setCaption(getString("Screenshot"));
 	}
+}
+
+void LLFloaterReporter::onOpen(const LLSD& key)
+{
+	mImageRaw = new LLImageRaw;
+	const S32 IMAGE_WIDTH = 1024;
+	const S32 IMAGE_HEIGHT = 768;
+
+	// Take a screenshot, but don't draw this floater.
+	setVisible(FALSE);
+	if( !gViewerWindow->rawSnapshot(mImageRaw, IMAGE_WIDTH, IMAGE_HEIGHT, TRUE, FALSE, TRUE, FALSE))
+	{
+		LL_WARNS() << "Unable to take screenshot" << LL_ENDL;
+		setVisible(TRUE);
+		return;
+	}
+	setVisible(TRUE);
+
+	if(gSavedPerAccountSettings.getBOOL("PreviousScreenshotForReport"))
+	{
+		std::string screenshot_filename(gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + SCREEN_PREV_FILENAME);
+		mPrevImageRaw = new LLImageRaw;
+		LLPointer<LLImageBMP> start_image_bmp = new LLImageBMP;
+		if(start_image_bmp->load(screenshot_filename))
+		{
+			if (start_image_bmp->decode(mPrevImageRaw, 0.0f))
+			{
+				LLNotificationsUtil::add("LoadPreviousReportScreenshot", LLSD(), LLSD(), boost::bind(&LLFloaterReporter::onLoadScreenshotDialog,this, _1, _2));
+				return;
+			}
+		}
+	}
 
+	takeScreenshot();
+}
+
+void LLFloaterReporter::onLoadScreenshotDialog(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	takeScreenshot(option == 0);
 }
 
 void LLFloaterReporter::uploadImage()
@@ -886,6 +929,11 @@ void LLFloaterReporter::setPosBox(const LLVector3d &pos)
 	getChild<LLUICtrl>("pos_field")->setValue(pos_string);
 }
 
+void LLFloaterReporter::onClose(bool app_quitting)
+{
+	gSavedPerAccountSettings.setBOOL("PreviousScreenshotForReport", app_quitting);
+}
+
 
 // void LLFloaterReporter::setDescription(const std::string& description, LLMeanCollisionData *mcd)
 // {
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index 1aff07bd372..e5232268c09 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -81,6 +81,8 @@ class LLFloaterReporter
 	LLFloaterReporter(const LLSD& key);
 	/*virtual*/ ~LLFloaterReporter();
 	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+	/*virtual*/ void onClose(bool app_quitting);
 	virtual void draw();
 	
 	void setReportType(EReportType type) { mReportType = type; }
@@ -103,10 +105,12 @@ class LLFloaterReporter
 
 	void setPickedObjectProperties(const std::string& object_name, const std::string& owner_name, const LLUUID owner_id);
 
+	void onLoadScreenshotDialog(const LLSD& notification, const LLSD& response);
+
 private:
 	static void show(const LLUUID& object_id, const std::string& avatar_name = LLStringUtil::null, const LLUUID& experience_id = LLUUID::null);
 
-	void takeScreenshot();
+	void takeScreenshot(bool use_prev_screenshot = false);
 	void sendReportViaCaps(std::string url);
 	void uploadImage();
 	bool validateReport();
@@ -140,6 +144,9 @@ class LLFloaterReporter
 	std::string		mDefaultSummary;
 	LLResourceData* mResourceDatap;
 	boost::signals2::connection mAvatarNameCacheConnection;
+
+	LLPointer<LLImageRaw> mImageRaw;
+	LLPointer<LLImageRaw> mPrevImageRaw;
 };
 
 #endif
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 79ee35fe3ef..0d61e111e2f 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1491,7 +1491,20 @@ Delete Notecard?
      notext="Cancel"
      yestext="OK"/>
   </notification>
-
+  
+  <notification
+   icon="alertmodal.tga"
+   name="LoadPreviousReportScreenshot"
+   type="alertmodal">
+   <unique/>
+Do you want to use previous screenshot for your report?
+    <tag>confirm</tag>
+    <usetemplate
+     name="okcancelbuttons"
+     notext="Cancel"
+     yestext="OK"/>
+  </notification>
+  
   <notification
    icon="alertmodal.tga"
    name="GestureSaveFailedTooManySteps"
-- 
GitLab