From 6dbcb548b587305014463093aac0deb1f0d826e2 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 12:28:14 +0200 Subject: [PATCH 01/12] add new Classes, reordering, update build settings --- app/build.gradle | 2 +- .../de/joel/zoomhelper/APKDownloader.java | 82 +++++++ .../java/de/joel/zoomhelper/Attendee.java | 13 + .../joel/zoomhelper/InstantAutoComplete.java | 25 ++ .../java/de/joel/zoomhelper/MainActivity.java | 230 +----------------- .../main/java/de/joel/zoomhelper/Meeting.java | 57 +++++ .../joel/zoomhelper/MeetingsController.java | 159 ++++++++++++ .../java/de/joel/zoomhelper/ZoomLink.java | 51 ++++ 8 files changed, 397 insertions(+), 222 deletions(-) create mode 100644 app/src/main/java/de/joel/zoomhelper/APKDownloader.java create mode 100644 app/src/main/java/de/joel/zoomhelper/Attendee.java create mode 100644 app/src/main/java/de/joel/zoomhelper/InstantAutoComplete.java create mode 100644 app/src/main/java/de/joel/zoomhelper/Meeting.java create mode 100644 app/src/main/java/de/joel/zoomhelper/MeetingsController.java create mode 100644 app/src/main/java/de/joel/zoomhelper/ZoomLink.java diff --git a/app/build.gradle b/app/build.gradle index c12874f..6828c3f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdkVersion 21 targetSdkVersion 30 versionCode 14 - versionName '0.5' + versionName '0.5.1 beta' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/de/joel/zoomhelper/APKDownloader.java b/app/src/main/java/de/joel/zoomhelper/APKDownloader.java new file mode 100644 index 0000000..e64b656 --- /dev/null +++ b/app/src/main/java/de/joel/zoomhelper/APKDownloader.java @@ -0,0 +1,82 @@ +package de.joel.zoomhelper; + +import android.app.Activity; +import android.app.DownloadManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.Settings; +import android.util.Log; +import android.widget.Toast; + +import androidx.core.content.FileProvider; + +import java.io.File; +import java.util.Timer; +import java.util.TimerTask; + +public class APKDownloader { + public void downloadAPK(Context context, String fileName, Uri uri) { + Activity act = (Activity)context; + File destination = new File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), fileName); + + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { + if (!context.getPackageManager().canRequestPackageInstalls()) { + Toast.makeText(context, R.string.PleaseAllowUnknownSources, Toast.LENGTH_LONG).show(); + act.startActivityForResult(new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:de.joel.zoomhelper")), 101); + Timer timer = new Timer(true); + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + if (context.getPackageManager().canRequestPackageInstalls()) { + act.finishActivity(101); + downloadAPK(context, fileName, uri); + timer.cancel(); + } + } + }, 0, 1000); + return; + } + } + + //Delete update file if exists + final Uri localUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", destination); + if (destination.exists()) { + //noinspection ResultOfMethodCallIgnored + destination.delete(); + } + + //Download Script + DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); + DownloadManager.Request request = new DownloadManager.Request(uri); + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + Log.d("Desturi", localUri.getPath()); + request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, fileName); + final long downloadID = downloadManager.enqueue(request); + + BroadcastReceiver onDownloadComplete = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + //Fetching the download id received with the broadcast + long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); + //Checking if the received broadcast is for our enqueued download by matching download id + if (downloadID == id) { + Intent install = new Intent(Intent.ACTION_VIEW); + install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + install.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true); + install.setDataAndType(localUri, + downloadManager.getMimeTypeForDownloadedFile(downloadID)); + context.startActivity(install); + + context.unregisterReceiver(this); + } + } + }; + context.registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); + } +} diff --git a/app/src/main/java/de/joel/zoomhelper/Attendee.java b/app/src/main/java/de/joel/zoomhelper/Attendee.java new file mode 100644 index 0000000..f0a504f --- /dev/null +++ b/app/src/main/java/de/joel/zoomhelper/Attendee.java @@ -0,0 +1,13 @@ +package de.joel.zoomhelper; + +import java.io.Serializable; + +public class Attendee implements Serializable { + public String name; + public String num; + + public Attendee(String name, String num) { + this.name = name; + this.num = num; + } +} \ No newline at end of file diff --git a/app/src/main/java/de/joel/zoomhelper/InstantAutoComplete.java b/app/src/main/java/de/joel/zoomhelper/InstantAutoComplete.java new file mode 100644 index 0000000..439d723 --- /dev/null +++ b/app/src/main/java/de/joel/zoomhelper/InstantAutoComplete.java @@ -0,0 +1,25 @@ +package de.joel.zoomhelper; + +import android.content.Context; +import android.util.AttributeSet; + +public class InstantAutoComplete extends androidx.appcompat.widget.AppCompatAutoCompleteTextView { + + public InstantAutoComplete(Context context) { + super(context); + } + + public InstantAutoComplete(Context arg0, AttributeSet arg1) { + super(arg0, arg1); + } + + public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) { + super(arg0, arg1, arg2); + } + + @Override + public boolean enoughToFilter() { + return false; + } + +} \ No newline at end of file diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java index d61d7fe..17afd9b 100644 --- a/app/src/main/java/de/joel/zoomhelper/MainActivity.java +++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java @@ -1,22 +1,13 @@ package de.joel.zoomhelper; import android.annotation.SuppressLint; -import android.app.DownloadManager; -import android.content.BroadcastReceiver; import android.content.ClipData; import android.content.ClipboardManager; -import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.content.SharedPreferences; import android.net.Uri; -import android.os.Build; import android.os.Bundle; -import android.os.Environment; -import android.provider.Settings; -import android.util.AttributeSet; import android.util.Base64; -import android.util.Log; import android.view.View; import android.widget.AutoCompleteTextView; import android.widget.EditText; @@ -27,7 +18,6 @@ import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; -import androidx.core.content.FileProvider; import androidx.core.content.pm.ShortcutInfoCompat; import androidx.core.content.pm.ShortcutManagerCompat; import androidx.core.graphics.drawable.IconCompat; @@ -40,51 +30,25 @@ import com.google.android.material.textfield.TextInputLayout; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.EOFException; -import java.io.File; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; -import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; -import java.util.Timer; -import java.util.TimerTask; import java.util.regex.Matcher; import java.util.regex.Pattern; import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN; - -class InstantAutoComplete extends androidx.appcompat.widget.AppCompatAutoCompleteTextView { - - public InstantAutoComplete(Context context) { - super(context); - } - - public InstantAutoComplete(Context arg0, AttributeSet arg1) { - super(arg0, arg1); - } - - public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) { - super(arg0, arg1, arg2); - } - - @Override - public boolean enoughToFilter() { - return false; - } - -} - - public class MainActivity extends AppCompatActivity { public boolean testing; - @Override protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Intent myIntent = getIntent(); // gets the previously created intent String action = myIntent.getAction(); @@ -95,7 +59,7 @@ public class MainActivity extends AppCompatActivity { boolean joinImmediately = myIntent.getBooleanExtra("joinImmediately", false); testing = myIntent.getBooleanExtra("testing", false); - super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); final ScrollView scrollview = findViewById(R.id.scrollArea); @@ -127,7 +91,7 @@ public class MainActivity extends AppCompatActivity { //watchMeetingNameBox(); fillDropdownMeetingName(); - if (getLastMeeting() != -1) { + /*if (getLastMeeting() != -1) { try { fillMeeting(getLastMeeting()); scrollview.post(() -> scrollview.scrollTo(0, scrollview.getChildAt(0).getHeight())); @@ -140,7 +104,7 @@ public class MainActivity extends AppCompatActivity { setLastMeeting(-1); saveMeetingList(new ArrayList<>()); } - } + }*/ watchSaveIcon(); watchAttIcon(); watchDeleteIcon(); @@ -159,8 +123,9 @@ public class MainActivity extends AppCompatActivity { String url = buildZoomURL(currMeeting.meetingID, currMeeting.meetingPWD, currMeeting.attendees.get(currMeeting.lastAtt).name, currMeeting.attendees.get(currMeeting.lastAtt).num); launchZoomUrl(url); } else { - AppUpdater appUpdater = new AppUpdater(this).setUpdateFrom(UpdateFrom.XML).setUpdateXML("https://baldaufwd.de/ZoomHelper/update.xml"); - appUpdater.setButtonUpdateClickListener((dialog, which) -> downloadAPK()); + AppUpdater appUpdater = new AppUpdater(this).setUpdateFrom(UpdateFrom.XML).setUpdateXML("https://baldaufwd.de/ZoomHelper/updatetest.xml"); + APKDownloader apkDownloader = new APKDownloader(); + appUpdater.setButtonUpdateClickListener((dialog, which) -> apkDownloader.downloadAPK(this, "ZoomHelper.apk", Uri.parse("https://baldaufwd.de/ZoomHelper/ZoomHelper.apk"))); appUpdater.start(); } } @@ -174,22 +139,6 @@ public class MainActivity extends AppCompatActivity { } - /* private void watchImportIcon() { - ImageView ImportIcon = findViewById(R.id.imageImport); - ImportIcon.setOnClickListener(v -> importFromClipboard()); - } - - void importFromClipboard() { - Log.d("import", "ImportFromClipboard"); - ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE); - Log.d("clipboardManager", clipboard.toString()); - if (clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN)) { - String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString(); - Log.d("text", text); - handleSendText(text); - } - } */ - private void importFromClipboard() { LinearLayout layoutBegin = findViewById(R.id.layoutBegin); ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE); @@ -211,77 +160,6 @@ public class MainActivity extends AppCompatActivity { } } - - private void downloadAPK() { - String fileName = "ZoomHelper.apk"; - File destination = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath(), fileName); - -/* - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED - || ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - - // this will request for permission when user has not granted permission for the app - ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); - downloadAPK(); - } else {*/ - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) { - if (!getPackageManager().canRequestPackageInstalls()) { - Toast.makeText(this, R.string.PleaseAllowUnknownSources, Toast.LENGTH_LONG).show(); - startActivityForResult(new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:de.joel.zoomhelper")), 101); - Timer timer = new Timer(true); - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if (getPackageManager().canRequestPackageInstalls()) { - finishActivity(101); - downloadAPK(); - timer.cancel(); - } - } - }, 0, 1000); - return; - } - } - - - //Delete update file if exists - final Uri localUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", destination); - if (destination.exists()) - //file.delete() - test this, I think sometimes it doesnt work - destination.delete(); - - //Download Script - DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); - Uri uri = Uri.parse("https://baldaufwd.de/ZoomHelper/ZoomHelper.apk"); - DownloadManager.Request request = new DownloadManager.Request(uri); - request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); - Log.d("Desturi", localUri.getPath()); - request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, fileName); - final long downloadID = downloadManager.enqueue(request); - - BroadcastReceiver onDownloadComplete = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - //Fetching the download id received with the broadcast - long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); - //Checking if the received broadcast is for our enqueued download by matching download id - if (downloadID == id) { - Intent install = new Intent(Intent.ACTION_VIEW); - install.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - install.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true); - install.setDataAndType(localUri, - downloadManager.getMimeTypeForDownloadedFile(downloadID)); - startActivity(install); - - unregisterReceiver(this); - } - } - }; - registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); - } - //} - private void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); handleSendText(sharedText); @@ -345,32 +223,6 @@ public class MainActivity extends AppCompatActivity { return true; } } - - - /* AlertDialog.Builder builder = new AlertDialog.Builder(this); - - builder.setTitle(R.string.app_name); - - if (meetingID.equals("")) { - builder.setMessage(R.string.importError); - builder.setPositiveButton(R.string.ok, (dialog, which) -> { - dialog.dismiss(); - }); - } else { - builder.setMessage(getString(R.string.wantToimportMeeting) + "\n" + mtgToImport.info()); - - builder.setPositiveButton(R.string.yes, (dialog, which) -> { - dialog.dismiss(); - importMeetingToUI(mtgToImport); - }); - - builder.setNegativeButton(R.string.no, (dialog, which) -> { - dialog.dismiss(); - }); - } - - AlertDialog alert = builder.create(); - alert.show();*/ } return true; } @@ -515,7 +367,7 @@ public class MainActivity extends AppCompatActivity { } - private void fillBlank() { + public void fillBlank() { EditText editMeetingName = findViewById(R.id.TextMeetingName); EditText editID = findViewById(R.id.textBoxID); EditText editPW = findViewById(R.id.editTextTextPassword2); @@ -839,68 +691,4 @@ public class MainActivity extends AppCompatActivity { importMeeting(currMeetingUI); } -} - - -class Attendee implements Serializable { - public String name; - public String num; - - public Attendee(String name, String num) { - this.name = name; - this.num = num; - } -} - -class Meeting implements Serializable { - public String meetingName; - public String meetingID; - public String meetingPWD; - public ArrayList attendees; - public int lastAtt; - - public Meeting(String meetingName, String meetingID, String meetingPWD, String nameAttendee, String numAttendee) { - this.meetingName = meetingName; - this.meetingID = meetingID; - this.meetingPWD = meetingPWD; - this.attendees = new ArrayList<>(); - Attendee attendee = new Attendee(nameAttendee, numAttendee); - this.attendees.add(attendee); - this.lastAtt = 0; - } - - public void addAttendee(String name, String num) { - Attendee attendee = new Attendee(name, num); - this.attendees.add(attendee); - this.lastAtt = attendees.size() - 1; - } - - 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)) { - found = i; - break; - } - } - return found; - } - - public void updateAttendee(String name, String num) { - - int found = searchAttendee(name); - - if (found == -1) { - addAttendee(name, num); - } else { - this.attendees.get(found).num = num; - this.lastAtt = found; - } - } - - public String info() { - return "Meeting Name: " + this.meetingName + "\n" + - "Meeting-ID: " + this.meetingID + "\n" + - "Kenncode: " + this.meetingPWD; - } } \ 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 new file mode 100644 index 0000000..b513ace --- /dev/null +++ b/app/src/main/java/de/joel/zoomhelper/Meeting.java @@ -0,0 +1,57 @@ +package de.joel.zoomhelper; + +import java.io.Serializable; +import java.util.ArrayList; + +public class Meeting implements Serializable { + public String meetingName; + public String meetingID; + public String meetingPWD; + public ArrayList attendees; + public int lastAtt; + + public Meeting(String meetingName, String meetingID, String meetingPWD, String nameAttendee, String numAttendee) { + this.meetingName = meetingName; + this.meetingID = meetingID; + this.meetingPWD = meetingPWD; + this.attendees = new ArrayList<>(); + Attendee attendee = new Attendee(nameAttendee, numAttendee); + this.attendees.add(attendee); + this.lastAtt = 0; + } + + public void addAttendee(String name, String num) { + Attendee attendee = new Attendee(name, num); + this.attendees.add(attendee); + this.lastAtt = attendees.size() - 1; + } + + 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)) { + found = i; + break; + } + } + return found; + } + + public void updateAttendee(String name, String num) { + + int found = searchAttendee(name); + + if (found == -1) { + addAttendee(name, num); + } else { + this.attendees.get(found).num = num; + this.lastAtt = found; + } + } + + public String info() { + return "Meeting Name: " + this.meetingName + "\n" + + "Meeting-ID: " + this.meetingID + "\n" + + "Kenncode: " + this.meetingPWD; + } +} \ No newline at end of file diff --git a/app/src/main/java/de/joel/zoomhelper/MeetingsController.java b/app/src/main/java/de/joel/zoomhelper/MeetingsController.java new file mode 100644 index 0000000..a51b25f --- /dev/null +++ b/app/src/main/java/de/joel/zoomhelper/MeetingsController.java @@ -0,0 +1,159 @@ +package de.joel.zoomhelper; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.util.Base64; + +import androidx.appcompat.app.AlertDialog; + +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; + +public class MeetingsController { + private Context context; + + public MeetingsController(Context context) { + this.context = context; + } + + Activity activity = (Activity) context; + + public String meetingsToString(ArrayList 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 stringToMeetings(String string) { + byte[] bytes = Base64.decode(string, 0); + + ArrayList 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 meetingList) { + SharedPreferences mPrefs = activity.getPreferences(Context.MODE_PRIVATE); + SharedPreferences.Editor prefsEditor = mPrefs.edit(); + prefsEditor.putString("Meetings", meetingsToString(meetingList)); + prefsEditor.commit(); + } + + @SuppressLint("ApplySharedPref") + public void setLastMeeting(int id) { + SharedPreferences mPrefs = activity.getPreferences(Context.MODE_PRIVATE); + SharedPreferences.Editor prefsEditor = mPrefs.edit(); + prefsEditor.putInt("LastMeeting", id); + prefsEditor.commit(); + } + + public int getLastMeeting() { + SharedPreferences mPrefs = activity.getPreferences(Context.MODE_PRIVATE); + return mPrefs.getInt("LastMeeting", -1); + } + + + public ArrayList getMeetings() { + SharedPreferences mPrefs = activity.getPreferences(Context.MODE_PRIVATE); + String value = mPrefs.getString("Meetings", ""); + ArrayList meetingList; + if (value.equals("")) { + meetingList = new ArrayList<>(); + } else { + meetingList = stringToMeetings(value); + } + return meetingList; + } + + private void removeMeeting(int meeting) { + MainActivity act = (MainActivity)context; + ArrayList meetings = getMeetings(); + if (meetings.size() > 0 && meeting != -1) { + + 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.setPositiveButton(R.string.yes, (dialog, which) -> { + dialog.dismiss(); + meetings.remove(meeting); + saveMeetingList(meetings); + + if (meetings.size() > 1) { + act.fillDropdownMeetingName(); + if (getLastMeeting() > meetings.size() - 1) { + setLastMeeting(meetings.size() - 1); + act.fillMeeting(getLastMeeting()); + } + } else if (meetings.size() == 1) { + setLastMeeting(0); + act.fillDropdownMeetingName(); + act.fillMeeting(getLastMeeting()); + } else { + setLastMeeting(-1); + act.fillDropdownMeetingName(); + act.fillBlank(); + } + }); + + builder.setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss()); + + AlertDialog alert = builder.create(); + alert.show(); + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/de/joel/zoomhelper/ZoomLink.java b/app/src/main/java/de/joel/zoomhelper/ZoomLink.java new file mode 100644 index 0000000..1675eda --- /dev/null +++ b/app/src/main/java/de/joel/zoomhelper/ZoomLink.java @@ -0,0 +1,51 @@ +package de.joel.zoomhelper; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import java.util.Objects; + +public class ZoomLink { + private final Meeting meeting; + private final Context context; + + public ZoomLink(Context context, Meeting meeting) { + this.meeting = meeting; + this.context = context; + } + + + + + private String buildZoomURL() { + Uri.Builder builder = new Uri.Builder(); + builder.scheme("zoomus") + .authority("zoom.us") + .appendPath("join") + .appendQueryParameter("confno", this.meeting.meetingID.replace(" ", "")) + .appendQueryParameter("pwd", this.meeting.meetingPWD); + + 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 + ")"); + } else + builder.appendQueryParameter("uname", this.meeting.attendees.get(this.meeting.lastAtt).name); + return builder.build().toString(); + } + + public void launch() { + String url = buildZoomURL(); + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + if (intent.resolveActivity(context.getPackageManager()) != null) { + context.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(); + }*/ + } +} From 1c68db62b1902394af6b0b777e6d48c395623563 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 17:34:36 +0200 Subject: [PATCH 02/12] add serialVersionUID to Attendee and Meeting Classes to fix incompatibilities between ZoomHelper versions --- app/src/main/java/de/joel/zoomhelper/Attendee.java | 1 + app/src/main/java/de/joel/zoomhelper/Meeting.java | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/de/joel/zoomhelper/Attendee.java b/app/src/main/java/de/joel/zoomhelper/Attendee.java index f0a504f..b412c50 100644 --- a/app/src/main/java/de/joel/zoomhelper/Attendee.java +++ b/app/src/main/java/de/joel/zoomhelper/Attendee.java @@ -3,6 +3,7 @@ package de.joel.zoomhelper; import java.io.Serializable; public class Attendee implements Serializable { + private static final long serialVersionUID = 6196688086302483907L; public String name; public String num; diff --git a/app/src/main/java/de/joel/zoomhelper/Meeting.java b/app/src/main/java/de/joel/zoomhelper/Meeting.java index b513ace..15936fb 100644 --- a/app/src/main/java/de/joel/zoomhelper/Meeting.java +++ b/app/src/main/java/de/joel/zoomhelper/Meeting.java @@ -4,6 +4,7 @@ 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; From c240223e98ad8fe723eaf07d65d99cfc9db2bd6c Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 17:38:16 +0200 Subject: [PATCH 03/12] comment in fillMeeting with last meeting --- app/src/main/java/de/joel/zoomhelper/MainActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java index 17afd9b..04d33ba 100644 --- a/app/src/main/java/de/joel/zoomhelper/MainActivity.java +++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java @@ -91,7 +91,7 @@ public class MainActivity extends AppCompatActivity { //watchMeetingNameBox(); fillDropdownMeetingName(); - /*if (getLastMeeting() != -1) { + if (getLastMeeting() != -1) { try { fillMeeting(getLastMeeting()); scrollview.post(() -> scrollview.scrollTo(0, scrollview.getChildAt(0).getHeight())); @@ -104,7 +104,7 @@ public class MainActivity extends AppCompatActivity { setLastMeeting(-1); saveMeetingList(new ArrayList<>()); } - }*/ + } watchSaveIcon(); watchAttIcon(); watchDeleteIcon(); From 8dbd025c368ec6d1d00ce4c86ac62aa65d73b9ed Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 17:38:45 +0200 Subject: [PATCH 04/12] change inspectionProfile --- .idea/inspectionProfiles/Project_Default.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .idea/inspectionProfiles/Project_Default.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..7712161 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file From fe99d0a37747e63bd2cd3a79b62ce82c616a0f88 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 17:55:44 +0200 Subject: [PATCH 05/12] enhanced MeetingsController --- .../java/de/joel/zoomhelper/MeetingsController.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/de/joel/zoomhelper/MeetingsController.java b/app/src/main/java/de/joel/zoomhelper/MeetingsController.java index a51b25f..41ddfed 100644 --- a/app/src/main/java/de/joel/zoomhelper/MeetingsController.java +++ b/app/src/main/java/de/joel/zoomhelper/MeetingsController.java @@ -117,7 +117,7 @@ public class MeetingsController { return meetingList; } - private void removeMeeting(int meeting) { + public void removeMeeting(int meeting) { MainActivity act = (MainActivity)context; ArrayList meetings = getMeetings(); if (meetings.size() > 0 && meeting != -1) { @@ -156,4 +156,15 @@ 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)) { + found = i; + break; + } + } + return found; + } } \ No newline at end of file From 7cce6f1280a8222021058640acbed5828fe0f65a Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 17:56:33 +0200 Subject: [PATCH 06/12] built MeetingsController into MainActivity --- .../java/de/joel/zoomhelper/MainActivity.java | 244 +++--------------- 1 file changed, 31 insertions(+), 213 deletions(-) diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java index 04d33ba..91b34d9 100644 --- a/app/src/main/java/de/joel/zoomhelper/MainActivity.java +++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java @@ -43,7 +43,8 @@ import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN; public class MainActivity extends AppCompatActivity { - public boolean testing; + private boolean testing; + private final MeetingsController meetingsController = new MeetingsController(this); @Override protected void onCreate(Bundle savedInstanceState) { @@ -64,8 +65,7 @@ public class MainActivity extends AppCompatActivity { setContentView(R.layout.activity_main); final ScrollView scrollview = findViewById(R.id.scrollArea); - - int meetingIndex = searchMeetingInList(getMeetings(), meetingName); + int meetingIndex = meetingsController.searchMeetingInList(meetingsController.getMeetings(), meetingName); if (meetingIndex == -1) { if (meetingName != null) { AlertDialog.Builder dialog = new AlertDialog.Builder(this); @@ -77,8 +77,8 @@ public class MainActivity extends AppCompatActivity { joinImmediately = false; } - if (meetingIndex <= getMeetings().size() && meetingIndex != -1) { - setLastMeeting(meetingIndex); + if (meetingIndex <= meetingsController.getMeetings().size() && meetingIndex != -1) { + meetingsController.setLastMeeting(meetingIndex); AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); textMeetingName.setEnabled(false); textMeetingName.setAdapter(null); @@ -91,9 +91,9 @@ public class MainActivity extends AppCompatActivity { //watchMeetingNameBox(); fillDropdownMeetingName(); - if (getLastMeeting() != -1) { + 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); @@ -101,8 +101,8 @@ public class MainActivity extends AppCompatActivity { dialog.setTitle(R.string.hint); AlertDialog alertDialog = dialog.create(); alertDialog.show(); - setLastMeeting(-1); - saveMeetingList(new ArrayList<>()); + meetingsController.setLastMeeting(-1); + meetingsController.saveMeetingList(new ArrayList<>()); } } watchSaveIcon(); @@ -119,9 +119,8 @@ public class MainActivity extends AppCompatActivity { } 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); + 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(); @@ -204,11 +203,11 @@ public class MainActivity extends AppCompatActivity { Meeting mtgToImport = new Meeting(meetingName, meetingID, meetingPWD, "", ""); - if (searchMeetingInList(getMeetings(), mtgToImport.meetingName) == -1 && !checkOnly) { + if (meetingsController.searchMeetingInList(meetingsController.getMeetings(), mtgToImport.meetingName) == -1 && !checkOnly) { fillMeeting(mtgToImport); } else { builder.setPositiveButton(R.string.override, (dialog, which) -> { - int found = searchMeetingInList(getMeetings(), mtgToImport.meetingName); + int found = meetingsController.searchMeetingInList(meetingsController.getMeetings(), mtgToImport.meetingName); importMeeting(mtgToImport, false); fillMeeting(found); dialog.dismiss(); @@ -233,7 +232,7 @@ public class MainActivity extends AppCompatActivity { } private void showCreateShortcutUI() { - int meeting = searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName); + int meeting = meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().meetingName); AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -271,7 +270,7 @@ public class MainActivity extends AppCompatActivity { private void createMeetingShortcut(int meetingIndex, boolean joinImmediately) { - Meeting meeting = getMeetings().get(meetingIndex); + Meeting meeting = meetingsController.getMeetings().get(meetingIndex); if (ShortcutManagerCompat.isRequestPinShortcutSupported(this)) { ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(this, meeting.meetingName) @@ -324,46 +323,7 @@ public class MainActivity extends AppCompatActivity { private void watchDeleteIcon() { ImageView trashIcon = findViewById(R.id.imageTrash); - trashIcon.setOnClickListener(v -> removeMeeting(searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName))); - } - - private void removeMeeting(int meeting) { - ArrayList 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(); - - } + trashIcon.setOnClickListener(v -> meetingsController.removeMeeting(meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().meetingName))); } @@ -399,7 +359,7 @@ public class MainActivity extends AppCompatActivity { public void fillWithSelectedMeeting() { AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); - int search = searchMeetingInList(getMeetings(), textMeetingName.getText().toString()); + int search = meetingsController.searchMeetingInList(meetingsController.getMeetings(), textMeetingName.getText().toString()); if (search != -1) { fillMeeting(search); } @@ -407,7 +367,7 @@ public class MainActivity extends AppCompatActivity { @SuppressLint("ClickableViewAccessibility") public void fillDropdownMeetingName() { - ArrayList meetings = getMeetings(); + ArrayList meetings = meetingsController.getMeetings(); String[] meetingNames = new String[meetings.size()]; for (int i = 0; i < meetings.size(); i++) { @@ -415,7 +375,6 @@ public class MainActivity extends AppCompatActivity { } AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); - //ImageView dropdown = findViewById(R.id.iconDropdownMeetingName); AutoSuggestAdapter adapter = new AutoSuggestAdapter(this, android.R.layout.simple_dropdown_item_1line); adapter.setData(Arrays.asList(meetingNames)); textMeetingName.setAdapter(adapter); @@ -423,16 +382,11 @@ public class MainActivity extends AppCompatActivity { 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); + Meeting meeting = meetingsController.getMeetings().get(meetingIndex); ArrayList attendees = meeting.attendees; String[] attNames = new String[attendees.size()]; @@ -459,8 +413,8 @@ public class MainActivity extends AppCompatActivity { 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); + int found = meetingsController.getMeetings().get(meetingIndex).searchAttendee(textName.getText().toString()); + editAtt.setText(meetingsController.getMeetings().get(meetingIndex).attendees.get(found).num); } @@ -483,155 +437,19 @@ public class MainActivity extends AppCompatActivity { } 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 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 stringToMeetings(String string) { - byte[] bytes = Base64.decode(string, 0); - - ArrayList 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 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 getMeetings() { - SharedPreferences mPrefs = getPreferences(MODE_PRIVATE); - String value = mPrefs.getString("Meetings", ""); - ArrayList meetingList; - if (value.equals("")) { - meetingList = new ArrayList<>(); - } else { - meetingList = stringToMeetings(value); - } - return meetingList; - } - - 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)) { - 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); + new ZoomLink(this, currMeeting).launch(); } public Meeting createCurrMeetingFromUI() { @@ -646,28 +464,28 @@ public class MainActivity extends AppCompatActivity { public void importMeeting(Meeting meeting, boolean updateAttendee) { - ArrayList listMeetings = getMeetings(); - int foundCurr = searchMeetingInList(listMeetings, meeting.meetingName); + ArrayList listMeetings = meetingsController.getMeetings(); + int foundCurr = meetingsController.searchMeetingInList(listMeetings, meeting.meetingName); if (foundCurr == -1) { listMeetings.add(meeting); if (listMeetings.size() == 1) { - setLastMeeting(0); + meetingsController.setLastMeeting(0); } else { - setLastMeeting(listMeetings.size() - 1); + meetingsController.setLastMeeting(listMeetings.size() - 1); } } else { - Meeting currMeeting = getMeetings().get(foundCurr); + 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); - setLastMeeting(foundCurr); + meetingsController.setLastMeeting(foundCurr); } - saveMeetingList(listMeetings); + meetingsController.saveMeetingList(listMeetings); fillDropdownMeetingName(); - fillDropdownAttendeeName(getLastMeeting()); + fillDropdownAttendeeName(meetingsController.getLastMeeting()); Toast.makeText(getApplicationContext(), "Meeting gespeichert", Toast.LENGTH_SHORT).show(); } From 719224003e0dec81bcba00897ec7407fcb8256b3 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 18:00:26 +0200 Subject: [PATCH 07/12] fixed MeetingsController constructor --- .../main/java/de/joel/zoomhelper/MeetingsController.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/joel/zoomhelper/MeetingsController.java b/app/src/main/java/de/joel/zoomhelper/MeetingsController.java index 41ddfed..4fe5797 100644 --- a/app/src/main/java/de/joel/zoomhelper/MeetingsController.java +++ b/app/src/main/java/de/joel/zoomhelper/MeetingsController.java @@ -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 listMeetings) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); From 6eef26e1161095bddcaad257c1921f4793bdeb07 Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 21:07:09 +0200 Subject: [PATCH 08/12] refactoring MainActivity --- .../java/de/joel/zoomhelper/MainActivity.java | 152 ++++++------------ 1 file changed, 47 insertions(+), 105 deletions(-) diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java index 91b34d9..dc8a9fa 100644 --- a/app/src/main/java/de/joel/zoomhelper/MainActivity.java +++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java @@ -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,12 +25,6 @@ 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; @@ -43,28 +35,44 @@ import static android.content.ClipDescription.MIMETYPE_TEXT_PLAIN; public class MainActivity extends AppCompatActivity { - private boolean testing; private final MeetingsController meetingsController = new MeetingsController(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - Intent myIntent = getIntent(); // gets the previously created intent + //get intent parameters + Intent myIntent = getIntent(); String action = myIntent.getAction(); String type = myIntent.getType(); - - String meetingName = myIntent.getStringExtra("meetingName"); boolean joinImmediately = myIntent.getBooleanExtra("joinImmediately", false); - testing = myIntent.getBooleanExtra("testing", false); - - + //boolean testing = myIntent.getBooleanExtra("testing", false); setContentView(R.layout.activity_main); - final ScrollView scrollview = findViewById(R.id.scrollArea); + //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().meetingName))); + AttIcon.setOnClickListener(v -> btnJoin_onClick(null)); + AddIcon.setOnClickListener(v -> { + fillBlank(); + meetingID.requestFocus(); + }); + ShareIcon.setOnClickListener(v -> shareMeeting(createCurrMeetingFromUI())); + ShortcutIcon.setOnClickListener(v -> showCreateShortcutUI()); + + //show alert if meeting from shortcut not found int meetingIndex = meetingsController.searchMeetingInList(meetingsController.getMeetings(), meetingName); if (meetingIndex == -1) { if (meetingName != null) { @@ -77,21 +85,21 @@ public class MainActivity extends AppCompatActivity { joinImmediately = false; } + //adjust ui for meeting from shortcut if (meetingIndex <= meetingsController.getMeetings().size() && meetingIndex != -1) { meetingsController.setLastMeeting(meetingIndex); AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); textMeetingName.setEnabled(false); textMeetingName.setAdapter(null); - ImageView imageTrash = findViewById(R.id.imageTrash); - imageTrash.setVisibility(View.GONE); + trashIcon.setVisibility(View.GONE); TextInputLayout layoutMeetingName = findViewById(R.id.layoutMeetingName); layoutMeetingName.setEndIconMode(TextInputLayout.END_ICON_NONE); } - - //watchMeetingNameBox(); fillDropdownMeetingName(); - if (meetingsController.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(meetingsController.getLastMeeting()); scrollview.post(() -> scrollview.scrollTo(0, scrollview.getChildAt(0).getHeight())); @@ -105,23 +113,20 @@ public class MainActivity extends AppCompatActivity { meetingsController.saveMeetingList(new ArrayList<>()); } } - watchSaveIcon(); - watchAttIcon(); - watchDeleteIcon(); - watchNewIcon(); - watchShareIcon(); - watchShortcutIcon(); + //handle meeting invitation text sent to ZoomHelper if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { - handleSendText(myIntent); // Handle text being sent + handleSendText(myIntent); } } + //join meeting immediately, otherwise enable app updater if (joinImmediately) { Meeting currMeeting = meetingsController.getMeetings().get(meetingIndex); new ZoomLink(this, currMeeting).launch(); } else { + //TODO: updatetest.xml -> update.xml when finished testing AppUpdater appUpdater = new AppUpdater(this).setUpdateFrom(UpdateFrom.XML).setUpdateXML("https://baldaufwd.de/ZoomHelper/updatetest.xml"); APKDownloader apkDownloader = new APKDownloader(); appUpdater.setButtonUpdateClickListener((dialog, which) -> apkDownloader.downloadAPK(this, "ZoomHelper.apk", Uri.parse("https://baldaufwd.de/ZoomHelper/ZoomHelper.apk"))); @@ -131,18 +136,18 @@ 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); + 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); @@ -176,15 +181,15 @@ public class MainActivity extends AppCompatActivity { if (sharedText != null) { Matcher matcher = Pattern.compile("(?i)(?<=(Meeting-ID:)|(Meeting\\sID:)|(ID:)).+").matcher(sharedText); if (matcher.find()) { - meetingID = matcher.group(0).trim(); + meetingID = Objects.requireNonNull(matcher.group(0)).trim(); } matcher = Pattern.compile("(?i)(?<=(Kenncode:)|(Passwort:)|(Passcode:)|(Password:)).+").matcher(sharedText); if (matcher.find()) { - meetingPWD = matcher.group(0).trim(); + meetingPWD = Objects.requireNonNull(matcher.group(0)).trim(); } matcher = Pattern.compile("(?i)(?<=(Thema:)|(Meeting\\sName:)|(Topic:)).+").matcher(sharedText); if (matcher.find()) { - meetingName = matcher.group(0).trim(); + meetingName = Objects.requireNonNull(matcher.group(0)).trim(); } AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -193,9 +198,7 @@ public class MainActivity extends AppCompatActivity { if (meetingID.equals("")) { builder.setMessage(R.string.importError); - builder.setPositiveButton(R.string.ok, (dialog, which) -> { - dialog.dismiss(); - }); + builder.setPositiveButton(R.string.ok, (dialog, which) -> dialog.dismiss()); AlertDialog alert = builder.create(); if (!checkOnly) alert.show(); return false; @@ -226,11 +229,6 @@ public class MainActivity extends AppCompatActivity { return true; } - private void watchShortcutIcon() { - ImageView ShortcutIcon = findViewById(R.id.imageCreateShortcut); - ShortcutIcon.setOnClickListener(v -> showCreateShortcutUI()); - } - private void showCreateShortcutUI() { int meeting = meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().meetingName); @@ -246,11 +244,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(); @@ -264,12 +259,9 @@ public class MainActivity extends AppCompatActivity { } AlertDialog alert = builder.create(); alert.show(); - - //createMeetingShortcut(searchMeetingInList(getMeetings(), createCurrMeetingFromUI().meetingName), false); } private void createMeetingShortcut(int meetingIndex, boolean joinImmediately) { - Meeting meeting = meetingsController.getMeetings().get(meetingIndex); if (ShortcutManagerCompat.isRequestPinShortcutSupported(this)) { @@ -291,12 +283,6 @@ 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); @@ -307,26 +293,6 @@ public class MainActivity extends AppCompatActivity { 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 -> meetingsController.removeMeeting(meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().meetingName))); - } - - public void fillBlank() { EditText editMeetingName = findViewById(R.id.TextMeetingName); EditText editID = findViewById(R.id.textBoxID); @@ -342,21 +308,6 @@ 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 = meetingsController.searchMeetingInList(meetingsController.getMeetings(), textMeetingName.getText().toString()); @@ -395,19 +346,14 @@ public class MainActivity extends AppCompatActivity { } AutoCompleteTextView textName = findViewById(R.id.textBoxName); - //ImageView dropdown = findViewById(R.id.iconDropdownAttName); 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) { @@ -417,7 +363,6 @@ public class MainActivity extends AppCompatActivity { editAtt.setText(meetingsController.getMeetings().get(meetingIndex).attendees.get(found).num); } - public void fillMeeting(Meeting meeting) { EditText editMeetingName = findViewById(R.id.TextMeetingName); EditText editID = findViewById(R.id.textBoxID); @@ -441,7 +386,6 @@ public class MainActivity extends AppCompatActivity { fillDropdownAttendeeName(id); } - public void btnSave_onClick(View view) { saveMeetingFromUI(); } @@ -462,7 +406,6 @@ 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) { ArrayList listMeetings = meetingsController.getMeetings(); int foundCurr = meetingsController.searchMeetingInList(listMeetings, meeting.meetingName); @@ -486,7 +429,7 @@ public class MainActivity extends AppCompatActivity { meetingsController.saveMeetingList(listMeetings); fillDropdownMeetingName(); fillDropdownAttendeeName(meetingsController.getLastMeeting()); - Toast.makeText(getApplicationContext(), "Meeting gespeichert", Toast.LENGTH_SHORT).show(); + Toast.makeText(getApplicationContext(), R.string.meetingSaved, Toast.LENGTH_SHORT).show(); } public void importMeeting(Meeting meeting) { @@ -499,7 +442,7 @@ public class MainActivity extends AppCompatActivity { if (currMeetingUI.meetingID.equals("")) { 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); @@ -508,5 +451,4 @@ public class MainActivity extends AppCompatActivity { } importMeeting(currMeetingUI); } - } \ No newline at end of file From f539bc318429d80b7ccb2ac9792a58056413785a Mon Sep 17 00:00:00 2001 From: Joel Date: Sat, 15 May 2021 21:07:20 +0200 Subject: [PATCH 09/12] added String values --- app/src/main/res/values/strings.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 66514bd..dbe7cea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,7 +28,7 @@ Dialog immer anzeigen Möchtest du das folgende Meeting importieren? "Dieser Text entspricht keinem für ZoomHelper bekannten Meetingeinladungs-Muster " - ok + OK Meeting unter diesem Namen existiert schon. Bitte umbenennen, ansonsten wird es beim Speichern überschrieben überschreiben umbenennen @@ -39,5 +39,7 @@ Du musst das Meeting zunächst speichern, bevor du eine Verknüpfung dazu erstellen kannst Meeting speichern abbrechen + Meeting gespeichert + Meeting kann nicht ohne ID gespeichert werden! \ No newline at end of file From a67ed4390b3460f8d679c34af1064693067fadcd Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 16 May 2021 15:01:34 +0200 Subject: [PATCH 10/12] added final where possible --- .../java/de/joel/zoomhelper/MainActivity.java | 127 +++++++++--------- 1 file changed, 64 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java index dc8a9fa..bb12c0b 100644 --- a/app/src/main/java/de/joel/zoomhelper/MainActivity.java +++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java @@ -42,12 +42,12 @@ public class MainActivity extends AppCompatActivity { super.onCreate(savedInstanceState); //get intent parameters - Intent myIntent = getIntent(); - String action = myIntent.getAction(); - String type = myIntent.getType(); - String meetingName = myIntent.getStringExtra("meetingName"); + 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); - //boolean testing = myIntent.getBooleanExtra("testing", false); + //final boolean testing = myIntent.getBooleanExtra("testing", false); setContentView(R.layout.activity_main); @@ -73,13 +73,13 @@ public class MainActivity extends AppCompatActivity { ShortcutIcon.setOnClickListener(v -> showCreateShortcutUI()); //show alert if meeting from shortcut not found - int meetingIndex = meetingsController.searchMeetingInList(meetingsController.getMeetings(), meetingName); + 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; @@ -88,11 +88,11 @@ public class MainActivity extends AppCompatActivity { //adjust ui for meeting from shortcut if (meetingIndex <= meetingsController.getMeetings().size() && meetingIndex != -1) { meetingsController.setLastMeeting(meetingIndex); - AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); + final AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); textMeetingName.setEnabled(false); textMeetingName.setAdapter(null); trashIcon.setVisibility(View.GONE); - TextInputLayout layoutMeetingName = findViewById(R.id.layoutMeetingName); + final TextInputLayout layoutMeetingName = findViewById(R.id.layoutMeetingName); layoutMeetingName.setEndIconMode(TextInputLayout.END_ICON_NONE); } @@ -104,10 +104,10 @@ public class MainActivity extends AppCompatActivity { 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(); meetingsController.setLastMeeting(-1); meetingsController.saveMeetingList(new ArrayList<>()); @@ -123,12 +123,12 @@ public class MainActivity extends AppCompatActivity { //join meeting immediately, otherwise enable app updater if (joinImmediately) { - Meeting currMeeting = meetingsController.getMeetings().get(meetingIndex); + final Meeting currMeeting = meetingsController.getMeetings().get(meetingIndex); new ZoomLink(this, currMeeting).launch(); } else { //TODO: updatetest.xml -> update.xml when finished testing - 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/updatetest.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(); } @@ -147,7 +147,7 @@ public class MainActivity extends AppCompatActivity { 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); @@ -156,7 +156,7 @@ public class MainActivity extends AppCompatActivity { }); if (clipboard.hasPrimaryClip() && clipboard.getPrimaryClipDescription().hasMimeType(MIMETYPE_TEXT_PLAIN)) { - String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString(); + final String text = clipboard.getPrimaryClip().getItemAt(0).getText().toString(); if (handleSendText(text, true)) { snackbar.show(); } @@ -165,7 +165,7 @@ public class MainActivity extends AppCompatActivity { } private void handleSendText(Intent intent) { - String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); + final String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); handleSendText(sharedText); } @@ -192,25 +192,25 @@ public class MainActivity extends AppCompatActivity { meetingName = Objects.requireNonNull(matcher.group(0)).trim(); } - AlertDialog.Builder builder = new AlertDialog.Builder(this); + 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()); - AlertDialog alert = builder.create(); + final AlertDialog alert = builder.create(); if (!checkOnly) alert.show(); return false; } else { - Meeting mtgToImport = new Meeting(meetingName, meetingID, meetingPWD, "", ""); + 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) -> { - int found = meetingsController.searchMeetingInList(meetingsController.getMeetings(), mtgToImport.meetingName); + final int found = meetingsController.searchMeetingInList(meetingsController.getMeetings(), mtgToImport.meetingName); importMeeting(mtgToImport, false); fillMeeting(found); dialog.dismiss(); @@ -220,7 +220,7 @@ public class MainActivity extends AppCompatActivity { fillMeeting(mtgToImport); dialog.dismiss(); }); - AlertDialog alert = builder.create(); + final AlertDialog alert = builder.create(); if (!checkOnly) alert.show(); return true; } @@ -230,9 +230,9 @@ public class MainActivity extends AppCompatActivity { } private void showCreateShortcutUI() { - int meeting = meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().meetingName); + final int meeting = meetingsController.searchMeetingInList(meetingsController.getMeetings(), createCurrMeetingFromUI().meetingName); - AlertDialog.Builder builder = new AlertDialog.Builder(this); + final AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.app_name); @@ -257,12 +257,12 @@ public class MainActivity extends AppCompatActivity { createMeetingShortcut(meeting, false); }); } - AlertDialog alert = builder.create(); + final AlertDialog alert = builder.create(); alert.show(); } private void createMeetingShortcut(int meetingIndex, boolean joinImmediately) { - Meeting meeting = meetingsController.getMeetings().get(meetingIndex); + final Meeting meeting = meetingsController.getMeetings().get(meetingIndex); if (ShortcutManagerCompat.isRequestPinShortcutSupported(this)) { ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(this, meeting.meetingName) @@ -284,21 +284,21 @@ public class MainActivity extends AppCompatActivity { } private void shareMeeting(Meeting meeting) { - Intent sendIntent = new Intent(); + final 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); + final Intent shareIntent = Intent.createChooser(sendIntent, null); startActivity(shareIntent); } 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(""); @@ -309,8 +309,8 @@ public class MainActivity extends AppCompatActivity { } public void fillWithSelectedMeeting() { - AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); - int search = meetingsController.searchMeetingInList(meetingsController.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); } @@ -318,15 +318,15 @@ public class MainActivity extends AppCompatActivity { @SuppressLint("ClickableViewAccessibility") public void fillDropdownMeetingName() { - ArrayList meetings = meetingsController.getMeetings(); + final ArrayList meetings = meetingsController.getMeetings(); String[] meetingNames = new String[meetings.size()]; for (int i = 0; i < meetings.size(); i++) { meetingNames[i] = meetings.get(i).meetingName; } - AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); - 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); @@ -337,16 +337,16 @@ public class MainActivity extends AppCompatActivity { @SuppressLint("ClickableViewAccessibility") public void fillDropdownAttendeeName(int meetingIndex) { - Meeting meeting = meetingsController.getMeetings().get(meetingIndex); - ArrayList attendees = meeting.attendees; + final Meeting meeting = meetingsController.getMeetings().get(meetingIndex); + final ArrayList attendees = meeting.attendees; String[] attNames = new String[attendees.size()]; for (int i = 0; i < attendees.size(); i++) { attNames[i] = attendees.get(i).name; } - AutoCompleteTextView textName = findViewById(R.id.textBoxName); - 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); @@ -357,18 +357,18 @@ public class MainActivity extends AppCompatActivity { } private void fillWithSelectedAtt(int meetingIndex) { - AutoCompleteTextView textName = findViewById(R.id.textBoxName); - EditText editAtt = findViewById(R.id.editAtt); - int found = meetingsController.getMeetings().get(meetingIndex).searchAttendee(textName.getText().toString()); + 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); } 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(); @@ -392,23 +392,24 @@ public class MainActivity extends AppCompatActivity { public void btnJoin_onClick(View view) { saveMeetingFromUI(); - Meeting currMeeting = createCurrMeetingFromUI(); + 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 listMeetings = meetingsController.getMeetings(); - int foundCurr = meetingsController.searchMeetingInList(listMeetings, meeting.meetingName); + final ArrayList listMeetings = meetingsController.getMeetings(); + final int foundCurr = meetingsController.searchMeetingInList(listMeetings, meeting.meetingName); + if (foundCurr == -1) { listMeetings.add(meeting); if (listMeetings.size() == 1) { @@ -418,7 +419,7 @@ public class MainActivity extends AppCompatActivity { } } else { - Meeting currMeeting = meetingsController.getMeetings().get(foundCurr); + final Meeting currMeeting = meetingsController.getMeetings().get(foundCurr); currMeeting.meetingID = meeting.meetingID; currMeeting.meetingPWD = meeting.meetingPWD; if (updateAttendee) @@ -437,15 +438,15 @@ public class MainActivity extends AppCompatActivity { } public void saveMeetingFromUI() { - Meeting currMeetingUI = createCurrMeetingFromUI(); + final Meeting currMeetingUI = createCurrMeetingFromUI(); if (currMeetingUI.meetingID.equals("")) { - EditText editID = findViewById(R.id.textBoxID); + final EditText editID = findViewById(R.id.textBoxID); editID.requestFocus(); editID.setError(getString(R.string.meetingWithoutID)); return; } else if (currMeetingUI.meetingName.equals("")) { - EditText editMName = findViewById(R.id.TextMeetingName); + final EditText editMName = findViewById(R.id.TextMeetingName); editMName.setText(currMeetingUI.meetingID); currMeetingUI.meetingName = currMeetingUI.meetingID; } From 42a2c353c6c737a46ebab62ebb88ba84f53588ca Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 16 May 2021 15:34:08 +0200 Subject: [PATCH 11/12] implemented getter and setter --- .../java/de/joel/zoomhelper/Attendee.java | 20 ++- .../java/de/joel/zoomhelper/MainActivity.java | 158 +++--------------- .../main/java/de/joel/zoomhelper/Meeting.java | 65 ++++++- .../zoomhelper/MeetingImportController.java | 118 +++++++++++++ .../joel/zoomhelper/MeetingsController.java | 4 +- .../java/de/joel/zoomhelper/ZoomLink.java | 10 +- 6 files changed, 226 insertions(+), 149 deletions(-) create mode 100644 app/src/main/java/de/joel/zoomhelper/MeetingImportController.java 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(); } From 355f7a775827052027711537414938b01110106e Mon Sep 17 00:00:00 2001 From: Joel Date: Sun, 16 May 2021 15:45:50 +0200 Subject: [PATCH 12/12] bump version, updatetest -> update --- app/build.gradle | 4 ++-- app/src/main/java/de/joel/zoomhelper/MainActivity.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6828c3f..d05ffea 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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" } diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java index 9990ea2..fa53be2 100644 --- a/app/src/main/java/de/joel/zoomhelper/MainActivity.java +++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java @@ -124,8 +124,7 @@ public class MainActivity extends AppCompatActivity { final Meeting currMeeting = meetingsController.getMeetings().get(meetingIndex); new ZoomLink(this, currMeeting).launch(); } else { - //TODO: updatetest.xml -> update.xml when finished testing - final AppUpdater appUpdater = new AppUpdater(this).setUpdateFrom(UpdateFrom.XML).setUpdateXML("https://baldaufwd.de/ZoomHelper/updatetest.xml"); + 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();