package it.angelic.soulissclient.preferences; import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Environment; import android.preference.Preference; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceManager; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.util.Log; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.ObjectOutputStream; import it.angelic.soulissclient.Constants; import it.angelic.soulissclient.R; import it.angelic.soulissclient.SoulissApp; import it.angelic.soulissclient.helpers.AlertDialogHelper; import it.angelic.soulissclient.helpers.ExportDatabaseCSVTask; import it.angelic.soulissclient.helpers.ImportDatabaseCSVTask; import it.angelic.soulissclient.helpers.SoulissPreferenceHelper; import it.angelic.soulissclient.model.db.SoulissDBHelper; public class DbPreferenceListener implements OnPreferenceClickListener { private Activity parent; private File mPath; private static final String DB_BACKUP_FORMAT = ".csv"; private static final int DIALOG_LOAD_FILE = 1000; // EXPORT private String[] mFileList; private String mChosenFile; private SoulissPreferenceHelper opzioni; private SoulissDBHelper datasource; public DbPreferenceListener(Activity parent) { super(); this.parent = parent; opzioni = SoulissApp.getOpzioni(); datasource = new SoulissDBHelper(parent); mPath = new File(Environment.getExternalStorageDirectory() + Constants.EXTERNAL_EXP_FOLDER); } @Override public boolean onPreferenceClick(Preference arg0) { if ("dbexp".equals(arg0.getKey())) return exportDb(); else if ("dbimp".equals(arg0.getKey())) { loadFileList(); onCreateDialog(DIALOG_LOAD_FILE); return true; } else if ("createdb".equals(arg0.getKey())) { return createDbRequest(); } else if ("settingshare".equals(arg0.getKey())) { return shareSettings(); } else if ("dbopt".equals(arg0.getKey())) { try { datasource.clean(); Toast.makeText(parent, parent.getString(R.string.opt_vacuum_complete) + datasource.getSize(), Toast.LENGTH_SHORT).show(); return true; } catch (Exception e) { Toast.makeText(parent, "CLEAN ERROR: "+e.getMessage(), Toast.LENGTH_SHORT).show(); } } else if ("dropdb".equals(arg0.getKey())) { AlertDialog.Builder alert = AlertDialogHelper.dropSoulissDBDialog(parent, datasource); SoulissDBHelper.open(); alert.show(); return true; } return true; } protected boolean exportDb() { if ((ContextCompat.checkSelfPermission(parent, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) { Toast.makeText(parent, "Exporting Data", Toast.LENGTH_SHORT).show(); try { ExportDatabaseCSVTask t = new ExportDatabaseCSVTask(); t.loadContext(parent); t.execute(""); } catch (Exception ex) { Log.e(Constants.TAG, ex.toString()); ex.printStackTrace(); return false; } return true; } else { ActivityCompat.requestPermissions(parent, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE); //Toast.makeText(parent, "Descarc noi actualizari!", Toast.LENGTH_SHORT).show(); return false; } } private void loadFileList() { if ((ContextCompat.checkSelfPermission(parent, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) { mPath.mkdirs(); //TODO filtrare anche per config if (mPath.exists()) { FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String filename) { File sel = new File(dir, filename); return filename.endsWith(DB_BACKUP_FORMAT); } }; mFileList = mPath.list(filter); } else { mFileList = new String[0]; } } else { ActivityCompat.requestPermissions(parent, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE); } } protected Dialog onCreateDialog(int id) { Dialog dialog = null; AlertDialog.Builder builder = new Builder(parent); switch (id) { case DIALOG_LOAD_FILE: builder.setTitle("Choose your file"); // builder.setMessage("The DB will be replaced with chosen file's contents"); if (mFileList == null) { Log.e(Constants.TAG, "NULL in Showing file picker before loading the file list"); dialog = builder.create(); return dialog; } if (opzioni.isDbConfigured()) { Log.w(Constants.TAG, "DB not empty, can't import"); dialog = builder.create(); Toast.makeText(parent, parent.getString(R.string.db_notempty), Toast.LENGTH_SHORT).show(); return dialog; } builder.setItems(mFileList, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mChosenFile = mFileList[which]; Log.d(Constants.TAG, "Import from " + mChosenFile); try { ImportDatabaseCSVTask t = new ImportDatabaseCSVTask(parent); t.setImportFile(new File(mPath + File.separator + mChosenFile)); t.execute(""); } catch (Exception ex) { Log.e(Constants.TAG, "Import ERROR", ex); } } }); break; } dialog = builder.show(); return dialog; } private boolean shareSettings() { // File sharedDir = parent.getApplicationContext().getCacheDir(); File exportDir = new File(Environment.getExternalStorageDirectory(), Constants.EXTERNAL_EXP_FOLDER + "/export"); if (!exportDir.exists()) { exportDir.mkdirs(); } File sharedP; try { sharedP = File.createTempFile("Souliss", ".preferences", exportDir); // File sharedP = new File(sharedDir, "exportSettings.tmp"); saveSharedPreferencesToFile(sharedP); Uri uriToZip = Uri.fromFile(sharedP); Log.w(Constants.TAG, "Exported preferences to: " + uriToZip.toString()); Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, uriToZip); shareIntent.setType("*/*"); parent.startActivity(Intent.createChooser(shareIntent, parent.getString(R.string.command_send))); Toast.makeText(parent, "Export complete", Toast.LENGTH_SHORT).show(); } catch (IOException e) { Toast.makeText(parent, "Sharing Error:" + e.getMessage(), Toast.LENGTH_SHORT).show(); Log.e(Constants.TAG, "Share ERR:", e); } return true; } /* * DA TOGLIRE DOPO LA 1.7.0 * */ private boolean saveSharedPreferencesToFile(File dst) { boolean res = false; ObjectOutputStream output = null; try { output = new ObjectOutputStream(new FileOutputStream(dst)); SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(parent); output.writeObject(pref.getAll()); res = true; } catch (IOException e) { e.printStackTrace(); } finally { try { if (output != null) { output.flush(); output.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return res; } private boolean createDbRequest() { if (!opzioni.isSoulissIpConfigured() && !opzioni.isSoulissReachable()) { // mostro anche con IP privato non configurato MA souliss // raggiungibile AlertDialog.Builder alert = AlertDialogHelper.sysNotInitedDialog(parent); alert.show(); return true; } // mostra dialogo creazione DB AlertDialog.Builder alert = AlertDialogHelper .updateSoulissDBDialog(parent, opzioni.getCachedAddress(), opzioni); alert.show(); return true; } }