Get signature from settings for compose.

Change-Id: Ie50c21e77ecf8a222b7be24910511d65b8cfea8b
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e37a7a2..da5f172 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -88,6 +88,8 @@
     <string name="confirm_send_message">Send this message?</string>
     <!-- Displayed for one second after discarding draft message [CHAR LIMIT=50]-->
     <string name="message_discarded">Message discarded.</string>
+    <!-- Formatting string for the user's signaure. [CHAR LIMIT=10] -->
+    <string name="signature">\n\n<xliff:g id="signature">%s</xliff:g></string>
 
     <!-- Menu item: send this message -->
     <string name="send">Send</string>
diff --git a/src/com/android/mail/compose/ComposeActivity.java b/src/com/android/mail/compose/ComposeActivity.java
index cd478ef..6eae203 100644
--- a/src/com/android/mail/compose/ComposeActivity.java
+++ b/src/com/android/mail/compose/ComposeActivity.java
@@ -766,6 +766,7 @@
     /* package for testing */
     ArrayList<SendOrSaveTask> mActiveTasks = Lists.newArrayList();
     private int mRequestId;
+    private String mSignature;
 
     /*package*/ static class SendOrSaveMessage {
         final Account mAccount;
@@ -891,16 +892,41 @@
     }
 
     /**
-     * Check if the ComposeArea believes all fields are blank.
+     * Check if all fields are blank.
      * @return boolean
      */
     public boolean isBlank() {
         return mSubject.getText().length() == 0
-               && mBodyView.getText().length() == 0
-               && mTo.length() == 0
-               && mCc.length() == 0
-               && mBcc.length() == 0
-               && mAttachmentsView.getAttachments().size() == 0;
+                && (mBodyView.getText().length() == 0 || getSignatureStartPosition(mSignature,
+                        mBodyView.getText().toString()) == 0)
+                && mTo.length() == 0
+                && mCc.length() == 0 && mBcc.length() == 0
+                && mAttachmentsView.getAttachments().size() == 0;
+    }
+
+    @VisibleForTesting
+    protected int getSignatureStartPosition(String signature, String bodyText) {
+        int startPos = -1;
+
+        if (TextUtils.isEmpty(signature) || TextUtils.isEmpty(bodyText)) {
+            return startPos;
+        }
+
+        int bodyLength = bodyText.length();
+        int signatureLength = signature.length();
+        String printableVersion = convertToPrintableSignature(signature);
+        int printableLength = printableVersion.length();
+
+        if (bodyLength >= printableLength
+                && bodyText.substring(bodyLength - printableLength)
+                .equals(printableVersion)) {
+            startPos = bodyLength - printableLength;
+        } else if (bodyLength >= signatureLength
+                && bodyText.substring(bodyLength - signatureLength)
+                .equals(signature)) {
+            startPos = bodyLength - signatureLength;
+        }
+        return startPos;
     }
 
     /**
@@ -1354,11 +1380,33 @@
 
     /**
      * Set the body of the message.
+     *
      * @param text
      * @param withSignature True to append a signature.
      */
     public void setBody(CharSequence text, boolean withSignature) {
         mBodyView.setText(text);
+        if (withSignature) {
+            appendSignature();
+        }
+    }
+
+    private void appendSignature() {
+        mSignature = mCachedSettings != null ? mCachedSettings.signature : null;
+        if (!TextUtils.isEmpty(mSignature)) {
+            // Appending a signature does not count as changing text.
+            mBodyView.removeTextChangedListener(this);
+            mBodyView.append(convertToPrintableSignature(mSignature));
+            mBodyView.addTextChangedListener(this);
+        }
+    }
+
+    private String convertToPrintableSignature(String signature) {
+        String signatureResource = getResources().getString(R.string.signature);
+        if (signature == null) {
+            signature = "";
+        }
+        return String.format(signatureResource, signature);
     }
 
     @Override
@@ -1610,6 +1658,7 @@
             if (data != null) {
                 data.moveToFirst();
                 mCachedSettings = new Settings(data);
+                appendSignature();
             }
         }
     }