MessageCreateFragment.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. package com.noahvogt.miniprojekt;
  2. import android.app.Activity;
  3. import android.content.Context;
  4. import android.content.SharedPreferences;
  5. import android.content.DialogInterface;
  6. import android.content.Intent;
  7. import android.os.Bundle;
  8. import android.view.LayoutInflater;
  9. import android.view.MenuItem;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.EditText;
  13. import android.widget.ImageButton;
  14. import android.widget.PopupMenu;
  15. import android.widget.Toast;
  16. import androidx.annotation.NonNull;
  17. import androidx.annotation.Nullable;
  18. import androidx.appcompat.app.AlertDialog;
  19. import androidx.fragment.app.DialogFragment;
  20. import com.google.gson.Gson;
  21. import com.google.gson.reflect.TypeToken;
  22. import com.noahvogt.miniprojekt.DataBase.Message;
  23. import com.noahvogt.miniprojekt.data.EmailViewModel;
  24. import com.noahvogt.miniprojekt.data.MailFunctions;
  25. import java.lang.reflect.Type;
  26. import java.util.ArrayList;
  27. import java.util.concurrent.ExecutorService;
  28. import java.util.concurrent.Executors;
  29. public class MessageCreateFragment extends DialogFragment implements PopupMenu.OnMenuItemClickListener {
  30. public static final String EXTRA_TO = "com.example.android.namelistsql.NAME";
  31. public static final String EXTRA_FROM = "com.example.android.namelistsql.FROM";
  32. public static final String EXTRA_SUBJECT = "com.example.android.namelistsql.SUBJECT";
  33. public static final String EXTRA_MESSAGE = "com.example.android.namelistsql.MESSAGE";
  34. public static final String EXTRA_CC = "com.example.android.namelistsql.CC";
  35. public static final String EXTRA_BCC = "com.example.android.namelistsql.BCC";
  36. public static final String EXTRA_DATE = "com.example.android.namelistsql.DATE";
  37. public EditText sendingAddressObject;
  38. public EditText receivingAddressObject;
  39. public EditText subjectObject;
  40. public EditText messageBodyObject;
  41. public EditText ccObject;
  42. public EditText bccObject;
  43. Message mMessage = null;
  44. public EmailViewModel mEmailViewModel = null;
  45. public static final int RESULT_CANCELED = 0;
  46. public static final int RESULT_OK = -1;
  47. public Activity activity = new Activity();
  48. public static Intent replyIntent = new Intent();
  49. public static MessageCreateFragment newInstance() {
  50. return new MessageCreateFragment();
  51. }
  52. public MessageCreateFragment getMessage(Message message, EmailViewModel emailViewModel, MessageCreateFragment messageCreateFragment){
  53. this.mEmailViewModel = emailViewModel;
  54. this.mMessage = message;
  55. return messageCreateFragment;
  56. }
  57. private AlertDialog dialog;
  58. private static final int NUMBER_OF_THREADS = 4;
  59. static final ExecutorService databaseWriteExecutor =
  60. Executors.newFixedThreadPool(NUMBER_OF_THREADS);
  61. /* set theming style */
  62. @Override
  63. public void onCreate(@Nullable Bundle savedInstanceState) {
  64. super.onCreate(savedInstanceState);
  65. setStyle(DialogFragment.STYLE_NORMAL, R.style.messageCreateTheme);
  66. }
  67. @Nullable
  68. @Override
  69. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  70. /* set and inflate layout */
  71. View view = inflater.inflate(R.layout.message_create_fragment, container, false);
  72. /* init vars */
  73. ImageButton closeButton = view.findViewById(R.id.create_message_close_button);
  74. final ImageButton sendButton = view.findViewById(R.id.create_message_send_button);
  75. ImageButton dotButton = view.findViewById(R.id.create_message_dots_button);
  76. ImageButton attachButton = view.findViewById(R.id.create_message_attach_button);
  77. sendingAddressObject = (EditText) view.findViewById(R.id.create_message_sending_address_text);
  78. receivingAddressObject = (EditText) view.findViewById(R.id.create_message_receiving_address_text);
  79. ccObject = (EditText) view.findViewById(R.id.create_message_cc_text);
  80. bccObject = (EditText) view.findViewById(R.id.create_message_bcc_text);
  81. subjectObject = (EditText) view.findViewById(R.id.create_message_subject_text);
  82. messageBodyObject = (EditText) view.findViewById(R.id.create_message_body_text);
  83. SharedPreferences mailServerCredentials = getContext().getSharedPreferences("Credentials", Context.MODE_PRIVATE);
  84. /* set logged in email address as sending address */
  85. String currentMailUser = mailServerCredentials.getString("currentUser", "");
  86. sendingAddressObject.setText(currentMailUser);
  87. /* get string vars, MAYBE NOT HERE */
  88. if (mMessage != null) {
  89. sendingAddressObject.setText(mMessage.getFrom());
  90. receivingAddressObject.setText(mMessage.getTo());
  91. subjectObject.setText(mMessage.getSubject());
  92. messageBodyObject.setText(mMessage.getTextContent());
  93. bccObject.setText(mMessage.getBcc());
  94. ccObject.setText(mMessage.getCc());
  95. }
  96. /* TODO: add cc + bcc functionality */
  97. /* doesn't work cause Activity is not extended and used as variable */
  98. /* button listeners */
  99. closeButton.setOnClickListener(new View.OnClickListener() {
  100. @Override
  101. public void onClick(View v) {
  102. String subject = subjectObject.getText().toString();
  103. String messageBody = messageBodyObject.getText().toString();
  104. /* give alert dialog box to user in case input fields are not empty */
  105. if (subject.isEmpty() && messageBody.isEmpty()) {
  106. dismiss();
  107. }
  108. else {
  109. /* setup dialog for saving draft message */
  110. AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
  111. alertDialogBuilder.setTitle("Warning");
  112. alertDialogBuilder
  113. .setMessage("Do you want to save your Draft?")
  114. .setCancelable(false)
  115. .setPositiveButton("Yes",new DialogInterface.OnClickListener() {
  116. public void onClick(DialogInterface dialog, int id) {
  117. activity.setResult(RESULT_CANCELED, replyIntent);
  118. String from = sendingAddressObject.getText().toString();
  119. String to = receivingAddressObject.getText().toString();
  120. String subject = subjectObject.getText().toString();
  121. String message = messageBodyObject.getText().toString();
  122. String cc = ccObject.getText().toString();
  123. String bcc = bccObject.getText().toString();
  124. replyIntent.putExtra(EXTRA_FROM, from);
  125. replyIntent.putExtra(EXTRA_TO, to);
  126. replyIntent.putExtra(EXTRA_CC, cc);
  127. replyIntent.putExtra(EXTRA_BCC, bcc);
  128. replyIntent.putExtra(EXTRA_SUBJECT, subject);
  129. replyIntent.putExtra(EXTRA_MESSAGE, message);
  130. activity.setResult(RESULT_OK, replyIntent);
  131. activity.finish();
  132. Intent intent = new Intent(getContext(), NewDraftMessageActivity.class);
  133. startActivityForResult(intent, MainActivity.NEW_WORD_ACTIVITY_REQUEST_CODE);
  134. /* close the whole fragment */
  135. dismiss();
  136. }
  137. })
  138. .setNegativeButton("No",new DialogInterface.OnClickListener() {
  139. public void onClick(DialogInterface dialog,int id) {
  140. /* if this button is clicked, close the hole fragment */
  141. dismiss();
  142. }
  143. });
  144. /* create + show alert dialog */
  145. AlertDialog alertDialog = alertDialogBuilder.create();
  146. alertDialog.show();
  147. }
  148. }
  149. });
  150. attachButton.setOnClickListener(new View.OnClickListener() {
  151. @Override
  152. public void onClick(View v) {
  153. /* TODO: add file attachment functionality */
  154. }
  155. });
  156. dotButton.setOnClickListener(new View.OnClickListener() {
  157. @Override
  158. public void onClick(View v) {
  159. PopupMenu popupMenu = new PopupMenu(getActivity(), v);
  160. popupMenu.setOnMenuItemClickListener(MessageCreateFragment.this::onMenuItemClick);
  161. popupMenu.inflate(R.menu.create_message_options_menu);
  162. popupMenu.show();
  163. }
  164. });
  165. sendButton.setOnClickListener(new View.OnClickListener() {
  166. @Override
  167. public void onClick(View v) {
  168. /* init vars, MAYBE NEEDED FOR LATER */
  169. String sendingAddress = sendingAddressObject.getText().toString();
  170. String receivingAddress = receivingAddressObject.getText().toString();
  171. String subject = subjectObject.getText().toString();
  172. String messageBody = messageBodyObject.getText().toString();
  173. String ccStr = ccObject.getText().toString();
  174. String bccStr = bccObject.getText().toString();
  175. Gson gson = new Gson();
  176. /* get string vars, MAYBE NOT HERE */
  177. String jsonData = mailServerCredentials.getString("data", "");
  178. Type credentialsType = new TypeToken<ArrayList<MailServerCredentials>>(){}.getType();
  179. ArrayList<MailServerCredentials> allUsersCredentials = gson.fromJson(jsonData, credentialsType);
  180. String smtpHost = null, password = null; int smtpPort = 587;
  181. for (int i = 0; i < allUsersCredentials.size(); i++) {
  182. if (allUsersCredentials.get(i).getUsername().equals(currentMailUser)) {
  183. smtpHost = allUsersCredentials.get(i).getSmtpHost();
  184. smtpPort = allUsersCredentials.get(i).getSmtpPort();
  185. password = allUsersCredentials.get(i).getPassword();
  186. break;
  187. }
  188. }
  189. /* check for valid input */
  190. if (MailFunctions.validateMessageBody(messageBodyObject) && MailFunctions.validateSubject(subjectObject) &&
  191. MailFunctions.validateEmail(receivingAddressObject) && MailFunctions.validateEmail(sendingAddressObject) &&
  192. !MailFunctions.checkForSameEmail(sendingAddressObject, receivingAddressObject)) {
  193. MailFunctions.sendStarttlsMail(smtpHost, sendingAddress, receivingAddress, password, messageBody,
  194. subject, ccStr, bccStr, smtpPort);
  195. Toast.makeText(getActivity(), "sending ... ", Toast.LENGTH_SHORT).show();
  196. dismiss();
  197. } else {
  198. Toast.makeText(getActivity(), "Please check your input", Toast.LENGTH_SHORT).show();
  199. }
  200. }
  201. });
  202. return view;
  203. }
  204. /* TODO: add useful functionality to the menu + consider not using Resource ID's in switch statement
  205. IDEAS:
  206. - safe to draft
  207. - clear all user input
  208. - change / check email signature
  209. - some email header hacking / options / customization
  210. - mail server probing
  211. - sending address spoofer ??
  212. */
  213. @Override
  214. public boolean onMenuItemClick(MenuItem item) {
  215. switch (item.getItemId()) {
  216. case R.id.create_message_delete:
  217. Toast.makeText(getActivity(), "item 1 clicked", Toast.LENGTH_LONG).show();
  218. return true;
  219. case R.id.create_message_spam:
  220. Toast.makeText(getActivity(), "item 2 clicked", Toast.LENGTH_LONG).show();
  221. return true;
  222. default: /* this case should never occur */
  223. return false;
  224. }
  225. }
  226. }