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 @@ + + + + + + + +