diff --git a/.img/screenshot.png b/.img/screenshot.png
new file mode 100755
index 0000000..798afeb
Binary files /dev/null and b/.img/screenshot.png differ
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..b2d3584
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,36 @@
+plugins {
+ id 'com.android.application'
+}
+
+android {
+ namespace 'org.clubelec.clubelecemailkiosk'
+ compileSdk 33
+
+ defaultConfig {
+ applicationId "org.clubelec.clubelecemailkiosk"
+ minSdk 21
+ targetSdk 33
+ versionCode 1
+ versionName "1.0"
+
+ 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.6.1'
+ implementation 'com.google.android.material:material:1.9.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+}
\ 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/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..cf001c2
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/org/clubelec/clubelecemailkiosk/activity/MainActivity.java b/app/src/main/java/org/clubelec/clubelecemailkiosk/activity/MainActivity.java
new file mode 100644
index 0000000..b98492b
--- /dev/null
+++ b/app/src/main/java/org/clubelec/clubelecemailkiosk/activity/MainActivity.java
@@ -0,0 +1,361 @@
+package org.clubelec.clubelecemailkiosk.activity;
+
+import android.app.Activity;
+import android.content.ContentValues;
+import android.content.Intent;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.text.InputFilter;
+import android.text.InputType;
+import android.text.TextUtils;
+import android.util.Patterns;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowInsets;
+import android.view.WindowManager;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.google.android.material.elevation.SurfaceColors;
+
+import org.clubelec.clubelecemailkiosk.R;
+import org.clubelec.clubelecemailkiosk.helper.DatabaseHelper;
+import org.clubelec.clubelecemailkiosk.helper.SharedPrefManager;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+public class MainActivity extends AppCompatActivity {
+
+ private static final String PREF_NOT_FIRST_LAUNCH = "not_first_launch";
+ private static final String PREF_PASSWORD = "password";
+ private static final int REQUEST_CODE_EXPORT_EMAILS = 2;
+ private static final int REQUIRED_TAP_COUNT = 10;
+ private static final long MAX_TAP_DELAY = 3000;
+ private DatabaseHelper databaseHelper;
+ private EditText editTextEmailAddress;
+ private CheckBox checkBox;
+ private Button button;
+ private int tapCount = 0;
+ private int passwordMaxLength = 6;
+ private Handler handler;
+ private Runnable tapResetRunnable;
+ private SharedPrefManager sharedPrefManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ getWindow().setStatusBarColor(SurfaceColors.SURFACE_2.getColor(this));
+ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.activity_main);
+
+ getWindow().getDecorView()
+ .setOnSystemUiVisibilityChangeListener(visibility -> {
+ if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
+ hideSystemUI(getWindow());
+ }
+ });
+
+ sharedPrefManager = SharedPrefManager.getInstance(getApplicationContext());
+ boolean isNotFirstLaunch = sharedPrefManager.getBool(PREF_NOT_FIRST_LAUNCH);
+
+ if (!isNotFirstLaunch) {
+ showFirstLaunchPasswordInputDialog();
+ hideSystemUI(getWindow());
+ }
+
+ databaseHelper = new DatabaseHelper(this);
+
+ editTextEmailAddress = findViewById(R.id.editTextTextEmailAddress);
+ editTextEmailAddress.setOnFocusChangeListener((v, hasFocus) -> {
+ if (!hasFocus) {
+ hideKeyboard(v);
+ }
+ });
+ checkBox = findViewById(R.id.checkBox);
+ button = findViewById(R.id.button);
+
+ button.setOnClickListener(v -> onButtonClick());
+
+ ImageView logoImageView = findViewById(R.id.activity_main_clubelec_logo);
+ logoImageView.setOnClickListener(v -> onLogoClick());
+
+ handler = new Handler();
+ tapResetRunnable = () -> tapCount = 0;
+ }
+
+ private void showFirstLaunchPasswordInputDialog() {
+ final EditText input = new EditText(this);
+ input.setInputType(InputType.TYPE_CLASS_NUMBER);
+ InputFilter[] filters = new InputFilter[]{new InputFilter.LengthFilter(passwordMaxLength)};
+ input.setFilters(filters);
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.first_launch_password)
+ .setMessage(R.string.first_launch_password_desc)
+ .setView(input)
+ .setPositiveButton(android.R.string.ok, (dialog, which) -> {
+ String password = input.getText().toString();
+ if (!TextUtils.isEmpty(password) && password.length() == passwordMaxLength) {
+ sharedPrefManager.saveBool(PREF_NOT_FIRST_LAUNCH, true);
+ sharedPrefManager.saveString(PREF_PASSWORD, password);
+ } else {
+ showFirstLaunchPasswordInputDialog();
+ }
+ })
+ .setCancelable(false)
+ .show();
+ }
+
+ private void onButtonClick() {
+ String email = editTextEmailAddress.getText().toString();
+ boolean isCheckBoxChecked = checkBox.isChecked();
+
+ if (TextUtils.isEmpty(email)) {
+ return;
+ }
+
+ if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
+ showErrorDialog(getString(R.string.invalid_email_format));
+ } else {
+ if (!isCheckBoxChecked) {
+ showErrorDialog(getString(R.string.checkbox_unchecked));
+ } else {
+ showConfirmationDialog(getString(R.string.is_email_correct) + email);
+ }
+ }
+ }
+
+ private void showConfirmationDialog(String message) {
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.confirmation_dialog)
+ .setMessage(message)
+ .setPositiveButton(android.R.string.yes, (dialog, which) -> {
+ String email = editTextEmailAddress.getText().toString();
+ saveEmailToDatabase(email);
+ editTextEmailAddress = findViewById(R.id.editTextTextEmailAddress);
+ checkBox = findViewById(R.id.checkBox);
+ editTextEmailAddress.setText("");
+ checkBox.setChecked(false);
+ Toast.makeText(MainActivity.this, getString(R.string.email_saved), Toast.LENGTH_SHORT).show();
+ })
+ .setNegativeButton(android.R.string.no, null)
+ .show();
+ }
+
+ private void saveEmailToDatabase(String email) {
+ SQLiteDatabase db = databaseHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(DatabaseHelper.COLUMN_EMAIL, email);
+ db.insert(DatabaseHelper.TABLE_EMAILS, null, values);
+ }
+
+
+ private void showErrorDialog(String message) {
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.error)
+ .setMessage(message)
+ .setPositiveButton(android.R.string.ok, null)
+ .show();
+ }
+
+ private void onLogoClick() {
+ tapCount++;
+ if (tapCount == REQUIRED_TAP_COUNT) {
+ handler.removeCallbacks(tapResetRunnable);
+ handler.postDelayed(tapResetRunnable, MAX_TAP_DELAY);
+ showPasswordDialog();
+ } else if (tapCount > REQUIRED_TAP_COUNT) {
+ handler.removeCallbacks(tapResetRunnable);
+ tapCount = 1;
+ } else {
+ handler.removeCallbacks(tapResetRunnable);
+ handler.postDelayed(tapResetRunnable, MAX_TAP_DELAY);
+ }
+ }
+
+ private void showPasswordDialog() {
+ final EditText input = new EditText(this);
+ input.setInputType(InputType.TYPE_CLASS_NUMBER);
+ InputFilter[] filters = new InputFilter[]{new InputFilter.LengthFilter(passwordMaxLength)};
+ input.setFilters(filters);
+
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.enter_password)
+ .setView(input)
+ .setCancelable(false)
+ .setPositiveButton(android.R.string.ok, (dialog, which) -> {
+ String enteredPassword = input.getText().toString();
+ if (enteredPassword.length() != passwordMaxLength) {
+ showErrorDialog(getString(R.string.enter_password_incorrect_format));
+ } else {
+ String storedPassword = sharedPrefManager.getString(PREF_PASSWORD);
+
+ if (enteredPassword.equals(storedPassword)) {
+ showActionsDialog();
+ } else {
+ showErrorDialog(getString(R.string.enter_password_incorrect));
+ }
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, null)
+ .show();
+ }
+
+ private void showActionsDialog() {
+ String[] actions = {getString(R.string.show_emails), getString(R.string.export_emails), getString(R.string.clear_database)};
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.select_action)
+ .setItems(actions, (dialog, which) -> {
+ switch (which) {
+ case 0:
+ showEmails();
+ break;
+ case 1:
+ openExportActivity();
+ break;
+ case 2:
+ clearDatabase();
+ break;
+ }
+ })
+ .show();
+ }
+
+ private void showEmails() {
+ List emails = getEmailsFromDatabase();
+ StringBuilder builder = new StringBuilder();
+ for (String email : emails) {
+ builder.append(email).append("\n");
+ }
+
+ new AlertDialog.Builder(this)
+ .setTitle(R.string.saved_emails)
+ .setMessage(builder.toString())
+ .setPositiveButton(android.R.string.ok, null)
+ .show();
+ }
+
+ private void clearDatabase() {
+ SQLiteDatabase db = databaseHelper.getWritableDatabase();
+ db.delete(DatabaseHelper.TABLE_EMAILS, null, null);
+ Toast.makeText(this, getString(R.string.database_cleared), Toast.LENGTH_SHORT).show();
+ }
+
+ private void openExportActivity() {
+ Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType("text/plain");
+ intent.putExtra(Intent.EXTRA_TITLE, "emails.txt");
+ startActivityForResult(intent, REQUEST_CODE_EXPORT_EMAILS);
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (requestCode == REQUEST_CODE_EXPORT_EMAILS && resultCode == Activity.RESULT_OK) {
+ if (data != null && data.getData() != null) {
+ Uri uri = data.getData();
+ exportEmails(uri);
+ }
+ }
+ }
+
+ private void exportEmails(Uri uri) {
+ List emailsList = getEmailsFromDatabase();
+
+ if (emailsList.isEmpty()) {
+ Toast.makeText(this, getString(R.string.no_emails_found), Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ try {
+ OutputStream outputStream = getContentResolver().openOutputStream(uri);
+ if (outputStream != null) {
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
+ for (String email : emailsList) {
+ writer.write(email);
+ writer.newLine();
+ }
+ writer.close();
+ Toast.makeText(this, getString(R.string.emails_exported), Toast.LENGTH_SHORT).show();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ Toast.makeText(this, getString(R.string.export_failed), Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ private List getEmailsFromDatabase() {
+ List emails = new ArrayList<>();
+
+ SQLiteDatabase db = databaseHelper.getReadableDatabase();
+ String[] projection = {DatabaseHelper.COLUMN_EMAIL};
+ Cursor cursor = db.query(DatabaseHelper.TABLE_EMAILS, projection, null, null, null, null, null);
+
+ if (cursor != null) {
+ while (cursor.moveToNext()) {
+ String email = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_EMAIL));
+ emails.add(email);
+ }
+ cursor.close();
+ }
+
+ return emails;
+ }
+
+ public void hideKeyboard(View view) {
+ InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
+ inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
+ }
+
+ @Override
+ public void onWindowFocusChanged(boolean hasFocus) {
+ super.onWindowFocusChanged(hasFocus);
+ hideSystemUI(getWindow());
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ hideSystemUI(getWindow());
+ }
+
+ @Override
+ public void onBackPressed() {
+
+ }
+
+ public void hideSystemUI(Window window) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ window.getInsetsController().hide(WindowInsets.Type.systemBars());
+ } else {
+ View decorView = window.getDecorView();
+ int uiVisibility = decorView.getSystemUiVisibility();
+ uiVisibility |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
+ uiVisibility |= View.SYSTEM_UI_FLAG_FULLSCREEN;
+ uiVisibility |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+ uiVisibility |= View.SYSTEM_UI_FLAG_IMMERSIVE;
+ uiVisibility |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+ decorView.setSystemUiVisibility(uiVisibility);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/clubelec/clubelecemailkiosk/helper/DatabaseHelper.java b/app/src/main/java/org/clubelec/clubelecemailkiosk/helper/DatabaseHelper.java
new file mode 100644
index 0000000..234e97d
--- /dev/null
+++ b/app/src/main/java/org/clubelec/clubelecemailkiosk/helper/DatabaseHelper.java
@@ -0,0 +1,35 @@
+package org.clubelec.clubelecemailkiosk.helper;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+public class DatabaseHelper extends SQLiteOpenHelper {
+
+ public static final String TABLE_EMAILS = "emails";
+ public static final String COLUMN_ID = "_id";
+ public static final String COLUMN_EMAIL = "email";
+ private static final String DATABASE_NAME = "email.db";
+ private static final int DATABASE_VERSION = 1;
+ private static final String CREATE_TABLE_EMAILS =
+ "CREATE TABLE " + TABLE_EMAILS + "(" +
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
+ COLUMN_EMAIL + " TEXT NOT NULL" +
+ ")";
+
+ public DatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL(CREATE_TABLE_EMAILS);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ db.execSQL("DROP TABLE IF EXISTS " + TABLE_EMAILS);
+ onCreate(db);
+ }
+}
+
diff --git a/app/src/main/java/org/clubelec/clubelecemailkiosk/helper/SharedPrefManager.java b/app/src/main/java/org/clubelec/clubelecemailkiosk/helper/SharedPrefManager.java
new file mode 100644
index 0000000..2525101
--- /dev/null
+++ b/app/src/main/java/org/clubelec/clubelecemailkiosk/helper/SharedPrefManager.java
@@ -0,0 +1,133 @@
+package org.clubelec.clubelecemailkiosk.helper;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+public class SharedPrefManager {
+ private static final String SHARED_PREF_NAME = "travelogue_sharepref";
+ private static SharedPrefManager mInstance;
+ private final Context mCtx;
+
+ private SharedPrefManager(Context mCtx) {
+ this.mCtx = mCtx;
+ }
+
+ public static synchronized SharedPrefManager getInstance(Context mCtx) {
+ if (mInstance == null) {
+ mInstance = new SharedPrefManager(mCtx);
+ }
+ return mInstance;
+ }
+
+ public void saveString(String key, String value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putString(key, value);
+ editor.apply();
+ }
+
+ public void saveBool(String key, boolean value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putBoolean(key, value);
+ editor.apply();
+ }
+
+ public void saveInt(String key, int value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putInt(key, value);
+ editor.apply();
+ }
+
+ public void saveFloat(String key, float value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putFloat(key, value);
+ editor.apply();
+ }
+
+ public void saveLong(String key, long value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putLong(key, value);
+ editor.apply();
+ }
+
+ public void updateString(String key, String value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ if (sharedPreferences.contains(key)) {
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putString(key, value);
+ editor.apply();
+ }
+ }
+
+ public void updateBool(String key, boolean value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ if (sharedPreferences.contains(key)) {
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putBoolean(key, value);
+ editor.apply();
+ }
+ }
+
+ public void updateInt(String key, int value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ if (sharedPreferences.contains(key)) {
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putInt(key, value);
+ editor.apply();
+ }
+ }
+
+ public void updateFloat(String key, float value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ if (sharedPreferences.contains(key)) {
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putFloat(key, value);
+ editor.apply();
+ }
+ }
+
+ public void updateLong(String key, long value) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ if (sharedPreferences.contains(key)) {
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.putLong(key, value);
+ editor.apply();
+ }
+ }
+
+ public String getString(String key) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ return sharedPreferences.getString(key, null);
+ }
+
+ public boolean getBool(String key) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ return sharedPreferences.getBoolean(key, false);
+ }
+
+ public int getInt(String key) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ return sharedPreferences.getInt(key, 0);
+ }
+
+ public float getFloat(String key) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ return sharedPreferences.getFloat(key, 0f);
+ }
+
+ public long getLong(String key) {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ return sharedPreferences.getLong(key, 0L);
+ }
+
+ public void clearPreferences() {
+ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
+ SharedPreferences.Editor editor = sharedPreferences.edit();
+ editor.clear();
+ editor.apply();
+ }
+}
diff --git a/app/src/main/play_store_512.png b/app/src/main/play_store_512.png
new file mode 100644
index 0000000..f935e45
Binary files /dev/null and b/app/src/main/play_store_512.png differ
diff --git a/app/src/main/res/drawable/button.xml b/app/src/main/res/drawable/button.xml
new file mode 100644
index 0000000..d0667c4
--- /dev/null
+++ b/app/src/main/res/drawable/button.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/clubelec_integration.xml b/app/src/main/res/drawable/clubelec_integration.xml
new file mode 100644
index 0000000..4407fb5
--- /dev/null
+++ b/app/src/main/res/drawable/clubelec_integration.xml
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/undraw_subscribe.xml b/app/src/main/res/drawable/undraw_subscribe.xml
new file mode 100644
index 0000000..c55a66d
--- /dev/null
+++ b/app/src/main/res/drawable/undraw_subscribe.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/font/varela_round_regular.ttf b/app/src/main/res/font/varela_round_regular.ttf
new file mode 100644
index 0000000..5d5cfdd
Binary files /dev/null and b/app/src/main/res/font/varela_round_regular.ttf differ
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..f75acf2
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..a83cd23
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..4dc9ea5
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/app/src/main/res/mipmap-hdpi/ic_launcher_background.png
new file mode 100644
index 0000000..195b56d
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..8780774
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..8780774
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..b381217
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/app/src/main/res/mipmap-mdpi/ic_launcher_background.png
new file mode 100644
index 0000000..37772f3
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..ff78f42
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..ff78f42
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..cf71d6b
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..358f9bb
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..bdd54bf
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..bdd54bf
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..c3d6300
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..cff6aeb
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..22f9239
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..22f9239
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..7150165
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
new file mode 100644
index 0000000..a29cfe7
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..8c5aa75
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png
new file mode 100644
index 0000000..8c5aa75
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png differ
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..8030bfa
--- /dev/null
+++ b/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,29 @@
+
+
+ email kiosk
+ Inscrivez-vous à la liste de diffusion du club elec pour être au courant de toutes nos actualités, nos événements, nos services, et bien plus encore.
+ En validant votre inscription, vous acceptez que le club elec conserve et utilise votre adresse de courriel afin de vous envoyer des communications de la part du club elec et de ses partenaires.\nVous pouvez à tout moment vous désinscrire de cette liste de diffusion.
+ Valider l’inscription
+ nom@domaine.dpn
+ Choisir un code de sécurité
+ Lors du premier lancement de l\'application, un code de sécurité vous est demandé pour verrouiller l\'accès aux données enregistrées par l\'application.\nUn menu permettant d\'accéder et d\'exporter les données enregistrées est disponible en cliquant 10 fois de suite sur le logo du club elec.
+ Format d’adresse de courriel invalide
+ Vous devez cocher la case d’acceptation de la conservation de votre adresse de courriel par le club elec
+ Cette adresse de courriel est-elle correcte ?\n
+ Vérification
+ Adresse de courriel sauvegardée avec succès
+ Erreur
+ Saisissez votre code de sécurité
+ Le code de sécurité doit contenir exactement 6 chiffres
+ Code de sécurité invalide
+ Voir les adresses de courriel
+ Vider la base de données
+ Exporter les adresses de courriel dans un fichier
+ Sélectionnez une option
+ Adresses de courriel sauvegardées
+ Base de données vidée avec succès
+ Aucune adresse de courriel trouvée pour l’export
+ Adresses de courriel exportées avec succès
+ L’export a échoué
+ Ne vous inquiétez pas, nous sommes sympas ! 😄
+
\ No newline at end of file
diff --git a/app/src/main/res/values-v27/themes.xml b/app/src/main/res/values-v27/themes.xml
new file mode 100644
index 0000000..aa06016
--- /dev/null
+++ b/app/src/main/res/values-v27/themes.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..9bfedfc
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #e1e0e2
+ #1e1f1d
+ #282828
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..6d1352d
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,28 @@
+
+ email kiosk
+ Subscribe to the club elec mailing list to keep up to date with all our news, events, services and much more.
+ By validating your registration, you agree to allow club elec to store and use your email address for a period of one year for the purpose of sending you communications from club elec and its partners.\nYou may unsubscribe from this mailing list at any time.
+ Confirm registration
+ name@domain.tld
+ Choose a security code
+ The first time you launch the application, you are prompted for a security code to lock access to the data recorded by the application. \nA menu allowing you to access and export recorded data is available by clicking 10 times in a row on the club elec logo.
+ Invalid email format
+ You must tick the checkbox to agree to the conservation of your email address by the club elec
+ Is this email address correct?\n
+ Confirmation
+ Email address successfully saved
+ Error
+ Enter your security code
+ The security code must contain exactly 6 digits
+ Incorrect security code
+ Show emails
+ Clear database
+ Export emails to a file
+ Select an action
+ Saved emails
+ Database cleared
+ No emails found to export
+ Emails exported successfully
+ Export failed
+ Don\'t worry, we\'re friendly! 😄
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
new file mode 100644
index 0000000..57b3617
--- /dev/null
+++ b/app/src/main/res/values/themes.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/backup_rules.xml b/app/src/main/res/xml/backup_rules.xml
new file mode 100644
index 0000000..fa0f996
--- /dev/null
+++ b/app/src/main/res/xml/backup_rules.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/data_extraction_rules.xml b/app/src/main/res/xml/data_extraction_rules.xml
new file mode 100644
index 0000000..9ee9997
--- /dev/null
+++ b/app/src/main/res/xml/data_extraction_rules.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..a100ce0
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,5 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+plugins {
+ id 'com.android.application' version '8.0.2' apply false
+ id 'com.android.library' version '8.0.2' apply false
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..3e927b1
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,21 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Enables namespacing of each library's R class so that its R class includes only the
+# resources declared in the library itself and none from the library's dependencies,
+# thereby reducing the size of the R class for that library
+android.nonTransitiveRClass=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..e708b1c
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..23039b9
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Aug 02 14:38:57 CEST 2023
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..4f906e0
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,185 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..ac1b06f
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,89 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..63979db
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,16 @@
+pluginManagement {
+ repositories {
+ google()
+ mavenCentral()
+ gradlePluginPortal()
+ }
+}
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+rootProject.name = "club elec email kiosk"
+include ':app'