diff --git a/app/src/main/java/de/joel/zoomhelper/Attendee.java b/app/src/main/java/de/joel/zoomhelper/Attendee.java index b412c50..efe95e1 100644 --- a/app/src/main/java/de/joel/zoomhelper/Attendee.java +++ b/app/src/main/java/de/joel/zoomhelper/Attendee.java @@ -4,8 +4,24 @@ import java.io.Serializable; public class Attendee implements Serializable { private static final long serialVersionUID = 6196688086302483907L; - public String name; - public String num; + private String name; + private String num; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNum() { + return num; + } + + public void setNum(String num) { + this.num = num; + } public Attendee(String name, String num) { this.name = name; diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java index bb12c0b..9990ea2 100644 --- a/app/src/main/java/de/joel/zoomhelper/MainActivity.java +++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java @@ -27,15 +27,13 @@ import com.google.android.material.textfield.TextInputLayout; import java.util.ArrayList; import java.util.Arrays; -import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN; public class MainActivity extends AppCompatActivity { private final MeetingsController meetingsController = new MeetingsController(this); + private final MeetingImportController meetingImportController = new MeetingImportController(meetingsController, this); @Override protected void onCreate(Bundle savedInstanceState) { @@ -63,13 +61,13 @@ public class MainActivity extends AppCompatActivity { //add event listeners to views saveIcon.setOnClickListener(v -> saveMeetingFromUI()); - trashIcon.setOnClickListener(v -> meetingsController.removeMeeting(meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().meetingName))); + trashIcon.setOnClickListener(v -> meetingsController.removeMeeting(meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().getMeetingName()))); AttIcon.setOnClickListener(v -> btnJoin_onClick(null)); AddIcon.setOnClickListener(v -> { fillBlank(); meetingID.requestFocus(); }); - ShareIcon.setOnClickListener(v -> shareMeeting(createCurrMeetingFromUI())); + ShareIcon.setOnClickListener(v -> startActivity(createCurrMeetingFromUI().share())); ShortcutIcon.setOnClickListener(v -> showCreateShortcutUI()); //show alert if meeting from shortcut not found @@ -117,7 +115,7 @@ public class MainActivity extends AppCompatActivity { //handle meeting invitation text sent to ZoomHelper if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { - handleSendText(myIntent); + meetingImportController.handleSendText(myIntent); } } @@ -150,87 +148,22 @@ public class MainActivity extends AppCompatActivity { final Snackbar snackbar = Snackbar.make(layoutBegin, R.string.foundImportableMeetingClipboard, Snackbar.LENGTH_INDEFINITE).setDuration(7000); snackbar.setAction(R.string.importMeeting, view -> { String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString(); - handleSendText(text); + meetingImportController.handleSendText(text); ClipData clipData = ClipData.newPlainText("", ""); clipboard.setPrimaryClip(clipData); }); if (clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN)) { final String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString(); - if (handleSendText(text, true)) { + if ( meetingImportController.handleSendText(text, true)) { snackbar.show(); } } } - private void handleSendText(Intent intent) { - final String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); - handleSendText(sharedText); - } - - private void handleSendText(String sharedText) { - handleSendText(sharedText, false); - } - - private boolean handleSendText(String sharedText, boolean checkOnly) { - String meetingID = ""; - String meetingPWD = ""; - String meetingName = ""; - - if (sharedText != null) { - Matcher matcher = Pattern.compile("(?i)(?<=(Meeting-ID:)|(Meeting\\sID:)|(ID:)).+").matcher(sharedText); - if (matcher.find()) { - meetingID = Objects.requireNonNull(matcher.group(0)).trim(); - } - matcher = Pattern.compile("(?i)(?<=(Kenncode:)|(Passwort:)|(Passcode:)|(Password:)).+").matcher(sharedText); - if (matcher.find()) { - meetingPWD = Objects.requireNonNull(matcher.group(0)).trim(); - } - matcher = Pattern.compile("(?i)(?<=(Thema:)|(Meeting\\sName:)|(Topic:)).+").matcher(sharedText); - if (matcher.find()) { - meetingName = Objects.requireNonNull(matcher.group(0)).trim(); - } - - final AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setTitle(R.string.app_name); - builder.setMessage(R.string.meetingAlreadyExists); - - if (meetingID.equals("")) { - builder.setMessage(R.string.importError); - builder.setPositiveButton(R.string.ok, (dialog, which) -> dialog.dismiss()); - final AlertDialog alert = builder.create(); - if (!checkOnly) alert.show(); - return false; - } else { - - final Meeting mtgToImport = new Meeting(meetingName, meetingID, meetingPWD, "", ""); - - if (meetingsController.searchMeetingInList(meetingsController.getMeetings(), mtgToImport.meetingName) == -1 && !checkOnly) { - fillMeeting(mtgToImport); - } else { - builder.setPositiveButton(R.string.override, (dialog, which) -> { - final int found = meetingsController.searchMeetingInList(meetingsController.getMeetings(), mtgToImport.meetingName); - importMeeting(mtgToImport, false); - fillMeeting(found); - dialog.dismiss(); - }); - builder.setNegativeButton(R.string.rename, (dialog, which) -> { - mtgToImport.meetingName = ""; - fillMeeting(mtgToImport); - dialog.dismiss(); - }); - final AlertDialog alert = builder.create(); - if (!checkOnly) alert.show(); - return true; - } - } - } - return true; - } - private void showCreateShortcutUI() { - final int meeting = meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().meetingName); + final int meeting = meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().getMeetingName()); final AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -265,14 +198,14 @@ public class MainActivity extends AppCompatActivity { final Meeting meeting = meetingsController.getMeetings().get(meetingIndex); if (ShortcutManagerCompat.isRequestPinShortcutSupported(this)) { - ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(this, meeting.meetingName) - .setShortLabel(meeting.meetingName) - .setLongLabel(meeting.meetingName) + ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(this, meeting.getMeetingName()) + .setShortLabel(meeting.getMeetingName()) + .setLongLabel(meeting.getMeetingName()) .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher)) .setIntents(new Intent[]{ new Intent(this, MainActivity.class) .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - .putExtra("meetingName", meeting.meetingName) + .putExtra("meetingName", meeting.getMeetingName()) .putExtra("joinImmediately", joinImmediately) .setAction("LOCATION_SHORTCUT"), }) @@ -283,16 +216,6 @@ public class MainActivity extends AppCompatActivity { } } - private void shareMeeting(Meeting meeting) { - final Intent sendIntent = new Intent(); - sendIntent.setAction(Intent.ACTION_SEND); - sendIntent.putExtra(Intent.EXTRA_TEXT, meeting.info()); - sendIntent.setType("text/plain"); - - final Intent shareIntent = Intent.createChooser(sendIntent, null); - startActivity(shareIntent); - } - public void fillBlank() { final EditText editMeetingName = findViewById(R.id.TextMeetingName); final EditText editID = findViewById(R.id.textBoxID); @@ -322,7 +245,7 @@ public class MainActivity extends AppCompatActivity { String[] meetingNames = new String[meetings.size()]; for (int i = 0; i < meetings.size(); i++) { - meetingNames[i] = meetings.get(i).meetingName; + meetingNames[i] = meetings.get(i).getMeetingName(); } final AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); @@ -338,11 +261,11 @@ public class MainActivity extends AppCompatActivity { @SuppressLint("ClickableViewAccessibility") public void fillDropdownAttendeeName(int meetingIndex) { final Meeting meeting = meetingsController.getMeetings().get(meetingIndex); - final ArrayList attendees = meeting.attendees; + final ArrayList attendees = meeting.getAttendees(); String[] attNames = new String[attendees.size()]; for (int i = 0; i < attendees.size(); i++) { - attNames[i] = attendees.get(i).name; + attNames[i] = attendees.get(i).getName(); } final AutoCompleteTextView textName = findViewById(R.id.textBoxName); @@ -360,7 +283,7 @@ public class MainActivity extends AppCompatActivity { final AutoCompleteTextView textName = findViewById(R.id.textBoxName); final EditText editAtt = findViewById(R.id.editAtt); final int found = meetingsController.getMeetings().get(meetingIndex).searchAttendee(textName.getText().toString()); - editAtt.setText(meetingsController.getMeetings().get(meetingIndex).attendees.get(found).num); + editAtt.setText(meetingsController.getMeetings().get(meetingIndex).getAttendees().get(found).getNum()); } public void fillMeeting(Meeting meeting) { @@ -374,11 +297,11 @@ public class MainActivity extends AppCompatActivity { editID.clearFocus(); - editMeetingName.setText(meeting.meetingName); - editID.setText(meeting.meetingID); - editPW.setText(meeting.meetingPWD); - editName.setText(meeting.attendees.get(meeting.lastAtt).name); - editAtt.setText(meeting.attendees.get(meeting.lastAtt).num); + editMeetingName.setText(meeting.getMeetingName()); + editID.setText(meeting.getMeetingID()); + editPW.setText(meeting.getMeetingPWD()); + editName.setText(meeting.getAttendees().get(meeting.getLastAtt()).getName()); + editAtt.setText(meeting.getAttendees().get(meeting.getLastAtt()).getNum()); } public void fillMeeting(int id) { @@ -406,50 +329,19 @@ public class MainActivity extends AppCompatActivity { return new Meeting(editMeetingName.getText().toString(), editID.getText().toString(), editPW.getText().toString(), editName.getText().toString(), editAtt.getText().toString()); } - public void importMeeting(Meeting meeting, boolean updateAttendee) { - final ArrayList listMeetings = meetingsController.getMeetings(); - final int foundCurr = meetingsController.searchMeetingInList(listMeetings, meeting.meetingName); - - if (foundCurr == -1) { - listMeetings.add(meeting); - if (listMeetings.size() == 1) { - meetingsController.setLastMeeting(0); - } else { - meetingsController.setLastMeeting(listMeetings.size() - 1); - } - - } else { - final Meeting currMeeting = meetingsController.getMeetings().get(foundCurr); - currMeeting.meetingID = meeting.meetingID; - currMeeting.meetingPWD = meeting.meetingPWD; - if (updateAttendee) - currMeeting.updateAttendee(meeting.attendees.get(0).name, meeting.attendees.get(0).num); - listMeetings.set(foundCurr, currMeeting); - meetingsController.setLastMeeting(foundCurr); - } - meetingsController.saveMeetingList(listMeetings); - fillDropdownMeetingName(); - fillDropdownAttendeeName(meetingsController.getLastMeeting()); - Toast.makeText(getApplicationContext(), R.string.meetingSaved, Toast.LENGTH_SHORT).show(); - } - - public void importMeeting(Meeting meeting) { - importMeeting(meeting, true); - } - public void saveMeetingFromUI() { final Meeting currMeetingUI = createCurrMeetingFromUI(); - if (currMeetingUI.meetingID.equals("")) { + if (currMeetingUI.getMeetingID().equals("")) { final EditText editID = findViewById(R.id.textBoxID); editID.requestFocus(); editID.setError(getString(R.string.meetingWithoutID)); return; - } else if (currMeetingUI.meetingName.equals("")) { + } else if (currMeetingUI.getMeetingName().equals("")) { final EditText editMName = findViewById(R.id.TextMeetingName); - editMName.setText(currMeetingUI.meetingID); - currMeetingUI.meetingName = currMeetingUI.meetingID; + editMName.setText(currMeetingUI.getMeetingID()); + currMeetingUI.setMeetingName(currMeetingUI.getMeetingID()); } - importMeeting(currMeetingUI); + meetingImportController.importMeeting(createCurrMeetingFromUI()); } } \ No newline at end of file diff --git a/app/src/main/java/de/joel/zoomhelper/Meeting.java b/app/src/main/java/de/joel/zoomhelper/Meeting.java index 15936fb..ab37c2a 100644 --- a/app/src/main/java/de/joel/zoomhelper/Meeting.java +++ b/app/src/main/java/de/joel/zoomhelper/Meeting.java @@ -1,15 +1,57 @@ package de.joel.zoomhelper; +import android.content.Intent; + import java.io.Serializable; import java.util.ArrayList; public class Meeting implements Serializable { private static final long serialVersionUID = 2606722401897866931L; - public String meetingName; - public String meetingID; - public String meetingPWD; - public ArrayList attendees; - public int lastAtt; + private String meetingName; + private String meetingID; + private String meetingPWD; + private ArrayList attendees; + private int lastAtt; + + public String getMeetingName() { + return meetingName; + } + + public void setMeetingName(String meetingName) { + this.meetingName = meetingName; + } + + public String getMeetingID() { + return meetingID; + } + + public void setMeetingID(String meetingID) { + this.meetingID = meetingID; + } + + public String getMeetingPWD() { + return meetingPWD; + } + + public void setMeetingPWD(String meetingPWD) { + this.meetingPWD = meetingPWD; + } + + public ArrayList getAttendees() { + return attendees; + } + + public void setAttendees(ArrayList attendees) { + this.attendees = attendees; + } + + public int getLastAtt() { + return lastAtt; + } + + public void setLastAtt(int lastAtt) { + this.lastAtt = lastAtt; + } public Meeting(String meetingName, String meetingID, String meetingPWD, String nameAttendee, String numAttendee) { this.meetingName = meetingName; @@ -30,7 +72,7 @@ public class Meeting implements Serializable { public int searchAttendee(String name) { int found = -1; for (int i = 0; i < this.attendees.size(); i++) { - if (this.attendees.get(i).name.equals(name)) { + if (this.attendees.get(i).getName().equals(name)) { found = i; break; } @@ -45,7 +87,7 @@ public class Meeting implements Serializable { if (found == -1) { addAttendee(name, num); } else { - this.attendees.get(found).num = num; + this.attendees.get(found).setNum(num); this.lastAtt = found; } } @@ -55,4 +97,13 @@ public class Meeting implements Serializable { "Meeting-ID: " + this.meetingID + "\n" + "Kenncode: " + this.meetingPWD; } + + public Intent share() { + final Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, this.info()); + sendIntent.setType("text/plain"); + + return Intent.createChooser(sendIntent, null); + } } \ No newline at end of file diff --git a/app/src/main/java/de/joel/zoomhelper/MeetingImportController.java b/app/src/main/java/de/joel/zoomhelper/MeetingImportController.java new file mode 100644 index 0000000..8e955b9 --- /dev/null +++ b/app/src/main/java/de/joel/zoomhelper/MeetingImportController.java @@ -0,0 +1,118 @@ +package de.joel.zoomhelper; + +import android.content.Intent; +import android.widget.Toast; + +import androidx.appcompat.app.AlertDialog; + +import java.util.ArrayList; +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MeetingImportController { + private final MeetingsController meetingsController; + private final MainActivity act; + + public MeetingImportController(MeetingsController meetingsController, MainActivity act) { + this.meetingsController = meetingsController; + this.act = act; + } + + public void handleSendText(Intent intent) { + final String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); + handleSendText(sharedText); + } + + public void handleSendText(String sharedText) { + handleSendText(sharedText, false); + } + + public boolean handleSendText(String sharedText, boolean checkOnly) { + String meetingID = ""; + String meetingPWD = ""; + String meetingName = ""; + + if (sharedText != null) { + Matcher matcher = Pattern.compile("(?i)(?<=(Meeting-ID:)|(Meeting\\sID:)|(ID:)).+").matcher(sharedText); + if (matcher.find()) { + meetingID = Objects.requireNonNull(matcher.group(0)).trim(); + } + matcher = Pattern.compile("(?i)(?<=(Kenncode:)|(Passwort:)|(Passcode:)|(Password:)).+").matcher(sharedText); + if (matcher.find()) { + meetingPWD = Objects.requireNonNull(matcher.group(0)).trim(); + } + matcher = Pattern.compile("(?i)(?<=(Thema:)|(Meeting\\sName:)|(Topic:)).+").matcher(sharedText); + if (matcher.find()) { + meetingName = Objects.requireNonNull(matcher.group(0)).trim(); + } + + final AlertDialog.Builder builder = new AlertDialog.Builder(act); + builder.setTitle(R.string.app_name); + builder.setMessage(R.string.meetingAlreadyExists); + + if (meetingID.equals("")) { + builder.setMessage(R.string.importError); + builder.setPositiveButton(R.string.ok, (dialog, which) -> dialog.dismiss()); + final AlertDialog alert = builder.create(); + if (!checkOnly) alert.show(); + return false; + } else { + + final Meeting mtgToImport = new Meeting(meetingName, meetingID, meetingPWD, "", ""); + + if (meetingsController.searchMeetingInList(meetingsController.getMeetings(), mtgToImport.getMeetingName()) == -1 && !checkOnly) { + act.fillMeeting(mtgToImport); + } else { + builder.setPositiveButton(R.string.override, (dialog, which) -> { + final int found = meetingsController.searchMeetingInList(meetingsController.getMeetings(), mtgToImport.getMeetingName()); + importMeeting(mtgToImport, false); + act.fillMeeting(found); + dialog.dismiss(); + }); + builder.setNegativeButton(R.string.rename, (dialog, which) -> { + mtgToImport.setMeetingName(""); + act.fillMeeting(mtgToImport); + dialog.dismiss(); + }); + final AlertDialog alert = builder.create(); + if (!checkOnly) alert.show(); + return true; + } + } + } + return true; + } + + public void importMeeting(Meeting meeting, boolean updateAttendee) { + final ArrayList listMeetings = meetingsController.getMeetings(); + final int foundCurr = meetingsController.searchMeetingInList(listMeetings, meeting.getMeetingName()); + + if (foundCurr == -1) { + listMeetings.add(meeting); + if (listMeetings.size() == 1) { + meetingsController.setLastMeeting(0); + } else { + meetingsController.setLastMeeting(listMeetings.size() - 1); + } + + } else { + final Meeting currMeeting = meetingsController.getMeetings().get(foundCurr); + currMeeting.setMeetingID(meeting.getMeetingID()); + currMeeting.setMeetingPWD(meeting.getMeetingPWD()); + if (updateAttendee) + currMeeting.updateAttendee(meeting.getAttendees().get(0).getName(), meeting.getAttendees().get(0).getNum()); + listMeetings.set(foundCurr, currMeeting); + meetingsController.setLastMeeting(foundCurr); + } + meetingsController.saveMeetingList(listMeetings); + act.fillDropdownMeetingName(); + act.fillDropdownAttendeeName(meetingsController.getLastMeeting()); + Toast.makeText(act, R.string.meetingSaved, Toast.LENGTH_SHORT).show(); + } + + public void importMeeting(Meeting meeting) { + importMeeting(meeting, true); + } + +} diff --git a/app/src/main/java/de/joel/zoomhelper/MeetingsController.java b/app/src/main/java/de/joel/zoomhelper/MeetingsController.java index 4fe5797..2007592 100644 --- a/app/src/main/java/de/joel/zoomhelper/MeetingsController.java +++ b/app/src/main/java/de/joel/zoomhelper/MeetingsController.java @@ -127,7 +127,7 @@ public class MeetingsController { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(R.string.app_name); - builder.setMessage(context.getString(R.string.suretoremove, meetings.get(meeting).meetingName)); + builder.setMessage(context.getString(R.string.suretoremove, meetings.get(meeting).getMeetingName())); builder.setPositiveButton(R.string.yes, (dialog, which) -> { dialog.dismiss(); @@ -162,7 +162,7 @@ public class MeetingsController { public int searchMeetingInList(ArrayList meetings, String name) { int found = -1; for (int i = 0; i < meetings.size(); i++) { - if (meetings.get(i).meetingName.equals(name)) { + if (meetings.get(i).getMeetingName().equals(name)) { found = i; break; } diff --git a/app/src/main/java/de/joel/zoomhelper/ZoomLink.java b/app/src/main/java/de/joel/zoomhelper/ZoomLink.java index 1675eda..bdf7479 100644 --- a/app/src/main/java/de/joel/zoomhelper/ZoomLink.java +++ b/app/src/main/java/de/joel/zoomhelper/ZoomLink.java @@ -23,13 +23,13 @@ public class ZoomLink { builder.scheme("zoomus") .authority("zoom.us") .appendPath("join") - .appendQueryParameter("confno", this.meeting.meetingID.replace(" ", "")) - .appendQueryParameter("pwd", this.meeting.meetingPWD); + .appendQueryParameter("confno", this.meeting.getMeetingID().replace(" ", "")) + .appendQueryParameter("pwd", this.meeting.getMeetingPWD()); - if (!Objects.equals(this.meeting.attendees.get(this.meeting.lastAtt).num, "")) { - builder.appendQueryParameter("uname", this.meeting.attendees.get(this.meeting.lastAtt).name + " (" + this.meeting.attendees.get(this.meeting.lastAtt).num + ")"); + if (!Objects.equals(this.meeting.getAttendees().get(this.meeting.getLastAtt()).getNum(), "")) { + builder.appendQueryParameter("uname", this.meeting.getAttendees().get(this.meeting.getLastAtt()).getName() + " (" + this.meeting.getAttendees().get(this.meeting.getLastAtt()).getNum() + ")"); } else - builder.appendQueryParameter("uname", this.meeting.attendees.get(this.meeting.lastAtt).name); + builder.appendQueryParameter("uname", this.meeting.getAttendees().get(this.meeting.getLastAtt()).getName()); return builder.build().toString(); }