de.baumann.browser.popups.Popup_files.java Source code

Java tutorial

Introduction

Here is the source code for de.baumann.browser.popups.Popup_files.java

Source

/*
This file is part of the Browser webview app.
    
HHS Moodle WebApp 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.
    
HHS Moodle WebApp 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 the Browser webview app.
    
If not, see <http://www.gnu.org/licenses/>.
 */

package de.baumann.browser.popups;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.FilterQueryProvider;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;

import java.io.File;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Comparator;
import java.util.Date;
import java.util.Locale;

import de.baumann.browser.R;
import de.baumann.browser.databases.DbAdapter_Files;
import de.baumann.browser.helper.helper_editText;
import de.baumann.browser.helper.helper_main;

import static android.content.ContentValues.TAG;
import static java.lang.String.valueOf;

public class Popup_files extends AppCompatActivity {

    private ListView listView = null;
    private EditText editText;
    private TextView urlBar;
    private DbAdapter_Files db;
    private SimpleCursorAdapter adapter;
    private SharedPreferences sharedPref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().setStatusBarColor(ContextCompat.getColor(Popup_files.this, R.color.colorThreeDark));

        setContentView(R.layout.activity_popup);
        helper_main.onStart(Popup_files.this);

        PreferenceManager.setDefaultValues(this, R.xml.user_settings, false);
        PreferenceManager.setDefaultValues(this, R.xml.user_settings_search, false);

        sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
        sharedPref.edit()
                .putString("files_startFolder",
                        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath())
                .apply();

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

        editText = (EditText) findViewById(R.id.editText);
        editText.setVisibility(View.GONE);
        editText.setHint(R.string.app_search_hint);
        editText.clearFocus();
        urlBar = (TextView) findViewById(R.id.urlBar);
        setTitle();

        listView = (ListView) findViewById(R.id.list);

        //calling Notes_DbAdapter
        db = new DbAdapter_Files(this);
        db.open();

        setFilesList();
    }

    private void setFilesList() {

        deleteDatabase("files_DB_v01.db");

        File f = new File(sharedPref.getString("files_startFolder",
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath()));
        final File[] files = f.listFiles();

        Arrays.sort(files, new Comparator<File>() {
            @Override
            public int compare(File file1, File file2) {
                if (file1.isDirectory()) {
                    if (file2.isDirectory()) {
                        return String.valueOf(file1.getName().toLowerCase())
                                .compareTo(file2.getName().toLowerCase());
                    } else {
                        return -1;
                    }
                } else {
                    if (file2.isDirectory()) {
                        return 1;
                    } else {
                        return String.valueOf(file1.getName().toLowerCase())
                                .compareTo(file2.getName().toLowerCase());
                    }
                }
            }
        });

        // looping through all items <item>
        if (files.length == 0) {
            Snackbar.make(listView, R.string.toast_files, Snackbar.LENGTH_LONG).show();
        }

        for (File file : files) {

            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());

            String file_Name = file.getName().substring(0, 1).toUpperCase() + file.getName().substring(1);
            String file_Size = getReadableFileSize(file.length());
            String file_date = formatter.format(new Date(file.lastModified()));
            String file_path = file.getAbsolutePath();

            String file_ext;
            if (file.isDirectory()) {
                file_ext = ".";
            } else {
                file_ext = file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf("."));
            }

            db.open();
            if (db.isExist(file_Name)) {
                Log.i(TAG, "Entry exists" + file_Name);
            } else {
                db.insert(file_Name, file_Size, file_ext, file_path, file_date);
            }
        }

        try {
            db.insert("...", "", "", "", "");
        } catch (Exception e) {
            Snackbar.make(listView, R.string.toast_directory, Snackbar.LENGTH_LONG).show();
        }

        //display data
        final int layoutstyle = R.layout.list_item;
        int[] xml_id = new int[] { R.id.textView_title_notes, R.id.textView_des_notes, R.id.textView_create_notes };
        String[] column = new String[] { "files_title", "files_content", "files_creation" };
        final Cursor row = db.fetchAllData(this);
        adapter = new SimpleCursorAdapter(this, layoutstyle, row, column, xml_id, 0) {
            @Override
            public View getView(final int position, View convertView, ViewGroup parent) {

                Cursor row2 = (Cursor) listView.getItemAtPosition(position);
                final String files_icon = row2.getString(row2.getColumnIndexOrThrow("files_icon"));
                final String files_attachment = row2.getString(row2.getColumnIndexOrThrow("files_attachment"));
                final File pathFile = new File(files_attachment);

                View v = super.getView(position, convertView, parent);
                final ImageView iv = (ImageView) v.findViewById(R.id.icon_notes);

                iv.setVisibility(View.VISIBLE);

                if (pathFile.isDirectory()) {
                    iv.setImageResource(R.drawable.folder);
                } else {
                    switch (files_icon) {
                    case "":
                        iv.setImageResource(R.drawable.arrow_up_dark);
                        break;
                    case ".m3u8":
                    case ".mp3":
                    case ".wma":
                    case ".midi":
                    case ".wav":
                    case ".aac":
                    case ".aif":
                    case ".amp3":
                    case ".weba":
                    case ".ogg":
                        iv.setImageResource(R.drawable.file_music);
                        break;
                    case ".mpeg":
                    case ".mp4":
                    case ".webm":
                    case ".qt":
                    case ".3gp":
                    case ".3g2":
                    case ".avi":
                    case ".f4v":
                    case ".flv":
                    case ".h261":
                    case ".h263":
                    case ".h264":
                    case ".asf":
                    case ".wmv":
                        try {
                            Glide.with(Popup_files.this).load(files_attachment) // or URI/path
                                    .override(76, 76).centerCrop().into(iv); //imageView to set thumbnail to
                        } catch (Exception e) {
                            Log.w("HHS_Moodle", "Error load thumbnail", e);
                            iv.setImageResource(R.drawable.file_video);
                        }
                        break;
                    case ".vcs":
                    case ".vcf":
                    case ".css":
                    case ".ics":
                    case ".conf":
                    case ".config":
                    case ".java":
                    case ".html":
                        iv.setImageResource(R.drawable.file_xml);
                        break;
                    case ".apk":
                        iv.setImageResource(R.drawable.android);
                        break;
                    case ".pdf":
                        iv.setImageResource(R.drawable.file_pdf);
                        break;
                    case ".rtf":
                    case ".csv":
                    case ".txt":
                    case ".doc":
                    case ".xls":
                    case ".ppt":
                    case ".docx":
                    case ".pptx":
                    case ".xlsx":
                    case ".odt":
                    case ".ods":
                    case ".odp":
                        iv.setImageResource(R.drawable.file_document);
                        break;
                    case ".zip":
                    case ".rar":
                        iv.setImageResource(R.drawable.zip_box);
                        break;
                    case ".gif":
                    case ".bmp":
                    case ".tiff":
                    case ".svg":
                    case ".png":
                    case ".jpg":
                    case ".JPG":
                    case ".jpeg":
                        try {
                            Glide.with(Popup_files.this).load(files_attachment) // or URI/path
                                    .diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true)
                                    .override(76, 76).centerCrop().into(iv); //imageView to set thumbnail to
                        } catch (Exception e) {
                            Log.w("HHS_Moodle", "Error load thumbnail", e);
                            iv.setImageResource(R.drawable.file_image);
                        }
                        break;
                    default:
                        iv.setImageResource(R.drawable.file);
                        break;
                    }
                }

                if (files_attachment.isEmpty()) {
                    new Handler().postDelayed(new Runnable() {
                        public void run() {
                            iv.setImageResource(R.drawable.arrow_up_dark);
                        }
                    }, 350);
                }

                return v;
            }
        };

        //display data by filter
        final String note_search = sharedPref.getString("filter_filesBY", "files_title");
        sharedPref.edit().putString("filter_filesBY", "files_title").apply();
        editText.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            public void onTextChanged(CharSequence s, int start, int before, int count) {
                adapter.getFilter().filter(s.toString());
            }
        });
        adapter.setFilterQueryProvider(new FilterQueryProvider() {
            public Cursor runQuery(CharSequence constraint) {
                return db.fetchDataByFilter(constraint.toString(), note_search);
            }
        });

        listView.setAdapter(adapter);
        //onClick function
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterview, View view, int position, long id) {

                Cursor row2 = (Cursor) listView.getItemAtPosition(position);
                final String files_icon = row2.getString(row2.getColumnIndexOrThrow("files_icon"));
                final String files_attachment = row2.getString(row2.getColumnIndexOrThrow("files_attachment"));

                final File pathFile = new File(files_attachment);

                if (pathFile.isDirectory()) {
                    try {
                        sharedPref.edit().putString("files_startFolder", files_attachment).apply();
                        setFilesList();
                    } catch (Exception e) {
                        Snackbar.make(listView, R.string.toast_directory, Snackbar.LENGTH_LONG).show();
                    }
                } else if (files_attachment.equals("")) {
                    try {
                        final File pathActual = new File(sharedPref.getString("files_startFolder",
                                Environment.getExternalStorageDirectory().getPath()));
                        sharedPref.edit().putString("files_startFolder", pathActual.getParent()).apply();
                        setFilesList();
                    } catch (Exception e) {
                        Snackbar.make(listView, R.string.toast_directory, Snackbar.LENGTH_LONG).show();
                    }
                } else {
                    helper_main.open(files_icon, Popup_files.this, pathFile, listView);
                }
            }
        });

        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

                Cursor row2 = (Cursor) listView.getItemAtPosition(position);
                final String files_title = row2.getString(row2.getColumnIndexOrThrow("files_title"));
                final String files_attachment = row2.getString(row2.getColumnIndexOrThrow("files_attachment"));

                final File pathFile = new File(files_attachment);

                if (pathFile.isDirectory()) {
                    Snackbar snackbar = Snackbar
                            .make(listView, R.string.bookmark_remove_confirmation, Snackbar.LENGTH_LONG)
                            .setAction(R.string.toast_yes, new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    sharedPref.edit().putString("files_startFolder", pathFile.getParent()).apply();
                                    deleteRecursive(pathFile);
                                    setFilesList();
                                }
                            });
                    snackbar.show();

                } else {
                    final CharSequence[] options = { getString(R.string.choose_menu_2),
                            getString(R.string.choose_menu_3), getString(R.string.choose_menu_4) };

                    final AlertDialog.Builder dialog = new AlertDialog.Builder(Popup_files.this);
                    dialog.setPositiveButton(R.string.toast_cancel, new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface dialog, int whichButton) {
                            dialog.cancel();
                        }
                    });
                    dialog.setItems(options, new DialogInterface.OnClickListener() {
                        @SuppressWarnings("ResultOfMethodCallIgnored")
                        @Override
                        public void onClick(DialogInterface dialog, int item) {

                            if (options[item].equals(getString(R.string.choose_menu_2))) {

                                if (pathFile.exists()) {
                                    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                                    sharingIntent.setType("image/png");
                                    sharingIntent.putExtra(Intent.EXTRA_SUBJECT, files_title);
                                    sharingIntent.putExtra(Intent.EXTRA_TEXT, files_title);
                                    Uri bmpUri = Uri.fromFile(pathFile);
                                    sharingIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
                                    startActivity(Intent.createChooser(sharingIntent,
                                            (getString(R.string.app_share_file))));
                                }
                            }
                            if (options[item].equals(getString(R.string.choose_menu_4))) {

                                Snackbar snackbar = Snackbar
                                        .make(listView, R.string.bookmark_remove_confirmation, Snackbar.LENGTH_LONG)
                                        .setAction(R.string.toast_yes, new View.OnClickListener() {
                                            @Override
                                            public void onClick(View view) {
                                                pathFile.delete();
                                                setFilesList();
                                            }
                                        });
                                snackbar.show();
                            }
                            if (options[item].equals(getString(R.string.choose_menu_3))) {
                                sharedPref.edit().putString("pathFile", files_attachment).apply();
                                editText.setVisibility(View.VISIBLE);
                                helper_editText.showKeyboard(Popup_files.this, editText, 2, files_title,
                                        getString(R.string.bookmark_edit_title));
                            }
                        }
                    });
                    dialog.show();
                }

                return true;
            }
        });
    }

    @SuppressWarnings("ResultOfMethodCallIgnored")
    private void deleteRecursive(File fileOrDirectory) {

        if (fileOrDirectory.isDirectory()) {
            for (File child : fileOrDirectory.listFiles()) {
                deleteRecursive(child);
            }
        }
        fileOrDirectory.delete();
    }

    private static String getReadableFileSize(long size) {
        final int BYTES_IN_KILOBYTES = 1024;
        final DecimalFormat dec = new DecimalFormat("###.#");
        final String KILOBYTES = " KB";
        final String MEGABYTES = " MB";
        final String GIGABYTES = " GB";
        float fileSize = 0;
        String suffix = KILOBYTES;

        if (size > BYTES_IN_KILOBYTES) {
            fileSize = size / BYTES_IN_KILOBYTES;
            if (fileSize > BYTES_IN_KILOBYTES) {
                fileSize = fileSize / BYTES_IN_KILOBYTES;
                if (fileSize > BYTES_IN_KILOBYTES) {
                    fileSize = fileSize / BYTES_IN_KILOBYTES;
                    suffix = GIGABYTES;
                } else {
                    suffix = MEGABYTES;
                }
            }
        }
        return valueOf(dec.format(fileSize) + suffix);
    }

    private void setTitle() {
        if (sharedPref.getString("sortDBF", "title").equals("title")) {
            urlBar.setText(getString(R.string.app_title_downloads) + " | " + getString(R.string.sort_title));
        } else if (sharedPref.getString("sortDBF", "title").equals("file_date")) {
            urlBar.setText(getString(R.string.app_title_downloads) + " | " + getString(R.string.sort_date));
        } else {
            urlBar.setText(getString(R.string.app_title_downloads) + " | " + getString(R.string.sort_extension));
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);

        if (sharedPref.getInt("keyboard", 0) == 0) {
            // normal
            menu.findItem(R.id.action_cancel).setVisible(false);
            menu.findItem(R.id.action_save_bookmark).setVisible(false);
        } else if (sharedPref.getInt("keyboard", 0) == 1) {
            // filter
            menu.findItem(R.id.action_sort).setVisible(false);
            menu.findItem(R.id.action_save_bookmark).setVisible(false);
        } else {
            // filter
            menu.findItem(R.id.action_sort).setVisible(false);
            menu.findItem(R.id.action_filter).setVisible(false);
        }
        return true; // this is important to call so that new menu is shown
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_file, menu);
        return true;
    }

    @SuppressWarnings("ResultOfMethodCallIgnored")
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.

        switch (item.getItemId()) {

        case R.id.filter_title:
            sharedPref.edit().putString("filter_filesBY", "files_title").apply();
            setFilesList();
            editText.setVisibility(View.VISIBLE);
            helper_editText.showKeyboard(Popup_files.this, editText, 1, "",
                    getString(R.string.action_filter_title));
            return true;
        case R.id.filter_url:
            sharedPref.edit().putString("filter_filesBY", "files_icon").apply();
            setFilesList();
            editText.setVisibility(View.VISIBLE);
            helper_editText.showKeyboard(Popup_files.this, editText, 1, "", getString(R.string.action_filter_url));
            return true;

        case R.id.filter_today:
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
            Calendar cal = Calendar.getInstance();
            final String search = dateFormat.format(cal.getTime());
            sharedPref.edit().putString("filter_filesBY", "files_creation").apply();
            setFilesList();
            editText.setText(search);
            urlBar.setText(getString(R.string.app_title_bookmarks) + " | " + getString(R.string.filter_today));
            return true;
        case R.id.filter_yesterday:
            DateFormat dateFormat2 = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
            Calendar cal2 = Calendar.getInstance();
            cal2.add(Calendar.DATE, -1);
            final String search2 = dateFormat2.format(cal2.getTime());
            sharedPref.edit().putString("filter_filesBY", "files_creation").apply();
            setFilesList();
            editText.setText(search2);
            urlBar.setText(getString(R.string.app_title_bookmarks) + " | " + getString(R.string.filter_yesterday));
            return true;
        case R.id.filter_before:
            DateFormat dateFormat3 = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
            Calendar cal3 = Calendar.getInstance();
            cal3.add(Calendar.DATE, -2);
            final String search3 = dateFormat3.format(cal3.getTime());
            sharedPref.edit().putString("filter_filesBY", "files_creation").apply();
            setFilesList();
            editText.setText(search3);
            urlBar.setText(getString(R.string.app_title_bookmarks) + " | " + getString(R.string.filter_before));
            return true;
        case R.id.filter_month:
            DateFormat dateFormat4 = new SimpleDateFormat("yyyy-MM", Locale.getDefault());
            Calendar cal4 = Calendar.getInstance();
            final String search4 = dateFormat4.format(cal4.getTime());
            sharedPref.edit().putString("filter_filesBY", "files_creation").apply();
            setFilesList();
            editText.setText(search4);
            urlBar.setText(getString(R.string.app_title_bookmarks) + " | " + getString(R.string.filter_month));
            return true;
        case R.id.filter_own:
            sharedPref.edit().putString("filter_filesBY", "files_creation").apply();
            setFilesList();
            editText.setVisibility(View.VISIBLE);
            helper_editText.showKeyboard(Popup_files.this, editText, 1, "",
                    getString(R.string.action_filter_create));
            return true;
        case R.id.filter_clear:
            editText.setVisibility(View.GONE);
            setTitle();
            helper_editText.hideKeyboard(Popup_files.this, editText, 0, getString(R.string.app_title_history),
                    getString(R.string.app_search_hint));
            setFilesList();
            return true;

        case R.id.action_save_bookmark:

            final File pathFile = new File(sharedPref.getString("pathFile", ""));

            String inputTag = editText.getText().toString().trim();

            File dir = pathFile.getParentFile();
            File to = new File(dir, inputTag);

            pathFile.renameTo(to);
            pathFile.delete();

            helper_editText.hideKeyboard(Popup_files.this, editText, 0, getString(R.string.app_title_bookmarks),
                    getString(R.string.app_search_hint));
            setFilesList();

            Snackbar.make(listView, R.string.bookmark_added, Snackbar.LENGTH_SHORT).show();

            editText.setVisibility(View.GONE);
            setTitle();

            sharedPref.edit().putString("pathFile", "").apply();

            return true;

        case R.id.action_cancel:
            editText.setVisibility(View.GONE);
            setTitle();
            helper_editText.hideKeyboard(Popup_files.this, editText, 0, getString(R.string.app_title_bookmarks),
                    getString(R.string.app_search_hint));
            setFilesList();
            return true;

        case R.id.sort_title:
            sharedPref.edit().putString("sortDBF", "title").apply();
            setFilesList();
            setTitle();
            return true;
        case R.id.sort_extension:
            sharedPref.edit().putString("sortDBF", "file_ext").apply();
            setFilesList();
            setTitle();
            return true;
        case R.id.sort_date:
            sharedPref.edit().putString("sortDBF", "file_date").apply();
            setFilesList();
            setTitle();
            return true;

        case android.R.id.home:
            sharedPref.edit().putInt("keyboard", 0).apply();
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}