package com.njlabs.showjava.ui; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; import android.widget.Toast; import com.crashlytics.android.Crashlytics; import com.njlabs.showjava.R; import com.njlabs.showjava.modals.Item; import com.njlabs.showjava.utils.FileArrayAdapter; import com.njlabs.showjava.utils.StringUtils; import com.njlabs.showjava.utils.ZipUtils; import com.njlabs.showjava.utils.logging.Ln; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; import java.io.File; import java.io.IOException; import java.sql.Date; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class JavaExplorer extends BaseActivity { private ListView lv; private String packageID; private ActionBar actionBar; private File currentDir; private FileArrayAdapter adapter; private String sourceDir; private ProgressDialog zipProgressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupLayout(R.layout.activity_app_listing); actionBar = getSupportActionBar(); Bundle extras = getIntent().getExtras(); if (extras != null) { sourceDir = extras.getString("java_source_dir"); packageID = extras.getString("package_id"); if (sourceDir != null) { lv = (ListView) findViewById(R.id.list); currentDir = new File(sourceDir); fill(currentDir); } else { finish(); } } } private void fill(File f) { File[] dirs = f.listFiles(); if (actionBar != null) { if (f.getName().equalsIgnoreCase("java_output")) { actionBar.setTitle("Viewing the source of " + packageID); } else { actionBar.setTitle(f.getName()); } } List<Item> dir = new ArrayList<>(); List<Item> fls = new ArrayList<>(); try { for (File ff : dirs) { Date lastModDate = new Date(ff.lastModified()); DateFormat formater = DateFormat.getDateTimeInstance(); String date_modify = formater.format(lastModDate); if (ff.isDirectory()) { File[] fbuf = ff.listFiles(); int buf; if (fbuf != null) { buf = fbuf.length; } else buf = 0; String num_item = String.valueOf(buf); if (buf == 0) num_item = num_item + " item"; else num_item = num_item + " items"; dir.add(new Item(ff.getName(), num_item, date_modify, ff.getAbsolutePath(), R.drawable.viewer_folder)); } else { String extension = FilenameUtils.getExtension(ff.getName()); String fileSize = StringUtils.humanReadableByteCount(ff.length(), true); if (extension.equalsIgnoreCase("java")) { fls.add(new Item(ff.getName(), fileSize, date_modify, ff.getAbsolutePath(), R.drawable.viewer_java)); } else if (extension.equalsIgnoreCase("xml")) { fls.add(new Item(ff.getName(), fileSize, date_modify, ff.getAbsolutePath(), R.drawable.viewer_xml)); } else if (extension.equalsIgnoreCase("txt")) { fls.add(new Item(ff.getName(), fileSize, date_modify, ff.getAbsolutePath(),R.drawable.viewer_summary)); } else if (extension.equalsIgnoreCase("png") | extension.equalsIgnoreCase("jpg")) { fls.add(new Item(ff.getName(), fileSize, date_modify, ff.getAbsolutePath(), R.drawable.viewer_image)); } } } } catch (Exception e) { Ln.d(e); } Collections.sort(dir); Collections.sort(fls); dir.addAll(fls); if (!f.equals(new File(sourceDir))) dir.add(0, new Item("..", "Parent Directory", "", f.getParent(), R.drawable.directory_up)); adapter = new FileArrayAdapter(JavaExplorer.this, R.layout.java_explorer_list_item, dir); lv.setAdapter(adapter); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Item o = adapter.getItem(position); if (o.getImage() == R.drawable.viewer_folder || o.getImage() == R.drawable.directory_up) { currentDir = new File(o.getPath()); fill(currentDir); } else { onFileClick(o); } } }); } private void onFileClick(Item o) { if (FilenameUtils.getExtension(o.getPath()).equals("png") || FilenameUtils.getExtension(o.getPath()).equals("jpg")) { Intent i = new Intent(getApplicationContext(), ImageResourceViewer.class); i.putExtra("file_path", o.getPath()); i.putExtra("package_id", packageID); startActivity(i); } else { Intent i = new Intent(getApplicationContext(), SourceViewer.class); i.putExtra("file_path", o.getPath()); i.putExtra("package_id", packageID); startActivity(i); } } private void showProgressDialog() { if (zipProgressDialog == null) { zipProgressDialog = new ProgressDialog(this); zipProgressDialog.setIndeterminate(false); zipProgressDialog.setCancelable(false); zipProgressDialog.setInverseBackgroundForced(false); zipProgressDialog.setCanceledOnTouchOutside(false); zipProgressDialog.setMessage("Loading installed applications..."); } zipProgressDialog.show(); } private void dismissProgressDialog() { if (zipProgressDialog != null && zipProgressDialog.isShowing()) { zipProgressDialog.dismiss(); } } private class SourceArchiver extends AsyncTask<String, String, File> { @Override protected File doInBackground(String... params) { publishProgress("Compressing source files ..."); return ZipUtils.zipDir(new File(sourceDir), packageID); } @Override protected void onPostExecute(File zipFilePath) { dismissProgressDialog(); shareSourceZip(zipFilePath); } @Override protected void onPreExecute() { showProgressDialog(); } @Override protected void onProgressUpdate(String... text) { zipProgressDialog.setMessage(text[0]); } } @Override public void onBackPressed() { if (!currentDir.equals(new File(sourceDir))) { currentDir = new File(currentDir.getParent()); fill(currentDir); } else { Intent returnIntent = new Intent(); setResult(RESULT_CANCELED, returnIntent); finish(); } } private void shareSourceZip(File zipFile){ Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(zipFile)); shareIntent.setType("application/zip"); startActivity(Intent.createChooser(shareIntent, "Send source via")); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.explorer, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.action_delete: new AlertDialog.Builder(this) .setMessage("Are you sure want to delete ?") .setIcon(android.R.drawable.ic_dialog_alert) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { deleteSource(); }}) .setNegativeButton(android.R.string.no, null).show(); return true; case R.id.action_share: SourceArchiver sourceArchiver = new SourceArchiver(); sourceArchiver.execute(); return true; } return super.onOptionsItemSelected(item); } private void deleteSource() { try { final File sourceDir = new File(Environment.getExternalStorageDirectory() + "/ShowJava/sources/" + packageID); if (sourceDir.exists()) { FileUtils.deleteDirectory(sourceDir); } } catch (IOException e) { Crashlytics.logException(e); } Toast.makeText(baseContext, "The source code has been deleted from sdcard", Toast.LENGTH_SHORT).show(); finish(); } }