From 03cc5454ac41dc24f89499f4396e345efcc1f941 Mon Sep 17 00:00:00 2001 From: Joel Date: Tue, 9 Mar 2021 16:49:48 +0100 Subject: [PATCH] initial git version --- .gitignore | 15 + .idea/.gitignore | 3 + .idea/.name | 1 + .idea/compiler.xml | 6 + .idea/gradle.xml | 23 + .idea/jarRepositories.xml | 25 + .idea/misc.xml | 9 + .idea/vcs.xml | 6 + app/.gitignore | 1 + app/build.gradle | 40 ++ app/proguard-rules.pro | 21 + .../zoomhelper/ExampleInstrumentedTest.java | 26 + app/src/main/AndroidManifest.xml | 21 + app/src/main/ic_launcher-playstore.png | Bin 0 -> 31800 bytes .../java/de/joel/zoomhelper/MainActivity.java | 504 ++++++++++++++++++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++ app/src/main/res/drawable/clipboard.png | Bin 0 -> 855 bytes app/src/main/res/drawable/eyeoff.png | Bin 0 -> 1225 bytes .../res/drawable/ic_launcher_background.xml | 170 ++++++ .../drawable/iconfinder_check_7124119_32.png | Bin 0 -> 381 bytes .../drawable/iconfinder_eye_7124182_32.png | Bin 0 -> 1074 bytes .../drawable/iconfinder_login_7124097_32.png | Bin 0 -> 799 bytes .../drawable/iconfinder_pencil_7124178_32.png | Bin 0 -> 710 bytes .../drawable/iconfinder_phone_7124181_32.png | Bin 0 -> 1170 bytes .../iconfinder_pluscircle_7124019_32.png | Bin 0 -> 1144 bytes .../drawable/iconfinder_save_7124134_32.png | Bin 0 -> 690 bytes .../drawable/iconfinder_share_7124186_32.png | Bin 0 -> 749 bytes .../drawable/iconfinder_trash_7124159_32.png | Bin 0 -> 799 bytes .../res/drawable/show_password_selector.xml | 6 + app/src/main/res/layout/activity_main.xml | 244 +++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../baseline_arrow_drop_down_black_24.png | Bin 0 -> 125 bytes app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2510 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 0 -> 373 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 5461 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4533 bytes .../baseline_arrow_drop_down_black_24.png | Bin 0 -> 95 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1717 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 0 -> 238 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 3062 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2842 bytes .../baseline_arrow_drop_down_black_24.png | Bin 0 -> 120 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3534 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 0 -> 515 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 8210 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6747 bytes .../baseline_arrow_drop_down_black_24.png | Bin 0 -> 140 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6003 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 0 -> 903 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 15461 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11155 bytes .../baseline_arrow_drop_down_black_24.png | Bin 0 -> 168 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9351 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 0 -> 1358 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 22098 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 17149 bytes app/src/main/res/values/colors.xml | 10 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/values/themes.xml | 16 + .../de/joel/zoomhelper/ExampleUnitTest.java | 17 + build.gradle | 24 + gradle.properties | 19 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++++++ gradlew.bat | 84 +++ settings.gradle | 2 + 68 files changed, 1514 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/de/joel/zoomhelper/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/de/joel/zoomhelper/MainActivity.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/clipboard.png create mode 100644 app/src/main/res/drawable/eyeoff.png create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/iconfinder_check_7124119_32.png create mode 100644 app/src/main/res/drawable/iconfinder_eye_7124182_32.png create mode 100644 app/src/main/res/drawable/iconfinder_login_7124097_32.png create mode 100644 app/src/main/res/drawable/iconfinder_pencil_7124178_32.png create mode 100644 app/src/main/res/drawable/iconfinder_phone_7124181_32.png create mode 100644 app/src/main/res/drawable/iconfinder_pluscircle_7124019_32.png create mode 100644 app/src/main/res/drawable/iconfinder_save_7124134_32.png create mode 100644 app/src/main/res/drawable/iconfinder_share_7124186_32.png create mode 100644 app/src/main/res/drawable/iconfinder_trash_7124159_32.png create mode 100644 app/src/main/res/drawable/show_password_selector.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/baseline_arrow_drop_down_black_24.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/baseline_arrow_drop_down_black_24.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/baseline_arrow_drop_down_black_24.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/baseline_arrow_drop_down_black_24.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/baseline_arrow_drop_down_black_24.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/test/java/de/joel/zoomhelper/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..174a743 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +ZoomHelper \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..22c4ded --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..a5f05cd --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d5d35ec --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..481ea0c --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,40 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + + defaultConfig { + applicationId "de.joel.zoomhelper" + minSdkVersion 16 + targetSdkVersion 30 + versionCode 1 + versionName '0.2' + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'com.google.android.material:material:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'com.android.support:design:28.0.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/de/joel/zoomhelper/ExampleInstrumentedTest.java b/app/src/androidTest/java/de/joel/zoomhelper/ExampleInstrumentedTest.java new file mode 100644 index 0000000..c19b376 --- /dev/null +++ b/app/src/androidTest/java/de/joel/zoomhelper/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package de.joel.zoomhelper; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("de.joel.zoomhelper", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8acc3b5 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..1eebeba4578ef36c6ad0d57ead2be07627bdf049 GIT binary patch literal 31800 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 literal 0 HcmV?d00001 diff --git a/app/src/main/java/de/joel/zoomhelper/MainActivity.java b/app/src/main/java/de/joel/zoomhelper/MainActivity.java new file mode 100644 index 0000000..ea66455 --- /dev/null +++ b/app/src/main/java/de/joel/zoomhelper/MainActivity.java @@ -0,0 +1,504 @@ +package de.joel.zoomhelper; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Bundle; +import android.util.AttributeSet; +import android.util.Base64; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.ListPopupWindow; + +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.io.Serializable; +import java.util.ArrayList; +import java.util.Objects; + +class InstantAutoComplete extends AutoCompleteTextView { + + 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 true; + } + +} + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + watchMeetingNameBox(); + fillDropdownMeetingName(); + if (getLastMeeting() != -1) { + try { + fillMeeting(getLastMeeting()); + } + catch (IndexOutOfBoundsException e) { + AlertDialog.Builder dialog=new AlertDialog.Builder(this); + dialog.setMessage("Daten wurden zurückgesetzt, da die Config-Struktur nochmal verändert wurde."); + dialog.setTitle("Hinweis"); + AlertDialog alertDialog=dialog.create(); + alertDialog.show(); + setLastMeeting(-1); + saveMeetingList(new ArrayList<>()); + } + } + watchSaveIcon(); + watchAttIcon(); + watchDeleteIcon(); + watchNewIcon(); + watchShareIcon(); + } + + private void watchShareIcon() { + ImageView ShareIcon = findViewById(R.id.imageShare); + ShareIcon.setOnClickListener(v -> { + shareMeeting(createCurrMeetingFromUI()); + }); + } + + private void shareMeeting(Meeting meeting) { + Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, meeting.info()); + sendIntent.setType("text/plain"); + + Intent shareIntent = Intent.createChooser(sendIntent, null); + startActivity(shareIntent); + } + + private void watchNewIcon() { + ImageView AddIcon = findViewById(R.id.imageAdd); + AddIcon.setOnClickListener(v -> { + fillBlank(); + }); + } + + private void watchAttIcon() { + ImageView AttIcon = findViewById(R.id.imageAttend); + AttIcon.setOnClickListener(v -> { + btnJoin_onClick(null); + }); + } + + private void watchDeleteIcon() { + ImageView trashIcon = findViewById(R.id.imageTrash); + trashIcon.setOnClickListener(v -> { + removeMeeting(getLastMeeting()); + }); + } + + private void removeMeeting(int meeting) { + ArrayList meetings = getMeetings(); + if (meetings.size() > 0) { + 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(); + } + } + } + + private 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); + + editMeetingName.setText(""); + editID.setText(""); + editPW.setText(""); + editName.setText(""); + editName.setAdapter(null); + editAtt.setText(""); + } + + private void watchSaveIcon() { + ImageView saveIcon = findViewById(R.id.imageSave); + saveIcon.setOnClickListener(v -> { + saveAllMeetings(); + }); + } + + public void watchMeetingNameBox() { + EditText meetingNameBox = findViewById(R.id.TextMeetingName); + meetingNameBox.setOnFocusChangeListener((v, hasFocus) -> { + if (!hasFocus) { + fillWithSelectedMeeting(); + } + + }); + } + + public void fillWithSelectedMeeting() { + AutoCompleteTextView textMeetingName = findViewById(R.id.TextMeetingName); + int search = searchMeetingInList(getMeetings(), textMeetingName.getText().toString()); + if (search != -1) { + fillMeeting(search); + } + } + + @SuppressLint("ClickableViewAccessibility") + public void fillDropdownMeetingName() { + ArrayList meetings = 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); + ImageView dropdown = findViewById(R.id.image); + ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, meetingNames); + textMeetingName.setAdapter(adapter); + + textMeetingName.setOnTouchListener((View.OnTouchListener) (paramView, paramMotionEvent) -> { + adapter.getFilter().filter(null); + textMeetingName.showDropDown(); + return false; + }); + + textMeetingName.setOnItemClickListener((arg0, view, arg2, arg3) -> { + fillWithSelectedMeeting(); + }); + + dropdown.setOnClickListener(v -> { + textMeetingName.showDropDown(); + adapter.getFilter().filter(null); + }); + } + + public void fillDropdownAttendeeName(int meetingIndex) { + Meeting meeting = getMeetings().get(meetingIndex); + 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); + ImageView dropdown = findViewById(R.id.image2); + ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, attNames); + textName.setAdapter(adapter); + + textName.setOnItemClickListener((arg0, view, arg2, arg3) -> { + fillWithSelectedAtt(); + }); + + dropdown.setOnClickListener(v -> { + textName.showDropDown(); + adapter.getFilter().filter(null); + }); + } + + private void fillWithSelectedAtt() { + AutoCompleteTextView textName = findViewById(R.id.textBoxName); + EditText editAtt = findViewById(R.id.editAtt); + int found = getMeetings().get(getLastMeeting()).searchAttendee(textName.getText().toString()); + editAtt.setText(getMeetings().get(getLastMeeting()).attendees.get(found).num); + } + + public void fillMeeting(int id) { + ArrayList meetings = getMeetings(); + + 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); + + editID.setError(null); + editID.clearFocus(); + + editMeetingName.setText(meetings.get(id).meetingName); + editID.setText(meetings.get(id).meetingID); + editPW.setText(meetings.get(id).meetingPWD); + editName.setText(meetings.get(id).attendees.get(meetings.get(id).lastAtt).name); + editAtt.setText(meetings.get(id).attendees.get(meetings.get(id).lastAtt).num); + + fillDropdownAttendeeName(id); + } + + + private void launchZoomUrl(String url) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + if (intent.resolveActivity(getPackageManager()) != null) { + startActivity(intent); + } + } + + private String buildZoomURL(String confno, String pwd, String name, String attendees) { + if (!Objects.equals(attendees, "")) { + return "zoomus://zoom.us/join?confno=" + confno.replace(" ", "") + "&pwd=" + pwd + "&uname=" + name + " (" + attendees + ")"; + } else + return "zoomus://zoom.us/join?confno=" + confno.replace(" ", "") + "&pwd=" + pwd + "&uname=" + name; + } + + 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 { + objOutputStream.writeObject(obj); + } catch (IOException e) { + e.printStackTrace(); + } + try { + objOutputStream.reset(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + 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 + Meeting meeting = (Meeting) obj.readObject(); + listMeetings.add(meeting); + } + } catch (EOFException ex) { + //ex.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + return listMeetings; + } + + public void saveMeetingList(ArrayList meetingList) { + SharedPreferences mPrefs = getPreferences(MODE_PRIVATE); + SharedPreferences.Editor prefsEditor = mPrefs.edit(); + prefsEditor.putString("Meetings", meetingsToString(meetingList)); + prefsEditor.commit(); + } + + 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) { + saveAllMeetings(); + } + + + public void btnJoin_onClick(View view) { + saveAllMeetings(); + Meeting currMeeting = createCurrMeetingFromUI(); + String url = buildZoomURL(currMeeting.meetingID, currMeeting.meetingPWD, currMeeting.attendees.get(currMeeting.lastAtt).name, currMeeting.attendees.get(currMeeting.lastAtt).num); + launchZoomUrl(url); + } + + 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); + + Meeting currMeeting = new Meeting(editMeetingName.getText().toString(), editID.getText().toString(), editPW.getText().toString(), editName.getText().toString(), editAtt.getText().toString()); + return currMeeting; + } + + public void saveAllMeetings() { + ArrayList listMeetings = getMeetings(); + Meeting currMeetingUI = createCurrMeetingFromUI(); + + if (currMeetingUI.meetingID.equals("")) { + EditText editID = findViewById(R.id.textBoxID); + editID.requestFocus(); + editID.setError("Meeting kann nicht ohne ID gespeichert werden!"); + return; + } + else if (currMeetingUI.meetingName.equals("")) { + EditText editMName = findViewById(R.id.TextMeetingName); + editMName.setText(currMeetingUI.meetingID); + currMeetingUI.meetingName = currMeetingUI.meetingID; + } + + + int foundCurr = searchMeetingInList(listMeetings, currMeetingUI.meetingName); + if (foundCurr == -1) { + listMeetings.add(currMeetingUI); + if (listMeetings.size() == 1) { + setLastMeeting(0); + } else { + setLastMeeting(listMeetings.size() - 1); + } + + } else { + Meeting currMeeting = getMeetings().get(foundCurr); + currMeeting.meetingID = currMeetingUI.meetingID; + currMeeting.meetingPWD = currMeetingUI.meetingPWD; + currMeeting.updateAttendee(currMeetingUI.attendees.get(0).name, currMeetingUI.attendees.get(0).num); + listMeetings.set(foundCurr, currMeeting); + setLastMeeting(foundCurr); + } + saveMeetingList(listMeetings); + fillDropdownMeetingName(); + } + +} + + +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; + } + } + + 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/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/clipboard.png b/app/src/main/res/drawable/clipboard.png new file mode 100644 index 0000000000000000000000000000000000000000..9bc320f28ff90e99bf5cfabb6eee434f97d201d3 GIT binary patch literal 855 zcmV-d1E~CoP)8T>Yd#KsXMaU^(5(2f^T?O%0u%w8Bco3n8f(ev@iKT6}@8==2 zy1SX#bn@?Fzo(hs`~CU6-+OO(1OIm^tAB9ry{C20o%F&1;N0*0)$@I=Hht$%0rGFW zdtABP9O!hy@Vc4CYl}0rLjibYe7ygmzx%%fhPt>lgkD;SX09Cw!06cIS&tu;=?S3F zw40b0cFByb?F@QW#wRVIOTdPSD{S=6?Y1;Y01C!RGZ@9BfQPx!7e&$CR$CC3EG7Ss z4uZ>3`HwUJ*J%jGip8|z0GkZF{^G<$Z}UAL7N1M=1%^D#(WTQn09uOw+GsFXjmq*l zo&+`kgysity1PMGvLGy(&`&L~rD{}GUnBPzvM*xmnO6(Nr|usB#T!jOe7#&=2dK}N zuM551gh-UBTwN^B0xU0IyaB5JS4Ah&!g|u7tZiLaqM1u0ZWk%X+IY;o;?Cd0a#;XURi7_k2d1*b?52bzI9g@uK$7xd@tn|z^EP#Psq#zHF4OJi z-k0h2p#Y4AlM{wj0K5~xJI%4R0sqzDP4`*z`M?2Mivt)|ZymojJG%vZyjz|?m(?JeaAL?LeQ77Y0$j?b|jp9=12h2ARP8l zr(aMgo(c-ZQwI*v1|cHgmQ2;o;y7K!>1sEKeVu~%x;2(GW{wkzFCykR0jwtZ?dX7D zGfpwEA2>{X{}z!_?-4sXVAvJVFzDrcSb87q&%G3v_%MF+$F_2bvrh!Ta~{VTpjR-R z{ojT55ZToB4JlbWmY}*+S&h&5TK39q^2k2Dwf^{pZceGw%jZAn8WqEbl|=vm002ovPDHLkV1k@tpoahe literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/eyeoff.png b/app/src/main/res/drawable/eyeoff.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7ba5d6db33d9e50868f61e1375205d0f38795e GIT binary patch literal 1225 zcmV;)1UCDLP)Pv0fG9+%eRt*_ z7jy6QcG}LQ#DEL`t9#Bp-#Nee9_PCQ|I4SEx~4TXbxmuoWKH8QE=CTCkwd}yP}3C$ za3z4C#DZ2+=t=;H-^dh|cF$I2Q?e_TwX4G6IZH04ZZk&iR^>(!76GW}?>L-Rae9+> z{1~8@1uz|ih=xf!y^aYyEzkg&qIq-y10vc0gXSww6 zvTb{8RsaCC^-Y^pC7R>@OOQ4P{X)}ntRisf;>gGXG3Db6os_I{MD7PR0xP`%3P+tl z`q9t!#ebd^06@?R4Fe_FWWttYXKYWtF_B2b96tU_Ey!*k$a#=p!fx*?2=I^X8q2M)YD>d#|YR_Tyb?m>CnbzQ*G zyAs_Ur)C7Otfwl57(EKC5TT`~GqxROT#gh_~QT9W+bp? z|NiKZ7ci+03^KX{SOK8U#MJk6cC@LoDF>j)_dFM2t5ghrRbBmTvCppwJGK+0!?jmA z#pzf5NwNTsSfQH)o_Ec&qY`NG2PV5>?V`GOGJ_sO2mxOM2(s3c54DgJR3`n;0H?_W zy--`%c=Hs1wCEF_ts+}Lx1*PG64BGuF_9>f?H+)&t8aL~gFtvLXBMz+dsvW{T(d|e z@Z=(o?_Cz4r#pTUePn&wrIiA`xT8OIv}ZWPaV7 z{$@034~&$L&wkTMzz6xak5PMclgInNnZU} zc%^aD-vA5Uh!4uNf3t1d!-YT!+@gPCfDRQ6%yOQUjv5iXRJ6q!**uTx_d zoSiS<^+luOwN}#`io85gMcz(ywr`%UPTuvkENkwdR=z00HlR3PEP$x)b-N`&D|7*G z8JYTd=V{tTv@ikWC zEu!W@kY#G*T5(iG^qi`kDU;%lZM${AKOkpMC_=M)bT13wvXpZ=R2{uD+1>Fi6j*|P nOPRG-uWesFU5&qf|9$-fD^tnPus*=x00000NkvXXu0mjfhXqF4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/iconfinder_check_7124119_32.png b/app/src/main/res/drawable/iconfinder_check_7124119_32.png new file mode 100644 index 0000000000000000000000000000000000000000..853c1ef155411a8ecee0b7133d5d676158dfaf2a GIT binary patch literal 381 zcmV-@0fPRCP)&LtdT&7jg9_+`WL3s&9ap)R)UofA^%}- z5lAIyx26g)TIDzN3pBMhVw{&|5D7Ec#mw3`w_NV*In2BVAt53EJ*vu|$8oo=Ha>3< z5+&+vbl1xlJ5iq<2r34%jUf`t#01mUxPK4Y7n;O;j0S^fY b2?3Y`8yTv}5IZ@T00000NkvXXu0mjfBiElQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/iconfinder_eye_7124182_32.png b/app/src/main/res/drawable/iconfinder_eye_7124182_32.png new file mode 100644 index 0000000000000000000000000000000000000000..6733412844439e6fc19a420883acdc52bcafe849 GIT binary patch literal 1074 zcmV-21kL-2P)Gi3Hn@0czM(hAs@9j&Y-bZU7q+1J(o~S{D^88`7cw zrti3zH}%c5l@?68>9;%Qe)pa4oqNu`2iCEUHHNH~zcbYGibw1kj6A2xGXNso!`44k z^v9ui>;|C!tAHK5BBfqqT2y!sD18KdT#>H?=^l!I`PUN(2#3RklT!SNDD6PuO2oP_ zi%Lg8CO(VDPw~X1Iz@x#hx_fh+Qqv0BmvX z`PugH_ILd~zpq$8Z78}GBMETM7=8n3tEwm&v@FYBPBegJS?1c!yY-5G?hGd>&1()hgpJg3-C;BIGha*^yLTN-q=_q8|N;I=mBzzvQR`1$i}(L z!C;B9Y9qkJ2I@oUKREV zGVD;Q2&9jZ3r!cLJ_7y(5Rta}P_%53fO!ue0A2t^54qC>nbbRJN08yFijtb-`JOY$ z^F3#(DoSdyB1CjwUKaTN+_{vZ2OZOEi?rkjsEkAkMCIMAbL#KX0rHV4xIzG1^sKuZ zEX%TO(X)8 z;w{TEMy1IyXB}=1a=xkbjl^Pe;A+GAP_)c8@(Y95=)>6*%PtM^(GB!E*!v%=;g90KYnBV_i6U*exQNJUOG21#hTI zC(dy=m{pZdoh+zc>LL;$Ti~PK89kb#E>G>+Ud36|g$V^tuk^=NWQ!@srdovt;04#7)j!8sgu~&&lx{kNXglEh zFYXeU5$M>!{o{`{khrm9SEST&k9B|gcxdio_Hi%ieDR!yeul)ZOmpdnSn)Z s?iuVcJn}>0o1UAjVklk5I@TQj01-N<>tzGL&j0`b07*qoM6N<$g4jR%00000 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/iconfinder_login_7124097_32.png b/app/src/main/res/drawable/iconfinder_login_7124097_32.png new file mode 100644 index 0000000000000000000000000000000000000000..309f2ff4b079e48a8d3719655511db129e2d064f GIT binary patch literal 799 zcmV+)1K|9LP)R9J=WmQQRX@b@+W6thqFnPgTMx0p#e=s(MKZE+puauysN9rtyn-{hjT=f zF2FJ+nG7AQ9a)NC39PV*Z+p|C&GxfQ!31-E;mysk}m)gVBASAL&W zb;>CYMLX*)bQp-KXwvhu<_{ufLtNIRhoYVJ>bir#f{7}myfLa=0=~Lvw+Uxe>5vID zhucfv3Z`?p{A_l}vd5t>I9Bx~gwXDg-zf{=+1E;^67McnrI}nOEty$rE zu}@XIsr}I$u-nTnC@ydB^qqTbEI>WQ0Ytbm#TG9O3k`iak{u9br?(5L z>_W7n`!D+nQoV^AO?Jl<3mu}cDJ803X3fYD8eKuUCqCkH-L1gK36C~Q?a!V-VE^pD zA^_la-}#q05u*hWbH^`x;{p*U8MK{Dz;2JssDQi(v8>-Bl#n+@ggw9<3yGE`z)}kP zUqq%9mg+wH!bKW^q^QKa_45ZU;+qbIAyl9H4A+-q(Z$mxrF-Hdz+SJvsnuCRHm5{* zY9gTUPw#YJctvi=RON6e+_BVzAdfAvm|wD-%-dPqVUxT`>uj6tw7769XIA(m0}-yK zZYIipk^wXEDCJ)DxIb+ADD`_~wn3g%Z|mvV<6Yf*1ehC(-%kOiA_Cej^&RxC>AOHjo*`dExH>vK z@XA#I;Ygn!^dzvq&~p(vV-=yCgrAMXIzUh7;W8mY5aAY}0gU0E^^C_Uc&PKrNrYrR zVxBJlY`E}p^!DuRr?<(&$4_|#ntg6wNDM8*Uv{9qE9$es4a1-tfz*12 zIVUygC)M>o;u~em`4c%k$p%0=|OI`#akn}x$x?`xkm^W zH$sa>b9!uK@J*qbWp|*xE9zU*Vq3U!;7Xam_{iXNvASgm$if9`%Y_?QP|5@fwcTnZ zmvEjztdlVx=O(Tyg4tO31s00zOPgO4%Umv=$sg3xKZMUn|A_k7ho|hW=pu% z(&_{ptRt|Ppn~B@bO|F~By|Tk>IS^105H8Ez3VHQ`(^b literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/iconfinder_phone_7124181_32.png b/app/src/main/res/drawable/iconfinder_phone_7124181_32.png new file mode 100644 index 0000000000000000000000000000000000000000..49f339097f520c70ca1cf5f764f46284df43a1a1 GIT binary patch literal 1170 zcmV;D1a13?P)omAY#7IoRlLXzVUJ6OpGffIrUb`wc|Gcq$ zaA3g7{3`&VkQFRnI${az280%{ae>+6@TvMkHFUw~kKkq%~>Knws?x|01pUru+9w8fuA*)Fi+ z%%#-Rz^VHMD3rRW;ikQL!AGU9uu%>3ev=mg7#M}75;Ye4IahJx6fg>)LaSw2v-Qe9 z18~sW`L!A>_j9&wJBx4(z;g^G0&oJO1*57j02CjCh_sXpz?d+G0S7>l6@Jd)@Xj(3 z8VUdy50wlcnfxdXdLj3u&v?(bF&0}8Y1L+Of}`r zH8+iesB{CXTvJ++eTlxFuS*Lc&Q!oa;Dv%27J9rK16C*P?!ADP6d++A`B7jP0M+)! zSZo1+lg%6eCSA8bBoO^SA06)-C`-K!rN8 z;i>w^z8V@D%6hg+q%Gc3_r%)WwGE9MA78U>;^nq2zYh!y%vzi|%WR?66``KcIfjqg+8U2iOf6e7nA2fL}E=Ct4J@VyU2 zT034t^fNb#mFVy31c;d1mw|JZsb>5>5Oi8JW0X1Y3&p)sB!v|4c@<;(yrbOrQ(7rE zz5p(|h|e-X5cs1bz?STTz24UA-Tv7MM9_^21Yz@xw&Yb`x2%qc~!@QpCs+>!9;)Wj!MQJ@xY9_ zAfZJ|u5I#w&8%>1M_5Epx}d)*8qEQKY3?e&Ba`o-ybYA+qG?B>ueZlHmbtA}5F0>I zGimqs&sc%HlKtID(6`*jM+G^vxouk{SEa7WL|>0(K%GE0@ZsnK`sr-({4{F?@;;Ha z_?svnxWJ0i8Av+^Pnp^^!0S9$`;(7K(I24j4M&IBj#(vhDcX8iqdd&h=ZFDNQyg`^_m`So0mph%`^2JTS(3a}qoIqm1` z3a3RiB_h{UC8gqwqf#cqE}#)`$})k6j~_ogHZOp@nww)4PI+J_s;?{5&UvHg{zPAI z;fpzM0B^`>d%PY;UsB{n;7NRD4B#MoVB-4nPVYafQUDYw9Nt+*)!o&G1Zq%S?BFak kM8+513!KZB{eOA&7c-Wgi$9dDq5uE@07*qoM6N<$f*ms`ivR!s literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/iconfinder_pluscircle_7124019_32.png b/app/src/main/res/drawable/iconfinder_pluscircle_7124019_32.png new file mode 100644 index 0000000000000000000000000000000000000000..03db53a737a7892c8f4e1d7afb9d7817fa80b622 GIT binary patch literal 1144 zcmV-;1c&>HP)@5;{X?U# z2+7v~jvLc$O>*g&Y-SzDDIGLNDHVD|tqB&I0PvDAZ;{X&H|D0luUmkdIdT9!Wk~OL zoj&oAZQD9XuphQMX1e{5wTEe?6%P`9>khd0`^lUwWE77a0 zVFG<&x~rjG-EsZ;)g3>FDTAj5x#>Z^{Afbzi!I4;?fN(f;-n(j=FkWlV`;t~Cm~vps z)e>RbwkFWHNvegJQ-K1^BLe^%$7C~GD>Gp{3-=6>X$K;LjYR+(06>JKf2=GZp)Rz- zd*MVDgRWX5a2%&Z1TUfP{&S<=)kfHBkUr857B@a~{vbzvNvqS#mcT=R%O~(qud<9E z+?&s&m#ZcV%06YU)DB>4p8)q`AI)0E^<9HbWdX)ul*#&xT!AZ~6OqCG#c8!`s>z=v10;ZU_W#slKr9w3w9s)|K zkQVfqZtlkC(_2*n+_;o6&FCX)P1JHq8u#FyL^16^>>%1hz|#OAf{cG`pMYYqGy~8! z0I<-6ZQFr|)H@SFd+x!uZ5GIfM)o!l&-lmpE%V*{${)|2?g#_)Du5IBf8Q>y{j&UB zkn^?tN?|R(QV1FcfJihx4#L|2AcPMVoauT0cvXgbM|UOxth$2bO0TkpYXzuRH=ug!n;>BCCyp-M6WjYqH%_)jRMLOY1|m_2X2B=ZndloBBeL0*IkfO%vHaS8 zi6BG7GxN^WZ*@tnSAZY==SGjqUa8&uY7o%{Y6`9UU%3BKFa892sI}dK0|@Z|0000< KMNUMnLSTYX(hF(; literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/iconfinder_save_7124134_32.png b/app/src/main/res/drawable/iconfinder_save_7124134_32.png new file mode 100644 index 0000000000000000000000000000000000000000..077368c9aaae984503d9d927cd356c7d2859ed6d GIT binary patch literal 690 zcmV;j0!{siP)3#?Zeo~~fomYmVL^+? zPIl_lJ?T&s^cU2rlR+0rRuRfBwF^qF;p#OZ=pt-CbT1jBxHI1l>uful?YiTFP(G)3 zzRx?)^YG65e&2xu{O^#UFLqwK+G?6Q3y{l6PkJVv38G^J4Pb`22($z3+v7k89H3U% z_W)*Tp{w`WSrPX!Z~Jr0ZYW4 z1NuwN0Tiy6GcPlzA+IT^^Sy&tiiyGsSe6yeZpdi9CO<*nf@~FLiYl&*RSJO0Foxbh z<@X6wZ9?b)>Re&evaI9N)6<*209iZIfoOAH!yWnXZt`hGvmG#>jE@83rS-19fjgq| z1Zc_Hkq#gQ{!h^64a7CR1Tim%63v3wADi%R=!G2M9H;_5&lLux3Zj80eU8bApD~?8r+IjUfu6+LZsqN&c*B~c=7T{2gjMsrA=*?7ea;8R_2lz+u Y3kVm^_?n__*#H0l07*qoM6N<$f{Lg;QUCw| literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/iconfinder_share_7124186_32.png b/app/src/main/res/drawable/iconfinder_share_7124186_32.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f58b060abb48e5c60b0045c5a7653ea0d7664e GIT binary patch literal 749 zcmV6Xf0ZB2^7>J4&81Mq?)N6D)?tAIExB3B&cb6KZo31u5B(&!(AQp zP4|7@d++zlm-l=34*1tiqDpKS*>3dJP5}T)+OlQM{N5D;hLPdcP%pR`0NBF33+@oG zZDHP7#=PPTlYk<6-Dd$0w;dM-xRDu4lbrT8D7k^mXwqGprl}NV*jZLl(v}-!gOWNr zR+NOzt`AmW=4&%xfqfg03tKbr9VsuM@J&&Mo&O)C+_PTJ-U=iTpyQelb9ya)V}AbO zY75}^08Rw`C;*Er>*xG3+(4iW9S4B$HK8W0!tBD};Pt(0+OPW*Tm_&x4(&A}_!fUlhAxQ+8_|||AktP0sOJ=Z-%%^>#Og%&1i(=bKBgzF zXEP;W7v=%0FuNck6W)e!$^~}_L_ZJMg0lNe$me$B!kdU%^pTF{fljPxA8`l;6`|HV zRfks5a_C)414t3<7orXdx*m(DXgPmKSD5%KD~sz#4xO2U&bSCp`|?*wd4P(3CDIQQ fzqR{m_TT;hBdD8LKwQR<00000NkvXXu0mjf3#Uvo literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/iconfinder_trash_7124159_32.png b/app/src/main/res/drawable/iconfinder_trash_7124159_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9e654366deb07214c9efe2aa75c7a4438a934d21 GIT binary patch literal 799 zcmV+)1K|9LP)R9J=OmOV@qQ4q&}^9~3h8UqBs5<6+IAXdcKOAf&XR*6QT zJ47pMLQK%s%AC+ij2{GS3?IRYL=s|UEYLzb3q=F?5i!c$8w+=r$K5XMolr5w-OHQ* z%=~x$^L8KXb(2y9+B-9ic|&uQFJ*Z>`E=ynt`TVK>dPS91u9}7Ih54rPN2Or z(`b#n*`jzz!dPue+KKIwg_buoONf^{id}I1f;k0x1E}yN+F1gwDRyCId}PAiOM4ll z^pV1pLtrPZh;q8C@4g5D82}Jtnx@9GZ<9WyYiTdjB*-FwC__^d!-IvG z$RQMKmV>obTUSnT07b)C6@znT?vkqQK@%*X)n`-O1l+vYj!;Q9-!6hKW@|x zAUf$DPoq-5(PLRjOh6p4`xL(K0YY^OYk(^NDeNG^WsnPi^L{XOphY=diKQ>Fw7etoH5b<&hg z0H*^#J|6v=n84iJ%^dI@0HJIGqG9YeKW8!met4i+*)yPM5F4rgHUu=#>^~$3=O0SOLx!MXtB$7<;WRKm9H_dKsE+*d|{HH(e~d;WUO_W|H}UX{W=KUu53xNkbjjfOZ)YSUv~KT+SSf#l>2#Ay|oQ$3e2ToG*p-?nLx{lLoZ$~ewr0%1?>=|BVlphH29ruX*x1L9fR8P z8hiHQ)mod=tSH^36%RQ)mMXb6_2}Me93;^_`b>BKvC6!jwAiZc(O@ut)>HE8`IGF2 dq+Iu|{ROQw@tNpjcQOC~002ovPDHLkV1hB$VkrOs literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/show_password_selector.xml b/app/src/main/res/drawable/show_password_selector.xml new file mode 100644 index 0000000..b59ce6d --- /dev/null +++ b/app/src/main/res/drawable/show_password_selector.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..98b5f93 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + +