Compare commits
13 Commits
6dbcb548b5
...
0.5.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 75b67ea2f0 | |||
| 355f7a7758 | |||
| 42a2c353c6 | |||
| a67ed4390b | |||
| f539bc3184 | |||
| 6eef26e116 | |||
| 719224003e | |||
| 7cce6f1280 | |||
| fe99d0a377 | |||
| 8dbd025c36 | |||
| c240223e98 | |||
| 1c68db62b1 | |||
| 1a8377b558 |
+13
@@ -0,0 +1,13 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="ConstantConditions" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="SUGGEST_NULLABLE_ANNOTATIONS" value="false" />
|
||||
<option name="DONT_REPORT_TRUE_ASSERT_STATEMENTS" value="false" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="SerializableHasSerialVersionUIDField" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="ignoreAnonymousInnerClasses" value="false" />
|
||||
<option name="superClassString" value="java.awt.Component" />
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
||||
+2
-2
@@ -10,8 +10,8 @@ android {
|
||||
applicationId "de.joel.zoomhelper"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
versionCode 14
|
||||
versionName '0.5.1 beta'
|
||||
versionCode 15
|
||||
versionName '0.5.1'
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
@@ -3,8 +3,25 @@ package de.joel.zoomhelper;
|
||||
import java.io.Serializable;
|
||||
|
||||
public class Attendee implements Serializable {
|
||||
public String name;
|
||||
public String num;
|
||||
private static final long serialVersionUID = 6196688086302483907L;
|
||||
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;
|
||||
|
||||
@@ -4,10 +4,8 @@ import android.annotation.SuppressLint;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.Base64;
|
||||
import android.view.View;
|
||||
import android.widget.AutoCompleteTextView;
|
||||
import android.widget.EditText;
|
||||
@@ -27,104 +25,107 @@ import com.github.javiersantos.appupdater.enums.UpdateFrom;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.google.android.material.textfield.TextInputLayout;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.EOFException;
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
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 {
|
||||
|
||||
public boolean testing;
|
||||
private final MeetingsController meetingsController = new MeetingsController(this);
|
||||
private final MeetingImportController meetingImportController = new MeetingImportController(meetingsController, this);
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
|
||||
Intent myIntent = getIntent(); // gets the previously created intent
|
||||
String action = myIntent.getAction();
|
||||
String type = myIntent.getType();
|
||||
|
||||
|
||||
String meetingName = myIntent.getStringExtra("meetingName");
|
||||
//get intent parameters
|
||||
final Intent myIntent = getIntent();
|
||||
final String action = myIntent.getAction();
|
||||
final String type = myIntent.getType();
|
||||
final String meetingName = myIntent.getStringExtra("meetingName");
|
||||
boolean joinImmediately = myIntent.getBooleanExtra("joinImmediately", false);
|
||||
testing = myIntent.getBooleanExtra("testing", false);
|
||||
|
||||
|
||||
//final boolean testing = myIntent.getBooleanExtra("testing", false);
|
||||
|
||||
setContentView(R.layout.activity_main);
|
||||
|
||||
//views
|
||||
final ScrollView scrollview = findViewById(R.id.scrollArea);
|
||||
final ImageView saveIcon = findViewById(R.id.imageSave);
|
||||
final ImageView trashIcon = findViewById(R.id.imageTrash);
|
||||
final ImageView AttIcon = findViewById(R.id.imageAttend);
|
||||
final ImageView AddIcon = findViewById(R.id.imageAdd);
|
||||
final EditText meetingID = findViewById(R.id.textBoxID);
|
||||
final ImageView ShareIcon = findViewById(R.id.imageShare);
|
||||
final ImageView ShortcutIcon = findViewById(R.id.imageCreateShortcut);
|
||||
|
||||
//add event listeners to views
|
||||
saveIcon.setOnClickListener(v -> saveMeetingFromUI());
|
||||
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 -> startActivity(createCurrMeetingFromUI().share()));
|
||||
ShortcutIcon.setOnClickListener(v -> showCreateShortcutUI());
|
||||
|
||||
int meetingIndex = searchMeetingInList(getMeetings(), meetingName);
|
||||
//show alert if meeting from shortcut not found
|
||||
final int meetingIndex = meetingsController.searchMeetingInList(meetingsController.getMeetings(), meetingName);
|
||||
if (meetingIndex == -1) {
|
||||
if (meetingName != null) {
|
||||
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
||||
final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
||||
dialog.setMessage(R.string.shortcutLaunchFailedText);
|
||||
dialog.setTitle(R.string.hint);
|
||||
AlertDialog alertDialog = dialog.create();
|
||||
final AlertDialog alertDialog = dialog.create();
|
||||
alertDialog.show();
|
||||
}
|
||||
joinImmediately = false;
|
||||
}
|
||||
|
||||
if (meetingIndex <= getMeetings().size() && meetingIndex != -1) {
|
||||
setLastMeeting(meetingIndex);
|
||||
AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName);
|
||||
//adjust ui for meeting from shortcut
|
||||
if (meetingIndex <= meetingsController.getMeetings().size() && meetingIndex != -1) {
|
||||
meetingsController.setLastMeeting(meetingIndex);
|
||||
final AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName);
|
||||
textMeetingName.setEnabled(false);
|
||||
textMeetingName.setAdapter(null);
|
||||
ImageView imageTrash = findViewById(R.id.imageTrash);
|
||||
imageTrash.setVisibility(View.GONE);
|
||||
TextInputLayout layoutMeetingName = findViewById(R.id.layoutMeetingName);
|
||||
trashIcon.setVisibility(View.GONE);
|
||||
final TextInputLayout layoutMeetingName = findViewById(R.id.layoutMeetingName);
|
||||
layoutMeetingName.setEndIconMode(TextInputLayout.END_ICON_NONE);
|
||||
}
|
||||
|
||||
|
||||
//watchMeetingNameBox();
|
||||
fillDropdownMeetingName();
|
||||
/*if (getLastMeeting() != -1) {
|
||||
|
||||
//fill ui with data from last selected meeting or show error if config version changed or index out of bounds
|
||||
if (meetingsController.getLastMeeting() != -1) {
|
||||
try {
|
||||
fillMeeting(getLastMeeting());
|
||||
fillMeeting(meetingsController.getLastMeeting());
|
||||
scrollview.post(() -> scrollview.scrollTo(0, scrollview.getChildAt(0).getHeight()));
|
||||
} catch (IndexOutOfBoundsException e) {
|
||||
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
||||
final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
||||
dialog.setMessage(R.string.resetDataText);
|
||||
dialog.setTitle(R.string.hint);
|
||||
AlertDialog alertDialog = dialog.create();
|
||||
final AlertDialog alertDialog = dialog.create();
|
||||
alertDialog.show();
|
||||
setLastMeeting(-1);
|
||||
saveMeetingList(new ArrayList<>());
|
||||
}
|
||||
}*/
|
||||
watchSaveIcon();
|
||||
watchAttIcon();
|
||||
watchDeleteIcon();
|
||||
watchNewIcon();
|
||||
watchShareIcon();
|
||||
watchShortcutIcon();
|
||||
|
||||
if (Intent.ACTION_SEND.equals(action) && type != null) {
|
||||
if ("text/plain".equals(type)) {
|
||||
handleSendText(myIntent); // Handle text being sent
|
||||
meetingsController.setLastMeeting(-1);
|
||||
meetingsController.saveMeetingList(new ArrayList<>());
|
||||
}
|
||||
}
|
||||
|
||||
//handle meeting invitation text sent to ZoomHelper
|
||||
if (Intent.ACTION_SEND.equals(action) && type != null) {
|
||||
if ("text/plain".equals(type)) {
|
||||
meetingImportController.handleSendText(myIntent);
|
||||
}
|
||||
}
|
||||
|
||||
//join meeting immediately, otherwise enable app updater
|
||||
if (joinImmediately) {
|
||||
Meeting currMeeting = getMeetings().get(meetingIndex);
|
||||
String url = buildZoomURL(currMeeting.meetingID, currMeeting.meetingPWD, currMeeting.attendees.get(currMeeting.lastAtt).name, currMeeting.attendees.get(currMeeting.lastAtt).num);
|
||||
launchZoomUrl(url);
|
||||
final Meeting currMeeting = meetingsController.getMeetings().get(meetingIndex);
|
||||
new ZoomLink(this, currMeeting).launch();
|
||||
} else {
|
||||
AppUpdater appUpdater = new AppUpdater(this).setUpdateFrom(UpdateFrom.XML).setUpdateXML("https://baldaufwd.de/ZoomHelper/updatetest.xml");
|
||||
APKDownloader apkDownloader = new APKDownloader();
|
||||
final AppUpdater appUpdater = new AppUpdater(this).setUpdateFrom(UpdateFrom.XML).setUpdateXML("https://baldaufwd.de/ZoomHelper/update.xml");
|
||||
final APKDownloader apkDownloader = new APKDownloader();
|
||||
appUpdater.setButtonUpdateClickListener((dialog, which) -> apkDownloader.downloadAPK(this, "ZoomHelper.apk", Uri.parse("https://baldaufwd.de/ZoomHelper/ZoomHelper.apk")));
|
||||
appUpdater.start();
|
||||
}
|
||||
@@ -132,110 +133,38 @@ public class MainActivity extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
public void onWindowFocusChanged(boolean hasFocus) {
|
||||
//check for importable meeting invitation from clipboard when ZoomHelper gained focus
|
||||
super.onWindowFocusChanged(hasFocus);
|
||||
if (hasFocus) {
|
||||
importFromClipboard();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void importFromClipboard() {
|
||||
LinearLayout layoutBegin = findViewById(R.id.layoutBegin);
|
||||
ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
|
||||
final LinearLayout layoutBegin = findViewById(R.id.layoutBegin);
|
||||
final ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
|
||||
|
||||
Snackbar snackbar = Snackbar.make(layoutBegin,R.string.foundImportableMeetingClipboard,Snackbar.LENGTH_INDEFINITE).setDuration(7000);
|
||||
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)) {
|
||||
String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString();
|
||||
if (handleSendText(text, true)) {
|
||||
final String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString();
|
||||
if ( meetingImportController.handleSendText(text, true)) {
|
||||
snackbar.show();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private void handleSendText(Intent intent) {
|
||||
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 = matcher.group(0).trim();
|
||||
}
|
||||
matcher = Pattern.compile("(?i)(?<=(Kenncode:)|(Passwort:)|(Passcode:)|(Password:)).+").matcher(sharedText);
|
||||
if (matcher.find()) {
|
||||
meetingPWD = matcher.group(0).trim();
|
||||
}
|
||||
matcher = Pattern.compile("(?i)(?<=(Thema:)|(Meeting\\sName:)|(Topic:)).+").matcher(sharedText);
|
||||
if (matcher.find()) {
|
||||
meetingName = matcher.group(0).trim();
|
||||
}
|
||||
|
||||
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();
|
||||
});
|
||||
AlertDialog alert = builder.create();
|
||||
if (!checkOnly) alert.show();
|
||||
return false;
|
||||
} else {
|
||||
|
||||
Meeting mtgToImport = new Meeting(meetingName, meetingID, meetingPWD, "", "");
|
||||
|
||||
if (searchMeetingInList(getMeetings(), mtgToImport.meetingName) == -1 && !checkOnly) {
|
||||
fillMeeting(mtgToImport);
|
||||
} else {
|
||||
builder.setPositiveButton(R.string.override, (dialog, which) -> {
|
||||
int found = searchMeetingInList(getMeetings(), mtgToImport.meetingName);
|
||||
importMeeting(mtgToImport, false);
|
||||
fillMeeting(found);
|
||||
dialog.dismiss();
|
||||
});
|
||||
builder.setNegativeButton(R.string.rename, (dialog, which) -> {
|
||||
mtgToImport.meetingName = "";
|
||||
fillMeeting(mtgToImport);
|
||||
dialog.dismiss();
|
||||
});
|
||||
AlertDialog alert = builder.create();
|
||||
if (!checkOnly) alert.show();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void watchShortcutIcon() {
|
||||
ImageView ShortcutIcon = findViewById(R.id.imageCreateShortcut);
|
||||
ShortcutIcon.setOnClickListener(v -> showCreateShortcutUI());
|
||||
}
|
||||
|
||||
private void showCreateShortcutUI() {
|
||||
int meeting = searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName);
|
||||
final int meeting = meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().getMeetingName());
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
|
||||
builder.setTitle(R.string.app_name);
|
||||
|
||||
@@ -247,11 +176,8 @@ public class MainActivity extends AppCompatActivity {
|
||||
showCreateShortcutUI();
|
||||
|
||||
});
|
||||
builder.setNegativeButton(R.string.cancel, (dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
});
|
||||
}
|
||||
else {
|
||||
builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
|
||||
} else {
|
||||
builder.setMessage(R.string.WantToJoinImmediately);
|
||||
builder.setPositiveButton(R.string.joinImmediately, (dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
@@ -263,25 +189,22 @@ public class MainActivity extends AppCompatActivity {
|
||||
createMeetingShortcut(meeting, false);
|
||||
});
|
||||
}
|
||||
AlertDialog alert = builder.create();
|
||||
final AlertDialog alert = builder.create();
|
||||
alert.show();
|
||||
|
||||
//createMeetingShortcut(searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName), false);
|
||||
}
|
||||
|
||||
private void createMeetingShortcut(int meetingIndex, boolean joinImmediately) {
|
||||
|
||||
Meeting meeting = getMeetings().get(meetingIndex);
|
||||
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"),
|
||||
})
|
||||
@@ -292,87 +215,12 @@ public class MainActivity extends AppCompatActivity {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void watchShareIcon() {
|
||||
ImageView ShareIcon = findViewById(R.id.imageShare);
|
||||
ShareIcon.setOnClickListener(v -> shareMeeting(createCurrMeetingFromUI()));
|
||||
}
|
||||
|
||||
private void shareMeeting(Meeting meeting) {
|
||||
Intent sendIntent = new Intent();
|
||||
sendIntent.setAction(Intent.ACTION_SEND);
|
||||
sendIntent.putExtra(Intent.EXTRA_TEXT, meeting.info());
|
||||
sendIntent.setType("text/plain");
|
||||
|
||||
Intent shareIntent = Intent.createChooser(sendIntent, null);
|
||||
startActivity(shareIntent);
|
||||
}
|
||||
|
||||
private void watchNewIcon() {
|
||||
ImageView AddIcon = findViewById(R.id.imageAdd);
|
||||
EditText meetingID = findViewById(R.id.textBoxID);
|
||||
AddIcon.setOnClickListener(v -> {
|
||||
fillBlank();
|
||||
meetingID.requestFocus();
|
||||
});
|
||||
}
|
||||
|
||||
private void watchAttIcon() {
|
||||
ImageView AttIcon = findViewById(R.id.imageAttend);
|
||||
AttIcon.setOnClickListener(v -> btnJoin_onClick(null));
|
||||
}
|
||||
|
||||
private void watchDeleteIcon() {
|
||||
ImageView trashIcon = findViewById(R.id.imageTrash);
|
||||
trashIcon.setOnClickListener(v -> removeMeeting(searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName)));
|
||||
}
|
||||
|
||||
private void removeMeeting(int meeting) {
|
||||
ArrayList<Meeting> meetings = getMeetings();
|
||||
if (meetings.size() > 0 && meeting != -1) {
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
|
||||
builder.setTitle(R.string.app_name);
|
||||
builder.setMessage(getString(R.string.suretoremove, meetings.get(meeting).meetingName));
|
||||
|
||||
builder.setPositiveButton(R.string.yes, (dialog, which) -> {
|
||||
dialog.dismiss();
|
||||
meetings.remove(meeting);
|
||||
saveMeetingList(meetings);
|
||||
|
||||
if (meetings.size() > 1) {
|
||||
fillDropdownMeetingName();
|
||||
if (getLastMeeting() > meetings.size() - 1) {
|
||||
setLastMeeting(meetings.size() - 1);
|
||||
fillMeeting(getLastMeeting());
|
||||
}
|
||||
} else if (meetings.size() == 1) {
|
||||
setLastMeeting(0);
|
||||
fillDropdownMeetingName();
|
||||
fillMeeting(getLastMeeting());
|
||||
} else {
|
||||
setLastMeeting(-1);
|
||||
fillDropdownMeetingName();
|
||||
fillBlank();
|
||||
}
|
||||
});
|
||||
|
||||
builder.setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss());
|
||||
|
||||
AlertDialog alert = builder.create();
|
||||
alert.show();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void fillBlank() {
|
||||
EditText editMeetingName = findViewById(R.id.TextMeetingName);
|
||||
EditText editID = findViewById(R.id.textBoxID);
|
||||
EditText editPW = findViewById(R.id.editTextTextPassword2);
|
||||
AutoCompleteTextView editName = findViewById(R.id.textBoxName);
|
||||
EditText editAtt = findViewById(R.id.editAtt);
|
||||
final EditText editMeetingName = findViewById(R.id.TextMeetingName);
|
||||
final EditText editID = findViewById(R.id.textBoxID);
|
||||
final EditText editPW = findViewById(R.id.editTextTextPassword2);
|
||||
final AutoCompleteTextView editName = findViewById(R.id.textBoxName);
|
||||
final EditText editAtt = findViewById(R.id.editAtt);
|
||||
|
||||
editMeetingName.setText("");
|
||||
editID.setText("");
|
||||
@@ -382,24 +230,9 @@ public class MainActivity extends AppCompatActivity {
|
||||
editAtt.setText("");
|
||||
}
|
||||
|
||||
private void watchSaveIcon() {
|
||||
ImageView saveIcon = findViewById(R.id.imageSave);
|
||||
saveIcon.setOnClickListener(v -> saveMeetingFromUI());
|
||||
}
|
||||
|
||||
public void watchMeetingNameBox() {
|
||||
EditText meetingNameBox = findViewById(R.id.TextMeetingName);
|
||||
meetingNameBox.setOnFocusChangeListener((v, hasFocus) -> {
|
||||
if (!hasFocus) {
|
||||
fillWithSelectedMeeting();
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
public void fillWithSelectedMeeting() {
|
||||
AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName);
|
||||
int search = searchMeetingInList(getMeetings(), textMeetingName.getText().toString());
|
||||
final AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName);
|
||||
final int search = meetingsController.searchMeetingInList(meetingsController.getMeetings(), textMeetingName.getText().toString());
|
||||
if (search != -1) {
|
||||
fillMeeting(search);
|
||||
}
|
||||
@@ -407,288 +240,107 @@ public class MainActivity extends AppCompatActivity {
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
public void fillDropdownMeetingName() {
|
||||
ArrayList<Meeting> meetings = getMeetings();
|
||||
final ArrayList<Meeting> meetings = meetingsController.getMeetings();
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName);
|
||||
//ImageView dropdown = findViewById(R.id.iconDropdownMeetingName);
|
||||
AutoSuggestAdapter adapter = new AutoSuggestAdapter(this, android.R.layout.simple_dropdown_item_1line);
|
||||
final AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName);
|
||||
final AutoSuggestAdapter adapter = new AutoSuggestAdapter(this, android.R.layout.simple_dropdown_item_1line);
|
||||
adapter.setData(Arrays.asList(meetingNames));
|
||||
textMeetingName.setAdapter(adapter);
|
||||
|
||||
textMeetingName.setOnTouchListener((paramView, paramMotionEvent) -> false);
|
||||
|
||||
textMeetingName.setOnItemClickListener((arg0, view, arg2, arg3) -> fillWithSelectedMeeting());
|
||||
|
||||
/*dropdown.setOnClickListener(v -> {
|
||||
textMeetingName.showDropDown();
|
||||
adapter.getFilter().filter(null);
|
||||
});*/
|
||||
}
|
||||
|
||||
@SuppressLint("ClickableViewAccessibility")
|
||||
public void fillDropdownAttendeeName(int meetingIndex) {
|
||||
Meeting meeting = getMeetings().get(meetingIndex);
|
||||
ArrayList<Attendee> attendees = meeting.attendees;
|
||||
final Meeting meeting = meetingsController.getMeetings().get(meetingIndex);
|
||||
final ArrayList<Attendee> 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();
|
||||
}
|
||||
|
||||
AutoCompleteTextView textName = findViewById(R.id.textBoxName);
|
||||
//ImageView dropdown = findViewById(R.id.iconDropdownAttName);
|
||||
AutoSuggestAdapter adapter = new AutoSuggestAdapter(this, android.R.layout.simple_dropdown_item_1line);
|
||||
final AutoCompleteTextView textName = findViewById(R.id.textBoxName);
|
||||
final AutoSuggestAdapter adapter = new AutoSuggestAdapter(this, android.R.layout.simple_dropdown_item_1line);
|
||||
|
||||
adapter.setData(Arrays.asList(attNames));
|
||||
textName.setAdapter(adapter);
|
||||
|
||||
textName.setOnTouchListener((paramView, paramMotionEvent) -> false);
|
||||
|
||||
textName.setOnItemClickListener((arg0, view, arg2, arg3) -> fillWithSelectedAtt(meetingIndex));
|
||||
|
||||
/*dropdown.setOnClickListener(v -> {
|
||||
textName.showDropDown();
|
||||
adapter.getFilter().filter(null);
|
||||
});*/
|
||||
}
|
||||
|
||||
private void fillWithSelectedAtt(int meetingIndex) {
|
||||
AutoCompleteTextView textName = findViewById(R.id.textBoxName);
|
||||
EditText editAtt = findViewById(R.id.editAtt);
|
||||
int found = getMeetings().get(meetingIndex).searchAttendee(textName.getText().toString());
|
||||
editAtt.setText(getMeetings().get(meetingIndex).attendees.get(found).num);
|
||||
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).getAttendees().get(found).getNum());
|
||||
}
|
||||
|
||||
|
||||
public void fillMeeting(Meeting meeting) {
|
||||
EditText editMeetingName = findViewById(R.id.TextMeetingName);
|
||||
EditText editID = findViewById(R.id.textBoxID);
|
||||
EditText editPW = findViewById(R.id.editTextTextPassword2);
|
||||
EditText editName = findViewById(R.id.textBoxName);
|
||||
EditText editAtt = findViewById(R.id.editAtt);
|
||||
final EditText editMeetingName = findViewById(R.id.TextMeetingName);
|
||||
final EditText editID = findViewById(R.id.textBoxID);
|
||||
final EditText editPW = findViewById(R.id.editTextTextPassword2);
|
||||
final EditText editName = findViewById(R.id.textBoxName);
|
||||
final EditText editAtt = findViewById(R.id.editAtt);
|
||||
|
||||
editID.setError(null);
|
||||
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) {
|
||||
fillMeeting(getMeetings().get(id));
|
||||
fillMeeting(meetingsController.getMeetings().get(id));
|
||||
fillDropdownAttendeeName(id);
|
||||
}
|
||||
|
||||
|
||||
private void launchZoomUrl(String url) {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||
if (intent.resolveActivity(getPackageManager()) != null) {
|
||||
startActivity(intent);
|
||||
}
|
||||
if (testing) {
|
||||
//For Debugging: Show URL in Alert
|
||||
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
|
||||
dialog.setMessage(url);
|
||||
dialog.setTitle("Zoom URL (for testing)");
|
||||
AlertDialog alertDialog = dialog.create();
|
||||
alertDialog.show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private String buildZoomURL(String confno, String pwd, String name, String attendees) {
|
||||
Uri.Builder builder = new Uri.Builder();
|
||||
builder.scheme("zoomus")
|
||||
.authority("zoom.us")
|
||||
.appendPath("join")
|
||||
.appendQueryParameter("confno", confno.replace(" ", ""))
|
||||
.appendQueryParameter("pwd", pwd);
|
||||
|
||||
if (!Objects.equals(attendees, "")) {
|
||||
builder.appendQueryParameter("uname", name + " (" + attendees + ")");
|
||||
} else
|
||||
builder.appendQueryParameter("uname", name);
|
||||
return builder.build().toString();
|
||||
}
|
||||
|
||||
public String meetingsToString(ArrayList<Meeting> listMeetings) {
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
ObjectOutputStream objOutputStream = null;
|
||||
try {
|
||||
objOutputStream = new ObjectOutputStream(byteArrayOutputStream);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
for (Object obj : listMeetings) {
|
||||
|
||||
try {
|
||||
if (objOutputStream == null) throw new AssertionError();
|
||||
objOutputStream.writeObject(obj);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
objOutputStream.reset();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
try {
|
||||
if (objOutputStream == null) throw new AssertionError();
|
||||
objOutputStream.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return Base64.encodeToString(byteArrayOutputStream.toByteArray(), 0);
|
||||
}
|
||||
|
||||
|
||||
public ArrayList<Meeting> stringToMeetings(String string) {
|
||||
byte[] bytes = Base64.decode(string, 0);
|
||||
|
||||
ArrayList<Meeting> listMeetings = new ArrayList<>();
|
||||
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
|
||||
ObjectInputStream obj = null;
|
||||
try {
|
||||
obj = new ObjectInputStream(bis);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
while (bis.available() != -1) {
|
||||
//Read object from file
|
||||
if (obj == null) throw new AssertionError();
|
||||
Meeting meeting = (Meeting) obj.readObject();
|
||||
listMeetings.add(meeting);
|
||||
}
|
||||
} catch (EOFException ex) {
|
||||
//ex.printStackTrace();
|
||||
} catch (IOException | ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return listMeetings;
|
||||
}
|
||||
|
||||
@SuppressLint("ApplySharedPref")
|
||||
public void saveMeetingList(ArrayList<Meeting> meetingList) {
|
||||
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
|
||||
SharedPreferences.Editor prefsEditor = mPrefs.edit();
|
||||
prefsEditor.putString("Meetings", meetingsToString(meetingList));
|
||||
prefsEditor.commit();
|
||||
}
|
||||
|
||||
@SuppressLint("ApplySharedPref")
|
||||
public void setLastMeeting(int id) {
|
||||
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
|
||||
SharedPreferences.Editor prefsEditor = mPrefs.edit();
|
||||
prefsEditor.putInt("LastMeeting", id);
|
||||
prefsEditor.commit();
|
||||
}
|
||||
|
||||
public int getLastMeeting() {
|
||||
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
|
||||
return mPrefs.getInt("LastMeeting", -1);
|
||||
}
|
||||
|
||||
|
||||
public ArrayList<Meeting> getMeetings() {
|
||||
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
|
||||
String value = mPrefs.getString("Meetings", "");
|
||||
ArrayList<Meeting> meetingList;
|
||||
if (value.equals("")) {
|
||||
meetingList = new ArrayList<>();
|
||||
} else {
|
||||
meetingList = stringToMeetings(value);
|
||||
}
|
||||
return meetingList;
|
||||
}
|
||||
|
||||
public int searchMeetingInList(ArrayList<Meeting> meetings, String name) {
|
||||
int found = -1;
|
||||
for (int i = 0; i < meetings.size(); i++) {
|
||||
if (meetings.get(i).meetingName.equals(name)) {
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
public void btnSave_onClick(View view) {
|
||||
saveMeetingFromUI();
|
||||
}
|
||||
|
||||
|
||||
public void btnJoin_onClick(View view) {
|
||||
saveMeetingFromUI();
|
||||
Meeting currMeeting = createCurrMeetingFromUI();
|
||||
String url = buildZoomURL(currMeeting.meetingID, currMeeting.meetingPWD, currMeeting.attendees.get(currMeeting.lastAtt).name, currMeeting.attendees.get(currMeeting.lastAtt).num);
|
||||
launchZoomUrl(url);
|
||||
final Meeting currMeeting = createCurrMeetingFromUI();
|
||||
new ZoomLink(this, currMeeting).launch();
|
||||
}
|
||||
|
||||
public Meeting createCurrMeetingFromUI() {
|
||||
EditText editMeetingName = findViewById(R.id.TextMeetingName);
|
||||
EditText editID = findViewById(R.id.textBoxID);
|
||||
EditText editPW = findViewById(R.id.editTextTextPassword2);
|
||||
EditText editName = findViewById(R.id.textBoxName);
|
||||
EditText editAtt = findViewById(R.id.editAtt);
|
||||
final EditText editMeetingName = findViewById(R.id.TextMeetingName);
|
||||
final EditText editID = findViewById(R.id.textBoxID);
|
||||
final EditText editPW = findViewById(R.id.editTextTextPassword2);
|
||||
final EditText editName = findViewById(R.id.textBoxName);
|
||||
final EditText editAtt = findViewById(R.id.editAtt);
|
||||
|
||||
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) {
|
||||
ArrayList<Meeting> listMeetings = getMeetings();
|
||||
int foundCurr = searchMeetingInList(listMeetings, meeting.meetingName);
|
||||
if (foundCurr == -1) {
|
||||
listMeetings.add(meeting);
|
||||
if (listMeetings.size() == 1) {
|
||||
setLastMeeting(0);
|
||||
} else {
|
||||
setLastMeeting(listMeetings.size() - 1);
|
||||
}
|
||||
|
||||
} else {
|
||||
Meeting currMeeting = 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);
|
||||
setLastMeeting(foundCurr);
|
||||
}
|
||||
saveMeetingList(listMeetings);
|
||||
fillDropdownMeetingName();
|
||||
fillDropdownAttendeeName(getLastMeeting());
|
||||
Toast.makeText(getApplicationContext(), "Meeting gespeichert", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
public void importMeeting(Meeting meeting) {
|
||||
importMeeting(meeting, true);
|
||||
}
|
||||
|
||||
public void saveMeetingFromUI() {
|
||||
Meeting currMeetingUI = createCurrMeetingFromUI();
|
||||
final Meeting currMeetingUI = createCurrMeetingFromUI();
|
||||
|
||||
if (currMeetingUI.meetingID.equals("")) {
|
||||
EditText editID = findViewById(R.id.textBoxID);
|
||||
if (currMeetingUI.getMeetingID().equals("")) {
|
||||
final EditText editID = findViewById(R.id.textBoxID);
|
||||
editID.requestFocus();
|
||||
editID.setError("Meeting kann nicht ohne ID gespeichert werden!");
|
||||
editID.setError(getString(R.string.meetingWithoutID));
|
||||
return;
|
||||
} else if (currMeetingUI.meetingName.equals("")) {
|
||||
EditText editMName = findViewById(R.id.TextMeetingName);
|
||||
editMName.setText(currMeetingUI.meetingID);
|
||||
currMeetingUI.meetingName = currMeetingUI.meetingID;
|
||||
} else if (currMeetingUI.getMeetingName().equals("")) {
|
||||
final EditText editMName = findViewById(R.id.TextMeetingName);
|
||||
editMName.setText(currMeetingUI.getMeetingID());
|
||||
currMeetingUI.setMeetingName(currMeetingUI.getMeetingID());
|
||||
}
|
||||
importMeeting(currMeetingUI);
|
||||
meetingImportController.importMeeting(createCurrMeetingFromUI());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,14 +1,57 @@
|
||||
package de.joel.zoomhelper;
|
||||
|
||||
import android.content.Intent;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class Meeting implements Serializable {
|
||||
public String meetingName;
|
||||
public String meetingID;
|
||||
public String meetingPWD;
|
||||
public ArrayList<Attendee> attendees;
|
||||
public int lastAtt;
|
||||
private static final long serialVersionUID = 2606722401897866931L;
|
||||
private String meetingName;
|
||||
private String meetingID;
|
||||
private String meetingPWD;
|
||||
private ArrayList<Attendee> 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<Attendee> getAttendees() {
|
||||
return attendees;
|
||||
}
|
||||
|
||||
public void setAttendees(ArrayList<Attendee> 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;
|
||||
@@ -29,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;
|
||||
}
|
||||
@@ -44,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;
|
||||
}
|
||||
}
|
||||
@@ -54,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);
|
||||
}
|
||||
}
|
||||
@@ -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<Meeting> 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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,13 +17,15 @@ import java.io.ObjectOutputStream;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class MeetingsController {
|
||||
private Context context;
|
||||
private final Context context;
|
||||
private final Activity activity;
|
||||
|
||||
public MeetingsController(Context context) {
|
||||
this.context = context;
|
||||
this.activity = (Activity) context;
|
||||
}
|
||||
|
||||
Activity activity = (Activity) context;
|
||||
|
||||
|
||||
public String meetingsToString(ArrayList<Meeting> listMeetings) {
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
@@ -117,7 +119,7 @@ public class MeetingsController {
|
||||
return meetingList;
|
||||
}
|
||||
|
||||
private void removeMeeting(int meeting) {
|
||||
public void removeMeeting(int meeting) {
|
||||
MainActivity act = (MainActivity)context;
|
||||
ArrayList<Meeting> meetings = getMeetings();
|
||||
if (meetings.size() > 0 && meeting != -1) {
|
||||
@@ -125,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();
|
||||
@@ -156,4 +158,15 @@ public class MeetingsController {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public int searchMeetingInList(ArrayList<Meeting> meetings, String name) {
|
||||
int found = -1;
|
||||
for (int i = 0; i < meetings.size(); i++) {
|
||||
if (meetings.get(i).getMeetingName().equals(name)) {
|
||||
found = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<string name="alwaysAsk">Dialog immer anzeigen</string>
|
||||
<string name="wantToimportMeeting">Möchtest du das folgende Meeting importieren?</string>
|
||||
<string name="importError">"Dieser Text entspricht keinem für ZoomHelper bekannten Meetingeinladungs-Muster "</string>
|
||||
<string name="ok">ok</string>
|
||||
<string name="ok">OK</string>
|
||||
<string name="meetingAlreadyExists">Meeting unter diesem Namen existiert schon. Bitte umbenennen, ansonsten wird es beim Speichern überschrieben</string>
|
||||
<string name="override">überschreiben</string>
|
||||
<string name="rename">umbenennen</string>
|
||||
@@ -39,5 +39,7 @@
|
||||
<string name="cantCreateShortcut">Du musst das Meeting zunächst speichern, bevor du eine Verknüpfung dazu erstellen kannst</string>
|
||||
<string name="saveMeeting">Meeting speichern</string>
|
||||
<string name="cancel">abbrechen</string>
|
||||
<string name="meetingSaved">Meeting gespeichert</string>
|
||||
<string name="meetingWithoutID">Meeting kann nicht ohne ID gespeichert werden!</string>
|
||||
|
||||
</resources>
|
||||
Reference in New Issue
Block a user