diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..681f41a
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..4657e72
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,42 @@
+apply plugin: 'com.android.application'
+
+android {
+ compileSdkVersion 28
+ defaultConfig {
+ applicationId "it.approu.dizionario"
+ minSdkVersion 15
+ targetSdkVersion 28
+ versionCode 16
+ versionName "1.0.2"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ vectorDrawables.useSupportLibrary = true//Per usare il logo nella schermata pricipale
+ }
+ compileOptions {
+ sourceCompatibility 1.8
+ targetCompatibility 1.8
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ implementation 'com.squareup.retrofit2:retrofit:2.6.0'
+ implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ implementation 'androidx.preference:preference:1.1.1'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test:runner:1.2.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ implementation 'com.google.android.material:material:1.1.0'
+ implementation 'androidx.navigation:navigation-fragment:2.2.2'
+ implementation 'androidx.navigation:navigation-ui:2.2.2'
+ implementation 'androidx.webkit:webkit:1.2.0'
+ implementation 'com.android.volley:volley:1.1.1'
+}
diff --git a/app/debug/output.json b/app/debug/output.json
new file mode 100644
index 0000000..92a0784
--- /dev/null
+++ b/app/debug/output.json
@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-debug.apk","fullName":"debug","baseName":"debug"},"path":"app-debug.apk","properties":{}}]
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /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
diff --git a/app/release/output.json b/app/release/output.json
new file mode 100644
index 0000000..c16b8a2
--- /dev/null
+++ b/app/release/output.json
@@ -0,0 +1 @@
+[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":16,"versionName":"1.0.2","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release","dirName":""},"path":"app-release.apk","properties":{}}]
\ No newline at end of file
diff --git a/app/src/androidTest/java/it/approu/dizionario/ExampleInstrumentedTest.java b/app/src/androidTest/java/it/approu/dizionario/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..4146aad
--- /dev/null
+++ b/app/src/androidTest/java/it/approu/dizionario/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package it.approu.dizionario;
+
+import android.content.Context;
+import androidx.test.InstrumentationRegistry;
+import androidx.test.runner.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.getTargetContext();
+
+ assertEquals("it.approu.dizionario", appContext.getPackageName());
+ }
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..7c5e7bf
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png
new file mode 100644
index 0000000..682f428
Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ
diff --git a/app/src/main/java/it/approu/dizionario/Aiutaci.java b/app/src/main/java/it/approu/dizionario/Aiutaci.java
new file mode 100644
index 0000000..bdbea38
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/Aiutaci.java
@@ -0,0 +1,58 @@
+package it.approu.dizionario;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import it.approu.dizionario.funzioniutili.FunzioniUtili;
+
+public class Aiutaci extends AppCompatActivity {
+
+ private Button puls_mancante;
+ private Button puls_traduzione_errata;
+ private Button puls_altro;
+ private Context contesto = this;
+
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_aiutaci);
+
+ puls_altro = findViewById(R.id.button_altro);
+ puls_mancante = findViewById(R.id.button_parola_non_trovata);
+ puls_traduzione_errata = findViewById(R.id.button_traduzione_sbagliata);
+
+ puls_altro.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
+ "mailto","info@approu.it", null));
+ intent.putExtra(Intent.EXTRA_SUBJECT, "Contatto dall'app");
+ intent.putExtra(Intent.EXTRA_TEXT, "Inserisci qui il messaggio che vuoi inviarci:\n");
+ startActivity(intent);
+ }
+ });
+
+ puls_mancante.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getApplicationContext(), SuggerisciParola.class);
+ startActivity(intent);
+ }
+ });
+
+ puls_traduzione_errata.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getApplicationContext(), SuggerisciParola.class);
+ startActivity(intent);
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/it/approu/dizionario/InformationActivity.java b/app/src/main/java/it/approu/dizionario/InformationActivity.java
new file mode 100644
index 0000000..71d1150
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/InformationActivity.java
@@ -0,0 +1,36 @@
+package it.approu.dizionario;
+
+import it.approu.dizionario.BuildConfig;
+
+import android.os.Bundle;
+
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceViewHolder;
+
+public class InformationActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.settings_activity);
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(R.id.settings, new SettingsFragment())
+ .commit();
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ }
+
+ public static class SettingsFragment extends PreferenceFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.root_preferences, rootKey);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/approu/dizionario/MainActivity.java b/app/src/main/java/it/approu/dizionario/MainActivity.java
new file mode 100644
index 0000000..adfe7d1
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/MainActivity.java
@@ -0,0 +1,166 @@
+package it.approu.dizionario;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.net.Uri;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.Button;
+
+import java.util.Locale;
+
+
+
+public class MainActivity extends AppCompatActivity {
+
+ private Context contesto = this;
+ private Button pulsanteDizionario;
+ private Button pulsanteSostegno;
+ private Button pulsanteContattaci;
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.options_menu_paginaprincipale, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ // Avvia schermata INFORMAZIONI
+ case R.id.option_actionbar_pagina_informazioni:
+ Intent intent = new Intent(getApplicationContext(),InformationActivity.class);
+ startActivity(intent);
+ break;
+ case R.id.option_actionbar_condividi_menuprincipale:
+ Intent sendIntent = new Intent();
+ sendIntent.setAction(Intent.ACTION_SEND);
+ sendIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.scarica_la_app_anche_tu));
+ sendIntent.setType("text/plain");
+ Intent shareIntent = Intent.createChooser(sendIntent, null);
+ startActivity(shareIntent);
+ break;
+ default:
+ break;
+ }
+
+ return true;
+ }
+
+ private Button pulsanteSegnalaProblema;
+ private String codice_lingua_attuale;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ this.impostaLingua();
+ /*
+ Locale locale = new Locale("lij");
+ Locale.setDefault(locale);
+ Configuration config = getBaseContext().getResources().getConfiguration();
+ config.locale = locale;
+ getBaseContext().getResources().updateConfiguration(config,
+ getBaseContext().getResources().getDisplayMetrics());
+ */
+ setContentView(R.layout.schermata_benvenuto);
+
+ pulsanteDizionario = findViewById(R.id.pulsanteDizionario);
+ pulsanteDizionario.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getApplicationContext(),SceltaLingue.class);
+ startActivity(intent);
+ }
+ });
+
+ pulsanteSostegno = findViewById(R.id.pulsanteSostegno);
+ pulsanteSostegno.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String url = contesto.getResources().getString(R.string.url_sito_ufficiale_sostieni);
+ Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ startActivity(browserIntent);
+ }
+ });
+
+ pulsanteContattaci = findViewById(R.id.pulsanteSitoUfficiale);
+ pulsanteContattaci.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ /*
+ Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
+ "mailto","info@approu.it", null));
+ intent.putExtra(Intent.EXTRA_SUBJECT, "Contatto dall'app");
+ intent.putExtra(Intent.EXTRA_TEXT, "Inserisci qui il messaggio che vuoi inviarci:\n");
+ startActivity(intent);
+ */
+ String url = contesto.getResources().getString(R.string.url_sito_ufficiale);
+ Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
+ startActivity(browserIntent);
+ }
+ });
+
+ pulsanteSegnalaProblema = findViewById(R.id.pulsanteSegnalaProblema);
+ pulsanteSegnalaProblema.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getApplicationContext(), Aiutaci.class);
+ startActivity(intent);
+ }
+ });
+
+ //Se è il primo avvio dell'app, avvio la schermata tutorial grafia
+ SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
+ if (sharedPref.getBoolean(getString(R.string.chiave_primo_avvio), true))
+ {
+ Intent intent = new Intent(getApplicationContext(),TutorialGrafia.class);
+ startActivity(intent);
+ }
+
+
+ }
+
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ boolean ricreare_la_attivita = this.impostaLingua();
+ if (ricreare_la_attivita)
+ {
+ recreate();
+ }
+ }
+
+ private boolean impostaLingua()
+ {
+ //Impostazioni lingua
+ //Valore di ritorno false=lingua uguale; true=lingua_modificata
+ SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
+ String lingua_da_impostare = sharedPref.getString(getResources().getString(R.string.imp_key_lingua_scelta), "it");
+ if (lingua_da_impostare.equals(this.codice_lingua_attuale))
+ {
+ return false;
+ }
+ else
+ {
+ this.codice_lingua_attuale=lingua_da_impostare;
+ Locale locale = new Locale(lingua_da_impostare);
+ Locale.setDefault(locale);
+ Configuration config = getBaseContext().getResources().getConfiguration();
+ config.locale = locale;
+ getBaseContext().getResources().updateConfiguration(config,
+ getBaseContext().getResources().getDisplayMetrics());
+ return true;
+ }
+
+ }
+}
diff --git a/app/src/main/java/it/approu/dizionario/MyAdapter.java b/app/src/main/java/it/approu/dizionario/MyAdapter.java
new file mode 100644
index 0000000..f862e1f
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/MyAdapter.java
@@ -0,0 +1,113 @@
+package it.approu.dizionario;
+
+import android.content.Context;
+import android.content.Intent;
+
+import androidx.appcompat.widget.AppCompatButton;
+import androidx.recyclerview.widget.RecyclerView;
+
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import android.widget.Button;
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+import it.approu.dizionario.pulsanteConId.PulsanteIntelligente;
+import it.approu.dizionario.rest.Parola;
+
+public class MyAdapter extends RecyclerView.Adapter {
+ private final Context contesto;
+ private Parola[] mDataset;
+ private String lingua_origine;
+ private String lingua_destinazione;
+
+ // Provide a reference to the views for each data item
+ // Complex data items may need more than one view per item, and
+ // you provide access to all the views for a data item in a view holder
+ public static class MyViewHolder extends RecyclerView.ViewHolder {
+ // each data item is just a string in this case
+ public PulsanteIntelligente pulsante;
+ public MyViewHolder(PulsanteIntelligente v) {
+ super(v);
+ pulsante = v;
+ }
+ }
+
+ public void setData(Parola[] mDataset) {
+ this.mDataset = mDataset;
+ this.notifyDataSetChanged();
+ }
+
+ public void setParole(Parola[] parole)
+ {
+ this.mDataset=parole;
+ this.notifyDataSetChanged();
+ }
+
+ // Provide a suitable constructor (depends on the kind of dataset)
+ public MyAdapter(Parola[] myDataset, String lingua_origine, String lingua_destinazione, Context contesto) {
+ mDataset = myDataset;
+ this.lingua_origine=lingua_origine;
+ this.lingua_destinazione=lingua_destinazione;
+ this.contesto=contesto;
+ }
+
+ // Create new views (invoked by the layout manager)
+ @Override
+ public MyAdapter.MyViewHolder onCreateViewHolder(final ViewGroup parent,
+ int viewType) {
+ // create a new view
+ PulsanteIntelligente v = (PulsanteIntelligente) LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.pulsante_elenco_termini, parent, false);
+ v.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(parent.getContext(), SchermataRisultati.class);
+ intent.putExtra("linguaOrigine", lingua_origine
+ );
+ intent.putExtra("linguaDestinazione", lingua_destinazione);
+ PulsanteIntelligente b = (PulsanteIntelligente) v;
+ intent.putExtra("parola", b.getText().toString());
+ intent.putExtra("id_parola",b.getId_parola());
+
+
+ contesto.startActivity(intent);
+
+
+ }
+ });
+ MyViewHolder vh = new MyViewHolder(v);
+ return vh;
+ }
+
+ // Replace the contents of a view (invoked by the layout manager)
+ @Override
+ public void onBindViewHolder(MyViewHolder holder, int position) {
+ // - get element from your dataset at this position
+ // - replace the contents of the view with that element
+ String testo = "";
+ if (mDataset[position].getTipo().equals(""))
+ {
+ testo=mDataset[position].getParola();
+ }
+ else
+ {
+ testo=mDataset[position].getParola()+ " ("+mDataset[position].getTipo()+")";
+ }
+ holder.pulsante.setText(testo);
+ holder.pulsante.setId_parola(mDataset[position].getId_parola());
+
+ }
+
+ // Return the size of your dataset (invoked by the layout manager)
+ @Override
+ public int getItemCount() {
+ return mDataset.length;
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/it/approu/dizionario/SceltaLingue.java b/app/src/main/java/it/approu/dizionario/SceltaLingue.java
new file mode 100644
index 0000000..ea5b57b
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/SceltaLingue.java
@@ -0,0 +1,124 @@
+package it.approu.dizionario;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.Spinner;
+
+import it.approu.dizionario.funzioniutili.FunzioniUtili;
+
+public class SceltaLingue extends AppCompatActivity {
+
+ Button pulsanteSovraimpressione;
+ Spinner lingua1;
+ Spinner lingua2;
+ ImageButton pulsanteInvertiLingue;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_scelta_lingue);
+
+ lingua1=findViewById(R.id.spinner1);
+ lingua2 = findViewById(R.id.spinner2);
+
+
+ SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
+
+
+ if (sharedPref.getInt(this.getString(R.string.ultima_lingua_origine_selezionata), 0) < lingua1.getAdapter().getCount())
+ {
+ lingua1.setSelection(sharedPref.getInt(this.getString(R.string.ultima_lingua_origine_selezionata), 0));
+ }
+ else
+ {
+ lingua1.setSelection(0);
+ }
+ if (sharedPref.getInt(this.getString(R.string.ultima_lingua_destinazione_selezionata), 1) < lingua2.getAdapter().getCount())
+ {
+ lingua2.setSelection(sharedPref.getInt(this.getString(R.string.ultima_lingua_destinazione_selezionata), 1));
+ }
+ else
+ {
+ lingua2.setSelection(1);
+ }
+
+
+ pulsanteInvertiLingue = findViewById(R.id.pulsanteInvertiLingue);
+ pulsanteInvertiLingue.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ int tmp;
+ tmp = lingua1.getSelectedItemPosition();
+ lingua1.setSelection(lingua2.getSelectedItemPosition());
+ lingua2.setSelection(tmp);
+ }
+ });
+
+ pulsanteSovraimpressione = findViewById(R.id.pulsanteProseguiConQuesteLingue);
+ pulsanteSovraimpressione.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String scelta1= lingua1.getSelectedItem().toString();
+ String scelta2 = lingua2.getSelectedItem().toString();
+
+ if ( validaLingue(scelta1,scelta2, true))
+ {
+ Intent intent = new Intent(getApplicationContext(), SchermataElencoTermini.class);
+ intent.putExtra("linguaOrigine", scelta1);
+ intent.putExtra("linguaDestinazione", scelta2);
+
+ SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
+ SharedPreferences.Editor c = sharedPref.edit();
+ c.putInt(getString(R.string.ultima_lingua_origine_selezionata), lingua1.getSelectedItemPosition());
+ c.putInt(getString(R.string.ultima_lingua_destinazione_selezionata), lingua2.getSelectedItemPosition());
+ c.commit();
+
+ startActivity(intent);
+ }
+ }
+ });
+
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ }
+
+ private boolean validaLingue(String lingua1, String lingua2, boolean mostraDialgo)
+ {
+ if ( ( !lingua1.equals(lingua2) )
+ &&
+ ( lingua1.toLowerCase().equals("italiano") || lingua2.toLowerCase().equals("italiano") )
+ )
+ {
+ return true;
+ }
+ else
+ {
+ if (mostraDialgo)
+ {
+ if (lingua1.equals((lingua2)))
+ {
+ FunzioniUtili.mostraAvvertimento(this, this.getString(R.string.errore_lingue_non_valide_sono_uguali), this.getString(R.string.errore_lingue_non_valide));
+ }
+ else if (!lingua1.toLowerCase().equals("italiano") && !lingua2.toLowerCase().equals("italiano"))
+ {
+ FunzioniUtili.mostraAvvertimento(this, this.getString(R.string.errore_lingue_non_valide_due_dialetti), this.getString(R.string.errore_lingue_non_valide));
+ }
+ }
+
+ return false;
+ }
+ }
+
+}
diff --git a/app/src/main/java/it/approu/dizionario/SchermataElencoTermini.java b/app/src/main/java/it/approu/dizionario/SchermataElencoTermini.java
new file mode 100644
index 0000000..7340df7
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/SchermataElencoTermini.java
@@ -0,0 +1,230 @@
+package it.approu.dizionario;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.os.AsyncTask;
+import android.os.Bundle;
+
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.appcompat.widget.Toolbar;
+
+import android.text.Editable;
+import android.text.SpannableString;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import it.approu.dizionario.funzioniutili.CodiceErrore;
+import it.approu.dizionario.funzioniutili.FunzioniUtili;
+import it.approu.dizionario.funzioniutili.GestoreVisibilitaCaricamento;
+import it.approu.dizionario.funzioniutili.MapLinguaCodice;
+import it.approu.dizionario.rest.ErroreRest;
+import it.approu.dizionario.rest.GestoreRest;
+import it.approu.dizionario.rest.Parola;
+
+public class SchermataElencoTermini extends AppCompatActivity {
+
+ private Context contesto = this;
+
+ private GestoreVisibilitaCaricamento caricamento;
+ private EditText campoDiRicerca;
+ private ImageButton pulsanteRicerca;
+ private TextView promemoriaLinguaScelta;
+
+ private String lingua_origine;
+ private String lingua_destinazione;
+
+ private RecyclerView recyclerView;
+ private MyAdapter mAdapter;
+ private RecyclerView.LayoutManager layoutManager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_schermata_elenco_termini);
+
+
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ Intent myInt = getIntent();
+
+ //Ottengo i parametri
+ this.lingua_origine = myInt.getStringExtra("linguaOrigine");
+ this.lingua_destinazione = myInt.getStringExtra("linguaDestinazione");
+
+ campoDiRicerca = findViewById(R.id.campoRicerca);
+ promemoriaLinguaScelta = findViewById(R.id.textview_promemoria_lingua_elenco);
+ promemoriaLinguaScelta.setText(String.format(getString(R.string.promemoria_lingua_scelta_elenco_termini), this.lingua_origine.toLowerCase()));
+ recyclerView = findViewById(R.id.recyclerElencoTermini);
+ recyclerView.setHasFixedSize(true);
+ layoutManager = new LinearLayoutManager(this);
+ recyclerView.setLayoutManager(layoutManager);
+ mAdapter = new MyAdapter(new Parola[0], this.lingua_origine, this.lingua_destinazione, this);
+ recyclerView.setAdapter(mAdapter);
+
+ campoDiRicerca.setHint(
+ String.format(getString(R.string.suggerimento_campo_ricerca), this.lingua_origine.toLowerCase())
+ );
+ campoDiRicerca.setOnEditorActionListener(
+ new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ boolean handled = false;
+ if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE) {
+ ListenerRicerca a = new ListenerRicerca();
+ a.onClick(pulsanteRicerca);
+ handled = true;
+ }
+
+ return handled;
+ }
+ }
+ );
+ campoDiRicerca.addTextChangedListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+ if (after < s.length())
+ {
+ caricamento.tuttoInvisibile();
+ }
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+
+ }
+ });
+
+ pulsanteRicerca = findViewById(R.id.pulsanteRicerca);
+ pulsanteRicerca.setOnClickListener(new ListenerRicerca());
+
+ FunzioniUtili.mostraTastiera(campoDiRicerca, this);
+
+ this.caricamento = new GestoreVisibilitaCaricamento((ProgressBar) findViewById(R.id.barraCaricamento), new View[]{(View) recyclerView, (View)promemoriaLinguaScelta}, false);
+ this.caricamento.tuttoInvisibile();
+ }
+
+ private class ListenerRicerca implements View.OnClickListener
+ {
+
+ @Override
+ public void onClick(View v) {
+
+ //Avvio ricerca e contatto server
+ AsyncTask task = new AsyncTask() {
+ private String messaggio = "";
+
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+ caricamento.caricamento(true);
+ }
+
+ @Override
+ protected Parola[] doInBackground(String... argomenti) {
+ GestoreRest g = new GestoreRest();
+ Parola[] vettParole = new Parola[0];
+ try {
+ vettParole = g.elencoTermini(argomenti[0], argomenti[1], argomenti[2]);
+ Log.d("asynctask termini", "doInBackground: " + vettParole.toString());
+ } catch (ErroreRest erroreRest) {
+ erroreRest.printStackTrace();
+ this.messaggio = erroreRest.getMessage();
+ }
+ return vettParole;
+ }
+
+ @Override
+ protected void onPostExecute(Parola[] parolas) {
+ super.onPostExecute(parolas);
+ mAdapter.setParole(parolas);
+
+ //Nascondo tastiera
+ FunzioniUtili.nascondiTastiera(campoDiRicerca, contesto);
+
+ caricamento.caricamento(false);
+
+ if (!this.messaggio.equals("")) {
+ //Se c'è un errore, nascondo suggerimenti vari
+ caricamento.tuttoInvisibile();
+
+ CodiceErrore err = new CodiceErrore(this.messaggio, contesto.getResources());
+ switch (err.getEnumCodice()) {
+ case ERRORE_CONNESSIONE:
+ FunzioniUtili.mostraAvvertimento(contesto, err.getStringDescription(), "Errore " + err.getCodiceInt());
+ break;
+ case NESSUNA_PAROLA_INSERITA:
+ FunzioniUtili.mostraAvvertimento(contesto, err.getStringDescription(), getString(R.string.titolo_avviso_inserisci_una_parola));
+ break;
+ case CERCA_UNA_PAROLA_ALLA_VOLTA:
+ FunzioniUtili.mostraAvvertimento(contesto, err.getStringDescription(), "Errore " + err.getCodiceInt());
+ campoDiRicerca.setText("");
+ break;
+ case NESSUN_RISULTATO:
+ AlertDialog.Builder costruttore = FunzioniUtili.mostraDomanda(contesto,
+ contesto.getString(R.string.dialogo_domanda_aggiungi_parola),
+ getString(R.string.titolo_avviso_parola_mancante));
+ costruttore
+ .setPositiveButton(R.string.dialogo_pulsante_si, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Intent intent = new Intent(getApplicationContext(), SuggerisciParola.class);
+ if (lingua_origine.toLowerCase().equals("italiano"))
+ {
+ intent.putExtra("parolaItaliano", campoDiRicerca.getText().toString());
+ }
+ else if (lingua_origine.toLowerCase().equals("sanremasco"))
+ {
+ intent.putExtra("parolaSanremasco", campoDiRicerca.getText().toString());
+ }
+ startActivity(intent);
+ campoDiRicerca.setText("");
+ }
+ })
+ .setNegativeButton(R.string.dialogo_pulsante_no, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ campoDiRicerca.setText("");
+ }
+ })
+ .create()
+ .show();
+ break;
+ default://Errore generico
+ FunzioniUtili.mostraAvvertimento(contesto, err.getStringDescription(), "Errore " + err.getCodiceInt());
+ break;
+ }
+
+ }
+
+
+
+ }
+ };
+
+ task.execute(MapLinguaCodice.linguaPerRicerca(lingua_origine), MapLinguaCodice.linguaPerRicerca(lingua_destinazione), campoDiRicerca.getText().toString());
+
+ }
+ }
+
+}
diff --git a/app/src/main/java/it/approu/dizionario/SchermataRisultati.java b/app/src/main/java/it/approu/dizionario/SchermataRisultati.java
new file mode 100644
index 0000000..6fd9b3f
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/SchermataRisultati.java
@@ -0,0 +1,225 @@
+package it.approu.dizionario;
+
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.media.MediaPlayer;
+import android.os.AsyncTask;
+import android.os.Bundle;
+
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.widget.AppCompatImageButton;
+import androidx.appcompat.widget.AppCompatTextView;
+import androidx.core.widget.NestedScrollView;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.os.Debug;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.TableRow;
+import android.widget.TextView;
+
+import org.w3c.dom.Text;
+
+import it.approu.dizionario.funzioniutili.FunzioniUtili;
+import it.approu.dizionario.funzioniutili.GestoreVisibilitaCaricamento;
+import it.approu.dizionario.funzioniutili.MapLinguaCodice;
+import it.approu.dizionario.rest.ErroreRest;
+import it.approu.dizionario.rest.GestoreRest;
+import it.approu.dizionario.rest.Parola;
+
+public class SchermataRisultati extends AppCompatActivity {
+
+ private TextView parola_cercata_etichetta;
+ private String lingua_origine;
+ private String lingua_destinazione;
+ private String parola;
+ private Integer id_parola;
+ private Context contesto = this;
+ private LinearLayout listaInCuiAggiungereRisultati;
+ private GestoreVisibilitaCaricamento caricamento;
+ private Parola[] paroleTrovate = new Parola[0];
+ private MediaPlayer media_player_audio_voci = new MediaPlayer();
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.options_menu_schermata_risultati, menu);
+ return true;
+ }
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+
+ switch (item.getItemId()) {
+ // Avvia schermata INFORMAZIONI
+ case R.id.option_actionbar_modifica_schermata_risultati:
+ Intent intent = new Intent(getApplicationContext(), SuggerisciParola.class);
+ if (lingua_origine.toLowerCase().equals("italiano"))
+ {
+ intent.putExtra("parolaItaliano", parola);
+ }
+ else if (lingua_origine.toLowerCase().equals("sanremasco"))
+ {
+ intent.putExtra("parolaSanremasco", parola);
+ }
+ startActivity(intent);
+ break;
+ case R.id.option_actionbar_condividi_schermata_risultati:
+ Intent sendIntent = new Intent();
+ sendIntent.setAction(Intent.ACTION_SEND);
+ sendIntent.putExtra(Intent.EXTRA_TEXT, generaTestoPerCondivisioneRisultato());
+ sendIntent.setType("text/plain");
+ Intent shareIntent = Intent.createChooser(sendIntent, null);
+ startActivity(shareIntent);
+ break;
+ case android.R.id.home:
+ finish();
+ default:
+ break;
+ }
+
+ return true;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_schermata_risultati);
+
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ }
+
+ Intent myInt = getIntent();
+
+ //Ottengo i parametri
+ this.lingua_origine = myInt.getStringExtra("linguaOrigine");
+ this.lingua_destinazione = myInt.getStringExtra("linguaDestinazione");
+ this.parola = myInt.getStringExtra("parola");
+ this.id_parola = myInt.getIntExtra("id_parola",-1);
+
+ this.parola_cercata_etichetta = findViewById(R.id.etichetta_risultati_parola_cercata);
+ this.parola_cercata_etichetta.setText(String.format(getString(R.string.etichetta_parola_cercata_schermata_risultati),this.parola));
+
+ listaInCuiAggiungereRisultati = findViewById(R.id.contenitore_traduzioni);
+ caricamento=new GestoreVisibilitaCaricamento((ProgressBar) findViewById(R.id.barraCaricamentoRisultati), new View[]{findViewById(R.id.scrollview_traduzioni)}, true);
+ caricaRisultati();
+
+ }
+
+
+ private void caricaRisultati()
+ {
+ AsyncTask task = new AsyncTask() {
+ private String messaggio="";
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+ caricamento.caricamento(true);
+ }
+
+ @Override
+ protected Parola[] doInBackground(String... argomenti) {
+ GestoreRest g = new GestoreRest();
+ Parola[] vettParole= new Parola[0];
+ try {
+ vettParole = g.traduzioneEsatta(argomenti[0],argomenti[1], Integer.parseInt(argomenti[2]));
+ Log.d("asynctask termini", "doInBackground: "+vettParole.toString());
+ } catch (ErroreRest erroreRest) {
+ erroreRest.printStackTrace();
+ this.messaggio=erroreRest.getMessage();
+ }
+ return vettParole;
+ }
+
+ @Override
+ protected void onPostExecute(Parola[] parolas) {
+ super.onPostExecute(parolas);
+ caricamento.caricamento(false);
+ if (!this.messaggio.equals(""))
+ {
+ FunzioniUtili.mostraToast(getBaseContext(), this.messaggio);
+ }
+ impostaRisultati(parolas);
+ }
+ };
+
+ task.execute(MapLinguaCodice.linguaPerRicerca(lingua_origine), MapLinguaCodice.linguaPerRicerca(lingua_destinazione), id_parola.toString());
+
+ }
+
+ private void impostaRisultati(Parola[] v_parole)
+ {
+ paroleTrovate = v_parole;
+
+ for (final Parola p : v_parole)
+ {
+ LayoutInflater li = this.getLayoutInflater();
+ TableRow t = (TableRow) li.inflate(R.layout.tablerow_singolo_risultato, null);
+
+
+ String testoDaImpostare = p.toString();
+ AppCompatTextView viewtesto = (AppCompatTextView) t.getChildAt(0);
+ viewtesto.setText(testoDaImpostare);
+
+ //Attivo copia-incolla
+ viewtesto.setOnLongClickListener(
+ new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ ClipboardManager cManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
+ AppCompatTextView t = (AppCompatTextView) v;
+ ClipData cData = ClipData.newPlainText("text", t.getText());
+ cManager.setPrimaryClip(cData);
+ FunzioniUtili.mostraToast(contesto, "Testo \""+t.getText().toString()+"\" copiato negli appunti");
+ return true;
+ }
+ }
+ );
+
+ if (p.getAudio().equals(""))
+ {
+ //Se non c'è audio
+ t.getChildAt(2).setVisibility(View.GONE);
+ }
+ else
+ {
+ /*
+ //Se c'è audio
+ AppCompatImageButton pulsante = (AppCompatImageButton) t.getChildAt(2);
+ pulsante.setOnClickListener(new View.OnClickListener() {
+ Parola p_interna;
+ @Override
+ public void onClick(View v) {
+ p_interna = p;
+ //TODO Bisogna impostare un MediaPlayer e avviarlo
+ }
+ });
+ */
+ }
+
+ listaInCuiAggiungereRisultati.addView(t);
+ }
+ }
+
+ private String generaTestoPerCondivisioneRisultato()
+ {
+ String testo_condivisione = String.format(getString(R.string.testo_condivisione_risultato_paroladipartenza), parola);
+
+ for (Parola p:paroleTrovate
+ ) {
+ testo_condivisione += "\n- "+p.toString();
+ }
+ testo_condivisione+="\n\n";
+ testo_condivisione+=getString(R.string.avvertimento_traduzioni_recenti_correzioni);
+ return testo_condivisione;
+ }
+}
diff --git a/app/src/main/java/it/approu/dizionario/SuggerisciParola.java b/app/src/main/java/it/approu/dizionario/SuggerisciParola.java
new file mode 100644
index 0000000..b6bed22
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/SuggerisciParola.java
@@ -0,0 +1,176 @@
+package it.approu.dizionario;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.inputmethod.EditorInfo;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+import com.android.volley.Request;
+import com.android.volley.RequestQueue;
+import com.android.volley.Response;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.StringRequest;
+import com.android.volley.toolbox.Volley;
+
+import it.approu.dizionario.funzioniutili.FunzioniUtili;
+
+public class SuggerisciParola extends AppCompatActivity {
+ Context c = this;
+ Button pulsanteInvia;
+ EditText campoItaliano, campoDialetto, campoCommento;
+ ProgressBar barraCaricamento;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState)
+ {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_suggerisci_parola);
+
+ //Actionbar
+ getSupportActionBar().setTitle(getString(R.string.title_activity_suggerisci_parola));
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setDisplayShowHomeEnabled(true);
+
+ campoDialetto = findViewById(R.id.campodialetto);
+ campoItaliano = findViewById(R.id.campoita);
+ campoCommento = findViewById(R.id.campocommento);
+ campoCommento.setOnEditorActionListener(
+ new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+ boolean handled = false;
+ if (actionId == EditorInfo.IME_ACTION_SEND || actionId == EditorInfo.IME_ACTION_DONE) {
+ handled = true;
+ FunzioniUtili.nascondiTastiera(campoCommento, c);
+ inviaParola();
+ }
+
+ return handled;
+ }
+ }
+ );
+
+
+ //Imposto campi in base a valor in arrivo
+ Intent myInt = getIntent();
+
+ //Ottengo i parametri
+ String parolaItaliano = myInt.getStringExtra("parolaItaliano");
+ String parolaSanremasco = myInt.getStringExtra("parolaSanremasco");
+ if (parolaItaliano!=null)
+ {
+ this.campoItaliano.setText(parolaItaliano);
+ }
+ if (parolaSanremasco!=null)
+ {
+ this.campoDialetto.setText(parolaSanremasco);
+ }
+
+ barraCaricamento = findViewById(R.id.barracaricamento);
+
+ pulsanteInvia = findViewById(R.id.pulsanteInviaSuggerimento);
+ pulsanteInvia.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ inviaParola();
+ }
+ });
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ //Per fare in modo che il tasto indietro a schermo faccia navigare all'activity precedente
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ private void inviaParola()
+ {
+ barraCaricamento.setVisibility(View.VISIBLE);
+ pulsanteInvia.setEnabled(false);
+
+ if (campoItaliano.getText().toString().length()==0
+ &&
+ campoDialetto.getText().toString().length()==0
+ )
+ {
+ FunzioniUtili.mostraAvvertimento(c, "Non hai inserito alcuna parola da inviarci", "Attenzione!");
+ pulsanteInvia.setEnabled(true);
+ barraCaricamento.setVisibility(View.GONE);
+ return;
+ }
+
+ FunzioniUtili.nascondiTastiera(campoCommento,c);
+
+ // Instantiate the RequestQueue.
+ RequestQueue queue = Volley.newRequestQueue(this);
+ Uri.Builder builder = new Uri.Builder();
+ builder.scheme("https")
+ .authority("api.approu.it")
+ .appendPath("v01")
+ .appendPath("suggerimento")
+ .appendQueryParameter("italiano",campoItaliano.getText().toString() )
+ .appendQueryParameter("sanremasco", campoDialetto.getText().toString())
+ .appendQueryParameter("commento", campoCommento.getText().toString());
+ String url = builder.build().toString();
+
+ // Request a string response from the provided URL.
+ StringRequest stringRequest = new StringRequest(Request.Method.POST, url,
+ new Response.Listener() {
+ @Override
+ public void onResponse(String response) {
+ barraCaricamento.setVisibility(View.GONE);
+ AlertDialog.Builder costruttore = FunzioniUtili.generaNota(c, "Il tuo suggerimento è stato ricevuto correttamente","Grazie!");
+ costruttore.setNeutralButton(
+ c.getString(R.string.dialogo_pulsante_ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ finish();
+ }
+ });
+ costruttore.create().show();
+ }
+ }, new Response.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError error) {
+ barraCaricamento.setVisibility(View.GONE);
+ AlertDialog.Builder costruttore = FunzioniUtili.mostraDomanda(c, "Controlla la tua connessione internet. Se il problema persiste, contattaci personalmente. Riprovare a inviare la segnalazione?", "Errore");
+ costruttore
+ .setPositiveButton(R.string.dialogo_pulsante_si, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ inviaParola();
+ }
+ })
+ .setNegativeButton(R.string.dialogo_pulsante_no, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which)
+ {
+ pulsanteInvia.setEnabled(false);
+ finish();
+ }
+ })
+ .create()
+ .show();
+ }
+ });
+
+ // Add the request to the RequestQueue.
+ queue.add(stringRequest);
+ }
+}
diff --git a/app/src/main/java/it/approu/dizionario/TutorialGrafia.java b/app/src/main/java/it/approu/dizionario/TutorialGrafia.java
new file mode 100644
index 0000000..70fecaa
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/TutorialGrafia.java
@@ -0,0 +1,116 @@
+package it.approu.dizionario;
+
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.AppCompatButton;
+import androidx.webkit.WebViewCompat;
+
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.SharedPreferences;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.view.View;
+import android.view.animation.AccelerateDecelerateInterpolator;
+import android.view.animation.OvershootInterpolator;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.widget.ProgressBar;
+
+import it.approu.dizionario.funzioniutili.FunzioniUtili;
+
+
+public class TutorialGrafia extends AppCompatActivity {
+ private int pagina = 0;
+ WebView webview;
+ private AppCompatButton pulsante;
+ ProgressBar barraorizzontale;
+ private static final int NUM_PAGINA_FINE_TUTORIAL = 7;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ try {
+ setContentView(R.layout.activity_tutorial_grafia);
+ }
+ catch (Exception e) {
+ finish();
+ return;
+ }
+
+
+ barraorizzontale = findViewById(R.id.barraorizzontaletutorial);
+ aggiornaBarra();
+
+ webview = findViewById(R.id.webViewTutorial);
+ WebSettings webSettings = webview.getSettings();
+ webSettings.setJavaScriptEnabled(true);
+
+ aggiornaPaginaWeb();
+
+ pulsante = findViewById(R.id.pulsanteAvantiTutorial);
+ pulsante.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ pagina = pagina+1;
+ aggiornaPaginaWeb();
+ if (pagina==NUM_PAGINA_FINE_TUTORIAL)
+ {
+ SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
+ SharedPreferences.Editor editor = sharedPref.edit();
+ editor.putBoolean(getString(R.string.chiave_primo_avvio), false);
+ editor.commit();
+ finish();
+ }
+
+ //Aggiorno barra di caricamento
+ aggiornaBarra();
+ }
+ });
+ }
+
+ @Override
+ public void onBackPressed() {
+ pagina-=1;
+ if (pagina<0)
+ {
+ pagina=0;
+ }
+ aggiornaPaginaWeb();
+ aggiornaBarra();
+ }
+
+ private void aggiornaPaginaWeb()
+ {
+ if (!isOnline())
+ {
+ AlertDialog.Builder b = FunzioniUtili.mostraDomanda(this, "Verifica di essere collegato a internet, poi riprova.\nRiprovare?","Nessuna connessione");
+ b.setPositiveButton(getString(R.string.dialogo_pulsante_si), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ aggiornaPaginaWeb();
+ }
+ });
+ b.create().show();
+ }
+ webview.loadUrl("https://www.approu.it/androidwebview/tutorial_grafia/"+pagina);
+ }
+ private void aggiornaBarra()
+ {
+ ObjectAnimator animation = ObjectAnimator.ofInt(barraorizzontale, "progress", barraorizzontale.getProgress(), pagina*100 / (NUM_PAGINA_FINE_TUTORIAL-1));
+ animation.setDuration(500); // millisecondi
+ //animation.setInterpolator(new OvershootInterpolator());
+ animation.setInterpolator(new AccelerateDecelerateInterpolator());
+ animation.start();
+ }
+
+ private boolean isOnline() {
+ ConnectivityManager cm =
+ (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+ NetworkInfo netInfo = cm.getActiveNetworkInfo();
+ return netInfo != null && netInfo.isConnectedOrConnecting();
+ }
+}
diff --git a/app/src/main/java/it/approu/dizionario/database/VettoreParola.java b/app/src/main/java/it/approu/dizionario/database/VettoreParola.java
new file mode 100755
index 0000000..14d9ec6
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/database/VettoreParola.java
@@ -0,0 +1,90 @@
+package it.approu.dizionario.database;
+
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+
+/**
+This file is part of program "Dizionario dialettale ligure"
+
+ Copyright (C) 2018 - Massimo Gismondi
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+public class VettoreParola {
+ String parola;
+ Map vettParola = new HashMap<>();
+
+ public VettoreParola(String parola) {
+ this.parola = parola;
+ for (int i = 0; i < parola.length() - 1; i++) {
+ String c = parola.substring(i, i + 1);
+ this.vettParola.put(c, this.ottieniOppurePredefinito(vettParola, c, 0) + 1);
+ }
+ }
+
+ private int ottieniOppurePredefinito(Map v, String chiave, Integer predefinito) {
+ Integer valore = v.get(chiave);
+ if (valore == null) {
+ return predefinito;
+ } else {
+ return valore;
+ }
+ }
+
+ public Map getVettore() {
+ return this.vettParola;
+ }
+
+ public double distanzaA(VettoreParola v2) {
+ Set chiavi = new TreeSet<>();
+ for (String c : this.vettParola.keySet()) {
+ chiavi.add(c);
+ }
+ for (String c : v2.getVettore().keySet()) {
+ chiavi.add(c);
+ }
+
+ double sommaIntermedia = 0;
+ double somma1 = 0, somma2 = 0;
+ for (String c : chiavi) {
+
+ if (v2.getVettore().get(c) == null) {
+ somma1 = 0;
+ } else {
+ somma1 = v2.getVettore().get(c);
+ }
+
+ if (this.vettParola.get(c) == null) {
+ somma2 = 0;
+ } else {
+ somma2 = this.vettParola.get(c);
+ }
+ sommaIntermedia += Math.pow(somma1 - somma2, 2);
+
+ }
+
+ //Log.i("VETTOREPAROLA", this.getParola()+" "+Math.sqrt(sommaIntermedia)+ " "+v2.getParola());
+ return sommaIntermedia;//DISTANZA AL QUADRATO, NON C'E LA RADICE PER MOTIVI DI VELOCITA
+ }
+
+
+ public String getParola() {
+ return this.parola;
+ }
+}
diff --git a/app/src/main/java/it/approu/dizionario/database/gestoreDatabase.java b/app/src/main/java/it/approu/dizionario/database/gestoreDatabase.java
new file mode 100755
index 0000000..5dca2d3
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/database/gestoreDatabase.java
@@ -0,0 +1,178 @@
+package it.approu.dizionario.database;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.os.AsyncTask;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
+/**
+This file is part of program "Dizionario dialettale ligure"
+
+ Copyright (C) 2018 - Massimo Gismondi
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+class gestoreDatabase extends SQLiteOpenHelper {
+ String NOME_TABELLA;
+ private final static String DB_NAME = "dizionario.sqlite3";
+ private Context contesto;
+ private String linguaDiOrigine, linguaDiDestinazione;
+
+ public gestoreDatabase(Context context, String lingua1, String lingua2) {
+ super(context, DB_NAME, null, 1);
+ contesto = context;
+
+ if (lingua1.toUpperCase().equals("ITALIANO"))
+ {
+ NOME_TABELLA = (lingua1 + "_" + lingua2).toUpperCase();
+ }
+ else
+ {
+ NOME_TABELLA = (lingua2 + "_" + lingua1).toUpperCase();
+ }
+ this.linguaDiOrigine = lingua1.toUpperCase();
+ this.linguaDiDestinazione = lingua2.toUpperCase();
+
+// try {
+// this.copiatura();
+// } catch (IOException e) {
+// e.printStackTrace();
+// }
+
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ //db.execSQL("CREATE TABLE "+NOME_TABELLA+"(ID INTEGER PRIMARY KEY AUTOINCREMENT, PAROLA VARCHAR(50))");
+
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+// db.execSQL("DROP TABLE IF EXISTS "+NOME_TABELLA);
+// this.onCreate(db);
+ }
+
+ public void aggiornaLingue()
+ {
+ //Verifica lingue scaricate nel DB
+ //Sarebbe da implementare un controllo della data per ridurre il carico sul server
+
+ //Faccio un bel for a ogni lingua da scaricare
+ //Lancio singolo comando al gestore Rest per ottenere i dati di ogni dizionario
+ //Elimino tutti quelli che ho e li sostituisco con i nuovi
+ }
+
+ List ricercaInMezzo(String parola) {
+ SQLiteDatabase db = this.getReadableDatabase();
+ Set listaRes = new TreeSet<>();
+ //Cursor res = db.query(true, NOME_TABELLA, null, linguaDiOrigine + " LIKE ?", new String[]{parola + "%"}, null, null, null);
+ Cursor res = db.query(true, this.NOME_TABELLA, new String[]{this.linguaDiOrigine}, this.linguaDiOrigine+" GLOB ?",new String[]{"*"+parola+"*"},null,null,this.linguaDiOrigine, "50");
+ while (res.moveToNext()) {
+ listaRes.add(res.getString(res.getColumnIndex(linguaDiOrigine.toUpperCase())));
+ //Log.i("buffer", res.getString(res.getColumnIndex(linguaDiOrigine.toUpperCase())));
+ }
+ res.close();
+
+ return new ArrayList(listaRes);
+ }
+
+ String ricercaSimili(String parola) {
+ SQLiteDatabase db = this.getReadableDatabase();
+ Cursor res = db.query(true, NOME_TABELLA, new String[]{this.linguaDiOrigine}, null, null, null, "", this.linguaDiOrigine, "");
+
+ final VettoreParola vettParolaCercata = new VettoreParola(parola);
+ /*TreeSet tutteParole = new TreeSet<>(new Comparator() {
+ @Override
+ public int compare(String o1, String o2) {
+ int distanza1 = (int) vettParolaCercata.distanzaA(new VettoreParola(o1));
+ int distanza2 = (int) vettParolaCercata.distanzaA(new VettoreParola(o2));
+ return (distanza1-distanza2);
+ }
+ });
+ while (res.moveToNext())
+ {
+ tutteParole.add(res.getString(res.getColumnIndex(this.linguaDiOrigine)));
+ }
+ */
+ String parolaMinima = "";
+ double distanzaMinima = 0;
+ if (res.moveToNext()) {
+ parolaMinima = res.getString(res.getColumnIndex(this.linguaDiOrigine));
+ distanzaMinima = vettParolaCercata.distanzaA(new VettoreParola(parolaMinima));
+ }
+ while (res.moveToNext()) {
+ String parolaTemp = res.getString(res.getColumnIndex(this.linguaDiOrigine));
+ double distTemp = vettParolaCercata.distanzaA(new VettoreParola(parolaTemp));
+
+ if (distTemp < distanzaMinima) {
+ distanzaMinima = distTemp;
+ parolaMinima = parolaTemp;
+ }
+ }
+
+ res.close();
+ return parolaMinima;
+ }
+
+ String[] traduzioneEsatta(String daTradurre)
+ {
+ SQLiteDatabase dbParole = this.getReadableDatabase();
+ Cursor risultato = dbParole.query(NOME_TABELLA, null, this.linguaDiOrigine+" = ?", new String[]{daTradurre}, null, null, null);
+ List listaDaRitornare = new LinkedList<>();
+
+ while ( risultato.moveToNext() )
+ {
+ listaDaRitornare.add(risultato.getString(risultato.getColumnIndex(this.linguaDiDestinazione)));
+ }
+ risultato.close();//Chiudo cursore
+
+ //Copio in vettore
+ String[] vettDaRitornare = new String[listaDaRitornare.size()];
+ for (int i=0;i mappaEnumErrore = new HashMap();
+
+
+ public enum Codice {
+ ERRORE_GENERICO,
+ NESSUN_RISULTATO,
+ CERCA_UNA_PAROLA_ALLA_VOLTA,
+ LINGUE_NON_VALIDE,
+ ERRORE_CONNESSIONE,
+ NESSUNA_PAROLA_INSERITA
+
+
+ };
+
+ public CodiceErrore(String errore, Resources res) {
+ mappaEnumErrore.put(Codice.ERRORE_GENERICO, res.getString(R.string.errore_generico));
+ mappaEnumErrore.put(Codice.NESSUN_RISULTATO, res.getString(R.string.errore_nessun_risultato));
+ mappaEnumErrore.put(Codice.CERCA_UNA_PAROLA_ALLA_VOLTA, res.getString(R.string.errore_cerca_una_parola_alla_volta));
+ mappaEnumErrore.put(Codice.LINGUE_NON_VALIDE, res.getString(R.string.errore_lingue_non_valide));
+ mappaEnumErrore.put(Codice.ERRORE_CONNESSIONE, res.getString(R.string.errore_connessione));
+ mappaEnumErrore.put(Codice.NESSUNA_PAROLA_INSERITA, res.getString(R.string.errore_nessuna_parola_inserita));
+
+ Log.d("errore ricevuto", errore);
+ int num=0;
+ if (errore.matches("[0-9]+")) {
+ num=Integer.parseInt(errore);
+ } else {
+ num=-1;
+ }
+
+ this.num_errore=num;
+ this.enumerativo=this.daNumAEnum(num);
+ }
+
+ public CodiceErrore(Integer err)
+ {
+ this.num_errore=err;
+ this.enumerativo=this.daNumAEnum(err);
+ }
+
+ private CodiceErrore.Codice daNumAEnum(Integer err)
+ {
+ Codice enumerativoLocale;
+ switch (err)
+ {
+ case 0:
+ enumerativoLocale=Codice.ERRORE_GENERICO;
+ break;
+ case 1:
+ enumerativoLocale=Codice.NESSUN_RISULTATO;
+ break;
+ case 2:
+ enumerativoLocale=Codice.CERCA_UNA_PAROLA_ALLA_VOLTA;
+ break;
+ case 3:
+ enumerativoLocale=Codice.LINGUE_NON_VALIDE;
+ break;
+ case 4:
+ enumerativoLocale=Codice.ERRORE_CONNESSIONE;
+ break;
+ case 5:
+ enumerativoLocale=Codice.NESSUNA_PAROLA_INSERITA;
+ break;
+ default:
+ num_errore=0;
+ enumerativoLocale=Codice.ERRORE_CONNESSIONE;
+ break;
+ }
+ return enumerativoLocale;
+ }
+
+ public String getStringDescription()
+ {
+ return mappaEnumErrore.get(this.enumerativo);
+ }
+
+ public Codice getEnumCodice()
+ {
+ return this.enumerativo;
+ }
+ public int getCodiceInt()
+ {
+ return this.num_errore;
+ }
+
+}
diff --git a/app/src/main/java/it/approu/dizionario/funzioniutili/FunzioniUtili.java b/app/src/main/java/it/approu/dizionario/funzioniutili/FunzioniUtili.java
new file mode 100644
index 0000000..952d003
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/funzioniutili/FunzioniUtili.java
@@ -0,0 +1,93 @@
+package it.approu.dizionario.funzioniutili;
+
+
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.net.Uri;
+import android.view.View;
+import android.view.inputmethod.InputMethod;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Toast;
+
+import androidx.appcompat.app.AlertDialog;
+
+import it.approu.dizionario.R;
+
+public class FunzioniUtili {
+ public static void mostraToast(Context contesto, String messaggio)
+ {
+ Toast.makeText(contesto,
+ messaggio, Toast.LENGTH_LONG).show();
+ }
+
+ public static void mostraAvvertimento(Context a, String messaggio,String titolo)
+ {
+ AlertDialog.Builder costruttore = new AlertDialog.Builder(a);
+ costruttore.setCancelable(true)
+ .setIcon(R.drawable.ic_avvertimento_nero)
+ .setTitle(titolo)
+ .setMessage(messaggio)
+ .setNeutralButton(
+ a.getString(R.string.dialogo_pulsante_ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+
+ }
+ })
+ .create()
+ .show();
+ }
+
+ public static void mostraNota(Context a, String messaggio, String titolo)
+ {
+ AlertDialog.Builder c = generaNota(a, messaggio, titolo);
+ c.create().show();
+ }
+ public static AlertDialog.Builder generaNota(Context a, String messaggio, String titolo)
+ {
+ AlertDialog.Builder costruttore = new AlertDialog.Builder(a);
+ costruttore.setCancelable(false)
+ .setTitle(titolo)
+ .setMessage(messaggio)
+ .setNeutralButton(
+ a.getString(R.string.dialogo_pulsante_ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+
+ }
+ });
+ return costruttore;
+ }
+
+
+ public static AlertDialog.Builder mostraDomanda(Context a, String messaggio, String titolo)
+ {
+ AlertDialog.Builder costruttore = new AlertDialog.Builder(a);
+ return costruttore.setCancelable(false)
+ .setTitle(titolo)
+ .setMessage(messaggio);
+ }
+
+ public static void avvia_url(Context a, String url)
+ {
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setData(Uri.parse(url));
+ a.startActivity(i);
+ }
+
+ public static void mostraTastiera(View view, Context c){
+ if(view.requestFocus()){
+ InputMethodManager imm =(InputMethodManager) c.getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.showSoftInput(view,InputMethodManager.SHOW_IMPLICIT);
+ }
+ }
+
+ public static void nascondiTastiera(View view, Context c){
+ InputMethodManager imm =(InputMethodManager) c.getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
+ }
+
+}
diff --git a/app/src/main/java/it/approu/dizionario/funzioniutili/GestoreVisibilitaCaricamento.java b/app/src/main/java/it/approu/dizionario/funzioniutili/GestoreVisibilitaCaricamento.java
new file mode 100644
index 0000000..00c7a68
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/funzioniutili/GestoreVisibilitaCaricamento.java
@@ -0,0 +1,59 @@
+package it.approu.dizionario.funzioniutili;
+
+import android.view.View;
+import android.widget.ProgressBar;
+
+public class GestoreVisibilitaCaricamento {
+ ProgressBar barra;
+ View elenco[];
+
+ boolean visibilitaCaricamento;
+
+ public GestoreVisibilitaCaricamento(ProgressBar barra, View[] elenco, boolean visibilitaCaricamento) {
+ this.barra=barra;
+ this.elenco=elenco;
+ this.visibilitaCaricamento = visibilitaCaricamento;
+ this.aggiornaVisibilita();
+ }
+
+ public GestoreVisibilitaCaricamento() {
+ visibilitaCaricamento = true;
+ this.aggiornaVisibilita();
+ }
+
+ private void aggiornaVisibilita()
+ {
+ if (visibilitaCaricamento==true)
+ {
+ barra.setVisibility(View.VISIBLE);
+ for(int i=0;i0)
+ {
+ r+="(";
+ if (this.getDefinizione().length()>0)
+ r+=" "+this.getDefinizione();
+
+ if (this.getTipo().length()>0)
+ r+=" "+this.getTipo();
+
+ if (this.getTipo_genere().length()>0)
+ r+=" "+this.getTipo_genere();
+
+ if (this.getTipo_numero().length()>0)
+ r+=" "+this.getTipo_numero();
+
+ if (this.getTipo_dettagli().length()>0)
+ r+=" "+this.getTipo_dettagli();
+
+ if (this.getTipo_ambito().length()>0)
+ r+=" "+this.getTipo_ambito();
+
+ r+=")";
+ }
+ if (!this.getCommento().equals(""))
+ {
+ r+="-contesto:"+this.getCommento()+"-";
+ }
+ return r;
+ }
+}
diff --git a/app/src/main/java/it/approu/dizionario/rest/ParolaRestService.java b/app/src/main/java/it/approu/dizionario/rest/ParolaRestService.java
new file mode 100644
index 0000000..844753a
--- /dev/null
+++ b/app/src/main/java/it/approu/dizionario/rest/ParolaRestService.java
@@ -0,0 +1,19 @@
+package it.approu.dizionario.rest;
+
+import java.util.List;
+
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Path;
+import retrofit2.http.Query;
+
+public interface ParolaRestService {
+
+ @GET("ricerca/{parola}/{lingua}")
+ Call elencoTermini(@Path("parola") String parola, @Path("lingua") String lingua);
+
+
+ @GET("traduzione/{id_parola}/{lingua_uno}/{lingua_due}")
+ Call traduzioneEsatta(@Path("lingua_uno") String lingua_uno, @Path("lingua_due") String lingua_due, @Path("id_parola") int id_parola);
+
+}
diff --git a/app/src/main/res/drawable-hdpi/ic_altoparlante.png b/app/src/main/res/drawable-hdpi/ic_altoparlante.png
new file mode 100644
index 0000000..835df27
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_altoparlante.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_avvertimento.png b/app/src/main/res/drawable-hdpi/ic_avvertimento.png
new file mode 100644
index 0000000..8657ca5
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_avvertimento.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_avvertimento_nero.png b/app/src/main/res/drawable-hdpi/ic_avvertimento_nero.png
new file mode 100644
index 0000000..76b702d
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_avvertimento_nero.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_condividi.png b/app/src/main/res/drawable-hdpi/ic_condividi.png
new file mode 100644
index 0000000..795b517
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_condividi.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_dado.png b/app/src/main/res/drawable-hdpi/ic_dado.png
new file mode 100644
index 0000000..d0c9b22
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_dado.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_informazioni.png b/app/src/main/res/drawable-hdpi/ic_informazioni.png
new file mode 100644
index 0000000..62311df
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_informazioni.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_lente.png b/app/src/main/res/drawable-hdpi/ic_lente.png
new file mode 100644
index 0000000..da9aaa2
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_lente.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_mani.png b/app/src/main/res/drawable-hdpi/ic_mani.png
new file mode 100644
index 0000000..857b5f0
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_mani.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_pencil.png b/app/src/main/res/drawable-hdpi/ic_pencil.png
new file mode 100644
index 0000000..fedc5ff
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_pencil.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_rete.png b/app/src/main/res/drawable-hdpi/ic_rete.png
new file mode 100644
index 0000000..ee6a873
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_rete.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_right_arrow.png b/app/src/main/res/drawable-hdpi/ic_right_arrow.png
new file mode 100644
index 0000000..05449d7
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_right_arrow.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_swap_arrows.png b/app/src/main/res/drawable-hdpi/ic_swap_arrows.png
new file mode 100644
index 0000000..dc7d813
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_swap_arrows.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_altoparlante.png b/app/src/main/res/drawable-mdpi/ic_altoparlante.png
new file mode 100644
index 0000000..5390f75
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_altoparlante.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_avvertimento.png b/app/src/main/res/drawable-mdpi/ic_avvertimento.png
new file mode 100644
index 0000000..8867842
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_avvertimento.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_avvertimento_nero.png b/app/src/main/res/drawable-mdpi/ic_avvertimento_nero.png
new file mode 100644
index 0000000..81f0966
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_avvertimento_nero.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_condividi.png b/app/src/main/res/drawable-mdpi/ic_condividi.png
new file mode 100644
index 0000000..4d216ad
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_condividi.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_dado.png b/app/src/main/res/drawable-mdpi/ic_dado.png
new file mode 100644
index 0000000..219647c
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_dado.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_informazioni.png b/app/src/main/res/drawable-mdpi/ic_informazioni.png
new file mode 100644
index 0000000..dd8bba6
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_informazioni.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_lente.png b/app/src/main/res/drawable-mdpi/ic_lente.png
new file mode 100644
index 0000000..7ad3263
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_lente.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_mani.png b/app/src/main/res/drawable-mdpi/ic_mani.png
new file mode 100644
index 0000000..0837a63
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_mani.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_pencil.png b/app/src/main/res/drawable-mdpi/ic_pencil.png
new file mode 100644
index 0000000..9421888
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_pencil.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_rete.png b/app/src/main/res/drawable-mdpi/ic_rete.png
new file mode 100644
index 0000000..2e9e2b7
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_rete.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_right_arrow.png b/app/src/main/res/drawable-mdpi/ic_right_arrow.png
new file mode 100644
index 0000000..46e282e
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_right_arrow.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_swap_arrows.png b/app/src/main/res/drawable-mdpi/ic_swap_arrows.png
new file mode 100644
index 0000000..2b93cbb
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_swap_arrows.png differ
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..1f6bb29
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable-xhdpi/ic_altoparlante.png b/app/src/main/res/drawable-xhdpi/ic_altoparlante.png
new file mode 100644
index 0000000..959a64f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_altoparlante.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_avvertimento.png b/app/src/main/res/drawable-xhdpi/ic_avvertimento.png
new file mode 100644
index 0000000..b29160e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_avvertimento.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_avvertimento_nero.png b/app/src/main/res/drawable-xhdpi/ic_avvertimento_nero.png
new file mode 100644
index 0000000..6d568fa
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_avvertimento_nero.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_condividi.png b/app/src/main/res/drawable-xhdpi/ic_condividi.png
new file mode 100644
index 0000000..862fc55
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_condividi.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_dado.png b/app/src/main/res/drawable-xhdpi/ic_dado.png
new file mode 100644
index 0000000..a49172f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_dado.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_informazioni.png b/app/src/main/res/drawable-xhdpi/ic_informazioni.png
new file mode 100644
index 0000000..32de5be
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_informazioni.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_lente.png b/app/src/main/res/drawable-xhdpi/ic_lente.png
new file mode 100644
index 0000000..d7ce7e7
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_lente.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_mani.png b/app/src/main/res/drawable-xhdpi/ic_mani.png
new file mode 100644
index 0000000..d23e181
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_mani.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_pencil.png b/app/src/main/res/drawable-xhdpi/ic_pencil.png
new file mode 100644
index 0000000..6f6ace9
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_pencil.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_rete.png b/app/src/main/res/drawable-xhdpi/ic_rete.png
new file mode 100644
index 0000000..38141ed
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_rete.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_right_arrow.png b/app/src/main/res/drawable-xhdpi/ic_right_arrow.png
new file mode 100644
index 0000000..bcef1c2
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_right_arrow.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_swap_arrows.png b/app/src/main/res/drawable-xhdpi/ic_swap_arrows.png
new file mode 100644
index 0000000..e328951
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_swap_arrows.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_altoparlante.png b/app/src/main/res/drawable-xxhdpi/ic_altoparlante.png
new file mode 100644
index 0000000..3daa174
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_altoparlante.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_avvertimento.png b/app/src/main/res/drawable-xxhdpi/ic_avvertimento.png
new file mode 100644
index 0000000..9e85e2b
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_avvertimento.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_avvertimento_nero.png b/app/src/main/res/drawable-xxhdpi/ic_avvertimento_nero.png
new file mode 100644
index 0000000..ba6531b
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_avvertimento_nero.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_condividi.png b/app/src/main/res/drawable-xxhdpi/ic_condividi.png
new file mode 100644
index 0000000..434e498
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_condividi.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_dado.png b/app/src/main/res/drawable-xxhdpi/ic_dado.png
new file mode 100644
index 0000000..c038b80
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_dado.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_informazioni.png b/app/src/main/res/drawable-xxhdpi/ic_informazioni.png
new file mode 100644
index 0000000..b7dcb48
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_informazioni.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_lente.png b/app/src/main/res/drawable-xxhdpi/ic_lente.png
new file mode 100644
index 0000000..a6b1905
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_lente.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_mani.png b/app/src/main/res/drawable-xxhdpi/ic_mani.png
new file mode 100644
index 0000000..876a4cf
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_mani.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_pencil.png b/app/src/main/res/drawable-xxhdpi/ic_pencil.png
new file mode 100644
index 0000000..0f5505f
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_pencil.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_rete.png b/app/src/main/res/drawable-xxhdpi/ic_rete.png
new file mode 100644
index 0000000..4c1bdca
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_rete.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_right_arrow.png b/app/src/main/res/drawable-xxhdpi/ic_right_arrow.png
new file mode 100644
index 0000000..723adc8
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_right_arrow.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_swap_arrows.png b/app/src/main/res/drawable-xxhdpi/ic_swap_arrows.png
new file mode 100644
index 0000000..0eebafb
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_swap_arrows.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/diventa_sponsor.png b/app/src/main/res/drawable-xxxhdpi/diventa_sponsor.png
new file mode 100644
index 0000000..b35bf9a
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/diventa_sponsor.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_altoparlante.png b/app/src/main/res/drawable-xxxhdpi/ic_altoparlante.png
new file mode 100644
index 0000000..8bf684a
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_altoparlante.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_avvertimento.png b/app/src/main/res/drawable-xxxhdpi/ic_avvertimento.png
new file mode 100644
index 0000000..508f9ff
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_avvertimento.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_avvertimento_nero.png b/app/src/main/res/drawable-xxxhdpi/ic_avvertimento_nero.png
new file mode 100644
index 0000000..73e07f2
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_avvertimento_nero.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_condividi.png b/app/src/main/res/drawable-xxxhdpi/ic_condividi.png
new file mode 100644
index 0000000..225b146
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_condividi.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_dado.png b/app/src/main/res/drawable-xxxhdpi/ic_dado.png
new file mode 100644
index 0000000..5941192
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_dado.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_informazioni.png b/app/src/main/res/drawable-xxxhdpi/ic_informazioni.png
new file mode 100644
index 0000000..0dce6c1
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_informazioni.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_lente.png b/app/src/main/res/drawable-xxxhdpi/ic_lente.png
new file mode 100644
index 0000000..94d3be2
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_lente.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_mani.png b/app/src/main/res/drawable-xxxhdpi/ic_mani.png
new file mode 100644
index 0000000..b75336a
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_mani.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pencil.png b/app/src/main/res/drawable-xxxhdpi/ic_pencil.png
new file mode 100644
index 0000000..10dbcc9
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_pencil.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_rete.png b/app/src/main/res/drawable-xxxhdpi/ic_rete.png
new file mode 100644
index 0000000..23f0e4d
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_rete.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_right_arrow.png b/app/src/main/res/drawable-xxxhdpi/ic_right_arrow.png
new file mode 100644
index 0000000..8379904
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_right_arrow.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_swap_arrows.png b/app/src/main/res/drawable-xxxhdpi/ic_swap_arrows.png
new file mode 100644
index 0000000..ed7aa75
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_swap_arrows.png differ
diff --git a/app/src/main/res/drawable/bordo_rettangolare.xml b/app/src/main/res/drawable/bordo_rettangolare.xml
new file mode 100644
index 0000000..e635278
--- /dev/null
+++ b/app/src/main/res/drawable/bordo_rettangolare.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_approu_con_didascalia_vettoriale_android.xml b/app/src/main/res/drawable/ic_approu_con_didascalia_vettoriale_android.xml
new file mode 100644
index 0000000..8f72e77
--- /dev/null
+++ b/app/src/main/res/drawable/ic_approu_con_didascalia_vettoriale_android.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_freccia_destra.xml b/app/src/main/res/drawable/ic_freccia_destra.xml
new file mode 100644
index 0000000..6cf2469
--- /dev/null
+++ b/app/src/main/res/drawable/ic_freccia_destra.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_icona_scambio_lingue.xml b/app/src/main/res/drawable/ic_icona_scambio_lingue.xml
new file mode 100644
index 0000000..c901826
--- /dev/null
+++ b/app/src/main/res/drawable/ic_icona_scambio_lingue.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
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..0d025f9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_aiutaci.xml b/app/src/main/res/layout/activity_aiutaci.xml
new file mode 100644
index 0000000..426c50f
--- /dev/null
+++ b/app/src/main/res/layout/activity_aiutaci.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_scelta_lingue.xml b/app/src/main/res/layout/activity_scelta_lingue.xml
new file mode 100644
index 0000000..ced18aa
--- /dev/null
+++ b/app/src/main/res/layout/activity_scelta_lingue.xml
@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_schermata_elenco_termini.xml b/app/src/main/res/layout/activity_schermata_elenco_termini.xml
new file mode 100644
index 0000000..dbfbf2f
--- /dev/null
+++ b/app/src/main/res/layout/activity_schermata_elenco_termini.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_schermata_risultati.xml b/app/src/main/res/layout/activity_schermata_risultati.xml
new file mode 100644
index 0000000..c120b97
--- /dev/null
+++ b/app/src/main/res/layout/activity_schermata_risultati.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_suggerisci_parola.xml b/app/src/main/res/layout/activity_suggerisci_parola.xml
new file mode 100644
index 0000000..e117a17
--- /dev/null
+++ b/app/src/main/res/layout/activity_suggerisci_parola.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_tutorial_grafia.xml b/app/src/main/res/layout/activity_tutorial_grafia.xml
new file mode 100644
index 0000000..48c6867
--- /dev/null
+++ b/app/src/main/res/layout/activity_tutorial_grafia.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/cardmia.xml b/app/src/main/res/layout/cardmia.xml
new file mode 100644
index 0000000..87e019f
--- /dev/null
+++ b/app/src/main/res/layout/cardmia.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/etichetta_risultato_traduzione.xml b/app/src/main/res/layout/etichetta_risultato_traduzione.xml
new file mode 100644
index 0000000..28a6fa2
--- /dev/null
+++ b/app/src/main/res/layout/etichetta_risultato_traduzione.xml
@@ -0,0 +1,13 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/preferences.xml b/app/src/main/res/layout/preferences.xml
new file mode 100644
index 0000000..30fdf1d
--- /dev/null
+++ b/app/src/main/res/layout/preferences.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/pulsante_elenco_termini.xml b/app/src/main/res/layout/pulsante_elenco_termini.xml
new file mode 100644
index 0000000..2fd4aa6
--- /dev/null
+++ b/app/src/main/res/layout/pulsante_elenco_termini.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/app/src/main/res/layout/schermata_benvenuto.xml b/app/src/main/res/layout/schermata_benvenuto.xml
new file mode 100644
index 0000000..99af1e9
--- /dev/null
+++ b/app/src/main/res/layout/schermata_benvenuto.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml
new file mode 100644
index 0000000..de6591a
--- /dev/null
+++ b/app/src/main/res/layout/settings_activity.xml
@@ -0,0 +1,9 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/tabella_risultati_trovati.xml b/app/src/main/res/layout/tabella_risultati_trovati.xml
new file mode 100644
index 0000000..f9474ad
--- /dev/null
+++ b/app/src/main/res/layout/tabella_risultati_trovati.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/tablerow_singolo_risultato.xml b/app/src/main/res/layout/tablerow_singolo_risultato.xml
new file mode 100644
index 0000000..5665d96
--- /dev/null
+++ b/app/src/main/res/layout/tablerow_singolo_risultato.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/options_menu_paginaprincipale.xml b/app/src/main/res/menu/options_menu_paginaprincipale.xml
new file mode 100644
index 0000000..6704cc2
--- /dev/null
+++ b/app/src/main/res/menu/options_menu_paginaprincipale.xml
@@ -0,0 +1,19 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/options_menu_schermata_risultati.xml b/app/src/main/res/menu/options_menu_schermata_risultati.xml
new file mode 100644
index 0000000..b7df58b
--- /dev/null
+++ b/app/src/main/res/menu/options_menu_schermata_risultati.xml
@@ -0,0 +1,18 @@
+
+
\ 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..036d09b
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ 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..93ed500
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_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..cd134c7
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_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..366b84b
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.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..e7b0138
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_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..ad005a7
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_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..2a6258c
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.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..b899a1f
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_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..db0b501
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_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..4d4b2ed
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.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..b8ac059
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_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..ee3c0fc
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_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..45ea5e2
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.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..abff8ab
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_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..74788ae
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_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..96a6f79
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
new file mode 100644
index 0000000..04a48ad
--- /dev/null
+++ b/app/src/main/res/values-eo/strings.xml
@@ -0,0 +1,15 @@
+
+
+ Dialekto-apude
+ Elektu lingvojn de la vortaro
+ Vortaro
+ Lingvo de la interfaco
+ Kontaktu nin
+ Enmetu vorton en %1$s
+ Serĉado de vortoj
+ Rezultoj
+ Interfaco
+ Agordoj
+ Serĉataj rezultoj de %1$s:
+ Informoj
+
\ No newline at end of file
diff --git a/app/src/main/res/values-lij/strings.xml b/app/src/main/res/values-lij/strings.xml
new file mode 100644
index 0000000..fa9fd68
--- /dev/null
+++ b/app/src/main/res/values-lij/strings.xml
@@ -0,0 +1,33 @@
+
+ Appröu
+ Disiunaiu
+ Impustasiùin
+
+ - Italian
+ - Giargun sanremascu
+
+ Sèrca
+ Inserisci la parola %1$s
+
+ Ti sei següru d\'esse cunesciüu a-a rea? Contròla e pöi prua turna
+
+
+ Va bèn
+ Na
+ Scì
+ Abàdu
+ Infurmasiùin
+ Lenga da intrafàcia
+ E lenghe sernàe a nu sun stae atruvàe
+ Impustasiùin
+ Intrafàcia
+ Riuscìa
+ Sèrni e lénghe du disiunaiu
+ Avànsa
+ Scìtu ufissià
+ Ciü de 6000 parole!
+ A aixemu faitu ina gafa!
+ Cunesciun non ariuscìa
+ Ti pöi agiütà faixèndu spicà sta gafa
+ Sèrca noma üna parola pe\' vòta
+
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
new file mode 100644
index 0000000..babaa85
--- /dev/null
+++ b/app/src/main/res/values-v21/styles.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
new file mode 100644
index 0000000..6cf9ed4
--- /dev/null
+++ b/app/src/main/res/values/arrays.xml
@@ -0,0 +1,12 @@
+
+
+
+ - Reply
+ - Reply to all
+
+
+
+ - reply
+ - reply_all
+
+
\ 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..85b39d3
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,11 @@
+
+
+ #b2c8ca
+ #5c8fc3
+ #1AB407
+ #f18520
+ #B95900
+ #D7BDA5
+ #5C8FC3
+ #b2c8ca
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..59a0b0c
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,3 @@
+
+ 16dp
+
diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..aad6fcf
--- /dev/null
+++ b/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #B2C8CA
+
\ 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..3425e5d
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,85 @@
+
+ Appröu
+ Cerca parole
+ Sostieni il progetto
+ Sito ufficiale
+ Correggi un errore
+ Seleziona le lingue, dopodiché premi il pulsante Prosegui per cercare una parola
+ Ricerca parole
+
+ Risultati
+ Cerca
+ Scegli le lingue del dizionario
+ Parola in %1$s
+
+
+ Connessione non riuscita
+ Connessione non riuscita:\nControllare che la connessione a internet sia attiva
+ Nessuna parola inserita!
+ Errore
+ Lingue selezionate non valide
+ Hai selezionato la stessa lingua in entrambi i campi \"da" e "a"
+ Non è possibile tradurre direttamente da un dialetto all\'altro
+ Cerca solo una parola alla volta
+ Non è stato trovato alcun risultato
+ Risultati ricerca di %1$s :
+
+ Interfaccia
+
+
+
+ Ok
+ Sì
+ No
+ Puoi aiutarci segnalando questo errore
+ Attenzione
+ Vuoi contribuire segnalandoci la parola mancante?
+ Vuoi contribuire segnalandoci l\'errore?
+
+
+ Lingua dell\'interfaccia
+ Impostazioni
+ Informazioni
+ Informazioni
+ chiave_lingua_scelta
+ chiave_primo_avvio
+
+
+
+ - Italiano
+ - Sanremasco
+
+
+
+
+ https://www.approu.it/?pk_campaign=android
+ https://www.approu.it/come_aiutare?pk_campaign=android
+ https://it.liberapay.com/approu/
+
+
+ - Italiano
+ - Sanremasco
+ - Esperanto
+
+
+ - it
+ - lij
+ - eo
+
+
+ ultima_lingua_origine_selezionata
+ ultima_lingua_destinazione_selezionata
+ Oltre 6000 vocaboli!
+ Informazioni
+ Risultati in %1$s, tocca la parola di interesse per tradurla
+ Parola errata o mancante
+ Tutorial grafia
+
+ Parola mancante
+ Inserisci una parola
+ Scarica anche tu Appröu, l\'app vocabolario sanremasco espandibile e collaborativa\n\nLa trovi sul sito ufficiale https://www.approu.it
+ Le traduzioni attuali di %s sono:
+ Le traduzioni potrebbero subire correzioni, controlla sempre la traduzione più recente su https://www.approu.it
+ Casuale
+
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..3b1bcb9
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
new file mode 100644
index 0000000..2f2b17e
--- /dev/null
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/test/java/it/approu/dizionario/ExampleUnitTest.java b/app/src/test/java/it/approu/dizionario/ExampleUnitTest.java
new file mode 100644
index 0000000..32cf5c6
--- /dev/null
+++ b/app/src/test/java/it/approu/dizionario/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package it.approu.dizionario;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..d29fea0
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,27 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.6.3'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..d546dea
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,17 @@
+# 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.
+android.enableJetifier=true
+android.useAndroidX=true
+org.gradle.jvmargs=-Xmx1536m
+# 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
+
+
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
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..437547b
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Feb 26 17:44:24 CET 2020
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+## 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=""
+
+# 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, switch paths to Windows format before running java
+if $cygwin ; 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=$((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"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@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 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=
+
+@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 init
+
+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 init
+
+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
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+: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 %CMD_LINE_ARGS%
+
+: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..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'