MessageCreateFragment.java 11 KB

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