diff --git a/app/build.gradle b/app/build.gradle index d317cb3..b08ac30 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,15 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' android { - compileSdkVersion 25 - buildToolsVersion '25.0.3' + compileSdkVersion 29 + buildToolsVersion '29.0.1' defaultConfig { applicationId "com.snatik.storage.sample" minSdkVersion 14 - targetSdkVersion 25 + targetSdkVersion 29 versionCode 1 versionName "1.0" } @@ -20,8 +22,13 @@ android { } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile project(':storage') - compile 'com.android.support.constraint:constraint-layout:1.0.2' - compile 'com.android.support:design:25.3.1' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation project(':storage') + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.google.android.material:material:1.0.0' + implementation "androidx.core:core-ktx:1.0.2" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} +repositories { + mavenCentral() } diff --git a/app/src/main/java/com/snatik/storage/app/FilesAdapter.java b/app/src/main/java/com/snatik/storage/app/FilesAdapter.java deleted file mode 100644 index 3fee6ea..0000000 --- a/app/src/main/java/com/snatik/storage/app/FilesAdapter.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.snatik.storage.app; - -import android.content.Context; -import android.support.v7.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; - -import com.snatik.storage.Storage; - -import java.io.File; -import java.util.List; - -/** - * Created by sromku on June, 2017. - */ -public class FilesAdapter extends RecyclerView.Adapter { - - private List mFiles; - private OnFileItemListener mListener; - private Storage mStorage; - - public FilesAdapter(Context context) { - mStorage = new Storage(context); - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.file_line_view, parent, false); - return new FileViewHolder(view); - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - final File file = mFiles.get(position); - FileViewHolder fileViewHolder = (FileViewHolder) holder; - fileViewHolder.itemView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - mListener.onClick(file); - } - }); - fileViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View view) { - mListener.onLongClick(file); - return true; - } - }); - fileViewHolder.mName.setText(file.getName()); - fileViewHolder.mIcon.setImageResource(file.isDirectory() ? R.drawable.ic_folder_primary_24dp : R.drawable - .ic_file_primary_24dp); - if (file.isDirectory()) { - fileViewHolder.mSize.setVisibility(View.GONE); - } else { - fileViewHolder.mSize.setVisibility(View.VISIBLE); - fileViewHolder.mSize.setText(mStorage.getReadableSize(file)); - } - - } - - @Override - public int getItemCount() { - return mFiles != null ? mFiles.size() : 0; - } - - public void setFiles(List files) { - mFiles = files; - } - - public void setListener(OnFileItemListener listener) { - mListener = listener; - } - - static class FileViewHolder extends RecyclerView.ViewHolder { - - TextView mName; - TextView mSize; - ImageView mIcon; - - FileViewHolder(View v) { - super(v); - mName = (TextView) v.findViewById(R.id.name); - mSize = (TextView) v.findViewById(R.id.size); - mIcon = (ImageView) v.findViewById(R.id.icon); - } - } - - public interface OnFileItemListener { - void onClick(File file); - - void onLongClick(File file); - } -} diff --git a/app/src/main/java/com/snatik/storage/app/FilesAdapter.kt b/app/src/main/java/com/snatik/storage/app/FilesAdapter.kt new file mode 100644 index 0000000..2308690 --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/FilesAdapter.kt @@ -0,0 +1,77 @@ +package com.snatik.storage.app + +import android.content.Context +import androidx.recyclerview.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView + +import com.snatik.storage.Storage + +import java.io.File + +/** + * Created by sromku on June, 2017. + */ +class FilesAdapter(context: Context) : RecyclerView.Adapter() { + + private var mFiles: List? = null + private var mListener: OnFileItemListener? = null + private val mStorage: Storage = Storage(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.file_line_view, parent, false) + return FileViewHolder(view) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val file = mFiles!![position] + val fileViewHolder = holder as FileViewHolder + fileViewHolder.itemView.setOnClickListener { mListener!!.onClick(file) } + fileViewHolder.itemView.setOnLongClickListener { + mListener!!.onLongClick(file) + true + } + fileViewHolder.mName.text = file.name + fileViewHolder.mIcon.setImageResource(getIcon(file)) + if (file.isDirectory) { + fileViewHolder.mSize.visibility = View.VISIBLE + fileViewHolder.mSize.text = "" + } else { + fileViewHolder.mSize.visibility = View.VISIBLE + fileViewHolder.mSize.text = mStorage.getReadableSize(file) + } + + } + + private fun getIcon(file: File) = if (file.isDirectory) + R.drawable.ic_folder_primary_24dp + else + R.drawable.ic_file_primary_24dp + + override fun getItemCount(): Int { + return if (mFiles != null) mFiles!!.size else 0 + } + + fun setFiles(files: List?) { + mFiles = files + } + + fun setListener(listener: OnFileItemListener) { + mListener = listener + } + + internal class FileViewHolder(v: View) : RecyclerView.ViewHolder(v) { + var mName: TextView = v.findViewById(R.id.name) as TextView + var mSize: TextView = v.findViewById(R.id.size) as TextView + var mIcon: ImageView = v.findViewById(R.id.icon) as ImageView + } + + interface OnFileItemListener { + fun onClick(file: File) + + fun onLongClick(file: File) + } +} diff --git a/app/src/main/java/com/snatik/storage/app/GenericFileProvider.java b/app/src/main/java/com/snatik/storage/app/GenericFileProvider.java deleted file mode 100644 index cb0f615..0000000 --- a/app/src/main/java/com/snatik/storage/app/GenericFileProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.snatik.storage.app; - -import android.support.v4.content.FileProvider; - -/** - * Created by sromku on July, 2017. - */ -public class GenericFileProvider extends FileProvider { -} diff --git a/app/src/main/java/com/snatik/storage/app/GenericFileProvider.kt b/app/src/main/java/com/snatik/storage/app/GenericFileProvider.kt new file mode 100644 index 0000000..d83556d --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/GenericFileProvider.kt @@ -0,0 +1,8 @@ +package com.snatik.storage.app + +import androidx.core.content.FileProvider + +/** + * Created by sromku on July, 2017. + */ +class GenericFileProvider : FileProvider() diff --git a/app/src/main/java/com/snatik/storage/app/Helper.java b/app/src/main/java/com/snatik/storage/app/Helper.java deleted file mode 100644 index c3dc7ea..0000000 --- a/app/src/main/java/com/snatik/storage/app/Helper.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.snatik.storage.app; - -import android.support.design.widget.Snackbar; -import android.view.View; - -/** - * Created by sromku on June, 2017. - */ -public class Helper { - - public static void showSnackbar(String message, View root) { - Snackbar.make(root, message, Snackbar.LENGTH_SHORT).show(); - } - - public static String fileExt(String url) { - if (url.indexOf("?") > -1) { - url = url.substring(0, url.indexOf("?")); - } - if (url.lastIndexOf(".") == -1) { - return null; - } else { - String ext = url.substring(url.lastIndexOf(".") + 1); - if (ext.indexOf("%") > -1) { - ext = ext.substring(0, ext.indexOf("%")); - } - if (ext.indexOf("/") > -1) { - ext = ext.substring(0, ext.indexOf("/")); - } - return ext.toLowerCase(); - - } - } - -} diff --git a/app/src/main/java/com/snatik/storage/app/Helper.kt b/app/src/main/java/com/snatik/storage/app/Helper.kt new file mode 100644 index 0000000..1349cae --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/Helper.kt @@ -0,0 +1,35 @@ +package com.snatik.storage.app + +import com.google.android.material.snackbar.Snackbar +import android.view.View + +/** + * Created by sromku on June, 2017. + */ +object Helper { + + fun showSnackbar(message: String, root: View) { + Snackbar.make(root, message, Snackbar.LENGTH_SHORT).show() + } + + fun fileExt(url: String): String? { + var newUrl = url + if (newUrl.indexOf("?") > -1) { + newUrl = newUrl.substring(0, newUrl.indexOf("?")) + } + return if (newUrl.lastIndexOf(".") == -1) { + null + } else { + var ext = newUrl.substring(newUrl.lastIndexOf(".") + 1) + if (ext.indexOf("%") > -1) { + ext = ext.substring(0, ext.indexOf("%")) + } + if (ext.indexOf("/") > -1) { + ext = ext.substring(0, ext.indexOf("/")) + } + ext.toLowerCase() + + } + } + +} diff --git a/app/src/main/java/com/snatik/storage/app/MainActivity.java b/app/src/main/java/com/snatik/storage/app/MainActivity.java deleted file mode 100644 index 08c1e57..0000000 --- a/app/src/main/java/com/snatik/storage/app/MainActivity.java +++ /dev/null @@ -1,361 +0,0 @@ -package com.snatik.storage.app; - -import android.Manifest; -import android.content.ActivityNotFoundException; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.net.Uri; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v4.content.FileProvider; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.webkit.MimeTypeMap; -import android.widget.PopupMenu; -import android.widget.TextView; - -import com.snatik.storage.EncryptConfiguration; -import com.snatik.storage.Storage; -import com.snatik.storage.app.dialogs.AddItemsDialog; -import com.snatik.storage.app.dialogs.ConfirmDeleteDialog; -import com.snatik.storage.app.dialogs.NewFolderDialog; -import com.snatik.storage.app.dialogs.NewTextFileDialog; -import com.snatik.storage.app.dialogs.RenameDialog; -import com.snatik.storage.app.dialogs.UpdateItemDialog; -import com.snatik.storage.helpers.OrderType; -import com.snatik.storage.helpers.SizeUnit; - -import java.io.File; -import java.util.Collections; -import java.util.List; - -import static com.snatik.storage.app.Helper.fileExt; - -public class MainActivity extends AppCompatActivity implements - FilesAdapter.OnFileItemListener, - AddItemsDialog.DialogListener, - UpdateItemDialog.DialogListener, - NewFolderDialog.DialogListener, - NewTextFileDialog.DialogListener, - ConfirmDeleteDialog.ConfirmListener, - RenameDialog.DialogListener { - - private static final int PERMISSION_REQUEST_CODE = 1000; - private RecyclerView mRecyclerView; - private FilesAdapter mFilesAdapter; - private Storage mStorage; - private TextView mPathView; - private TextView mMovingText; - private boolean mCopy; - private View mMovingLayout; - private int mTreeSteps = 0; - private final static String IVX = "abcdefghijklmnop"; - private final static String SECRET_KEY = "secret1234567890"; - private final static byte[] SALT = "0000111100001111".getBytes(); - private String mMovingPath; - private boolean mInternal = false; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mStorage = new Storage(getApplicationContext()); - - setContentView(R.layout.activity_main); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - mRecyclerView = (RecyclerView) findViewById(R.id.recycler); - mPathView = (TextView) findViewById(R.id.path); - mMovingLayout = findViewById(R.id.moving_layout); - mMovingText = (TextView) mMovingLayout.findViewById(R.id.moving_file_name); - - mMovingLayout.findViewById(R.id.accept_move).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - mMovingLayout.setVisibility(View.GONE); - if (mMovingPath != null) { - - if (!mCopy) { - String toPath = getCurrentPath() + File.separator + mStorage.getFile(mMovingPath).getName(); - if (!mMovingPath.equals(toPath)) { - mStorage.move(mMovingPath, toPath); - Helper.showSnackbar("Moved", mRecyclerView); - showFiles(getCurrentPath()); - } else { - Helper.showSnackbar("The file is already here", mRecyclerView); - } - } else { - String toPath = getCurrentPath() + File.separator + "copy " + mStorage.getFile(mMovingPath) - .getName(); - mStorage.copy(mMovingPath, toPath); - Helper.showSnackbar("Copied", mRecyclerView); - showFiles(getCurrentPath()); - } - mMovingPath = null; - } - } - }); - - mMovingLayout.findViewById(R.id.decline_move).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - mMovingLayout.setVisibility(View.GONE); - mMovingPath = null; - } - }); - - RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); - mRecyclerView.setLayoutManager(layoutManager); - mFilesAdapter = new FilesAdapter(getApplicationContext()); - mFilesAdapter.setListener(this); - mRecyclerView.setAdapter(mFilesAdapter); - - findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AddItemsDialog.newInstance().show(getFragmentManager(), "add_items"); - } - }); - - mPathView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - showPathMenu(); - } - }); - - // load files - showFiles(mStorage.getExternalStorageDirectory()); - - checkPermission(); - } - - private void showPathMenu() { - PopupMenu popupmenu = new PopupMenu(this, mPathView); - MenuInflater inflater = popupmenu.getMenuInflater(); - inflater.inflate(R.menu.path_menu, popupmenu.getMenu()); - - popupmenu.getMenu().findItem(R.id.go_internal).setVisible(!mInternal); - popupmenu.getMenu().findItem(R.id.go_external).setVisible(mInternal); - - popupmenu.show(); - - popupmenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { - - @Override - public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case R.id.go_up: - String previousPath = getPreviousPath(); - mTreeSteps = 0; - showFiles(previousPath); - break; - case R.id.go_internal: - showFiles(mStorage.getInternalFilesDirectory()); - mInternal = true; - break; - case R.id.go_external: - showFiles(mStorage.getExternalStorageDirectory()); - mInternal = false; - break; - } - return true; - } - }); - } - - private void showFiles(String path) { - mPathView.setText(path); - List files = mStorage.getFiles(path); - if (files != null) { - Collections.sort(files, OrderType.NAME.getComparator()); - } - mFilesAdapter.setFiles(files); - mFilesAdapter.notifyDataSetChanged(); - } - - - @Override - public void onClick(File file) { - if (file.isDirectory()) { - mTreeSteps++; - String path = file.getAbsolutePath(); - showFiles(path); - } else { - - try { - Intent intent = new Intent(Intent.ACTION_VIEW); - String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExt(file.getAbsolutePath())); - Uri apkURI = FileProvider.getUriForFile( - this, - getApplicationContext() - .getPackageName() + ".provider", file); - intent.setDataAndType(apkURI, mimeType); - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - startActivity(intent); - } catch (ActivityNotFoundException e) { - if (mStorage.getSize(file, SizeUnit.KB) > 500) { - Helper.showSnackbar("The file is too big for preview", mRecyclerView); - return; - } - Intent intent = new Intent(this, ViewTextActivity.class); - intent.putExtra(ViewTextActivity.EXTRA_FILE_NAME, file.getName()); - intent.putExtra(ViewTextActivity.EXTRA_FILE_PATH, file.getAbsolutePath()); - startActivity(intent); - } - - } - } - - @Override - public void onLongClick(File file) { - UpdateItemDialog.newInstance(file.getAbsolutePath()).show(getFragmentManager(), "update_item"); - } - - @Override - public void onBackPressed() { - if (mTreeSteps > 0) { - String path = getPreviousPath(); - mTreeSteps--; - showFiles(path); - return; - } - super.onBackPressed(); - } - - private String getCurrentPath() { - return mPathView.getText().toString(); - } - - private String getPreviousPath() { - String path = getCurrentPath(); - int lastIndexOf = path.lastIndexOf(File.separator); - if (lastIndexOf < 0) { - Helper.showSnackbar("Can't go anymore", mRecyclerView); - return getCurrentPath(); - } - return path.substring(0, lastIndexOf); - } - - @Override - public void onOptionClick(int which, String path) { - switch (which) { - case R.id.new_file: - NewTextFileDialog.newInstance().show(getFragmentManager(), "new_file_dialog"); - break; - case R.id.new_folder: - NewFolderDialog.newInstance().show(getFragmentManager(), "new_folder_dialog"); - break; - case R.id.delete: - ConfirmDeleteDialog.newInstance(path).show(getFragmentManager(), "confirm_delete"); - break; - case R.id.rename: - RenameDialog.newInstance(path).show(getFragmentManager(), "rename"); - break; - case R.id.move: - mMovingText.setText(getString(R.string.moving_file, mStorage.getFile(path).getName())); - mMovingPath = path; - mCopy = false; - mMovingLayout.setVisibility(View.VISIBLE); - break; - case R.id.copy: - mMovingText.setText(getString(R.string.copy_file, mStorage.getFile(path).getName())); - mMovingPath = path; - mCopy = true; - mMovingLayout.setVisibility(View.VISIBLE); - break; - } - } - - @Override - public void onNewFolder(String name) { - String currentPath = getCurrentPath(); - String folderPath = currentPath + File.separator + name; - boolean created = mStorage.createDirectory(folderPath); - if (created) { - showFiles(currentPath); - Helper.showSnackbar("New folder created: " + name, mRecyclerView); - } else { - Helper.showSnackbar("Failed create folder: " + name, mRecyclerView); - } - } - - @Override - public void onNewFile(String name, String content, boolean encrypted) { - String currentPath = getCurrentPath(); - String folderPath = currentPath + File.separator + name; - if (encrypted) { - mStorage.setEncryptConfiguration(new EncryptConfiguration.Builder() - .setEncryptContent(IVX, SECRET_KEY, SALT) - .build()); - } - mStorage.createFile(folderPath, content); - showFiles(currentPath); - Helper.showSnackbar("New file created: " + name, mRecyclerView); - } - - @Override - public void onConfirmDelete(String path) { - if (mStorage.getFile(path).isDirectory()) { - mStorage.deleteDirectory(path); - Helper.showSnackbar("Folder was deleted", mRecyclerView); - } else { - mStorage.deleteFile(path); - Helper.showSnackbar("File was deleted", mRecyclerView); - } - showFiles(getCurrentPath()); - } - - @Override - public void onRename(String fromPath, String toPath) { - mStorage.rename(fromPath, toPath); - showFiles(getCurrentPath()); - Helper.showSnackbar("Renamed", mRecyclerView); - } - -// @Override -// public boolean onCreateOptionsMenu(Menu menu) { -// MenuInflater inflater = getMenuInflater(); -// inflater.inflate(R.menu.main_menu, menu); -// return true; -// } -// -// @Override -// public boolean onOptionsItemSelected(MenuItem item) { -// switch (item.getItemId()) { -// case R.id.order: -// break; -// case R.id.filter: -// break; -// } -// -// return super.onOptionsItemSelected(item); -// } - - private void checkPermission() { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager - .PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - PERMISSION_REQUEST_CODE); - } - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] - grantResults) { - if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - showFiles(mStorage.getExternalStorageDirectory()); - } else { - finish(); - } - } -} diff --git a/app/src/main/java/com/snatik/storage/app/MainActivity.kt b/app/src/main/java/com/snatik/storage/app/MainActivity.kt new file mode 100644 index 0000000..683e77b --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/MainActivity.kt @@ -0,0 +1,321 @@ +package com.snatik.storage.app + +import android.Manifest +import android.content.ActivityNotFoundException +import android.content.Intent +import android.content.pm.PackageManager +import android.os.Bundle +import android.view.View +import android.webkit.MimeTypeMap +import android.widget.PopupMenu +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.core.content.FileProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.snatik.storage.EncryptConfiguration +import com.snatik.storage.Storage +import com.snatik.storage.app.Helper.fileExt +import com.snatik.storage.app.dialogs.* +import com.snatik.storage.helpers.OrderType +import com.snatik.storage.helpers.SizeUnit +import kotlinx.android.synthetic.main.activity_main.* +import java.io.File +import java.util.* + +class MainActivity : AppCompatActivity(), FilesAdapter.OnFileItemListener, AddItemsDialog.DialogListener, UpdateItemDialog.DialogListener, NewFolderDialog.DialogListener, NewTextFileDialog.DialogListener, ConfirmDeleteDialog.ConfirmListener, RenameDialog.DialogListener { + private var mRecyclerView: RecyclerView? = null + private var mFilesAdapter: FilesAdapter? = null + private var mStorage: Storage? = null + private var mPathView: TextView? = null + private var currentPath: String = "" + private var mMovingText: TextView? = null + private var mCopy: Boolean = false + private var mMovingLayout: View? = null + private var mTreeSteps = 0 + private var mMovingPath: String? = null + private var mInternal = false + lateinit var toolbar: Toolbar + + private val previousPath: String + get() { + val path = currentPath + val lastIndexOf = path.lastIndexOf(File.separator) + if (lastIndexOf < 0) { + Helper.showSnackbar("Can't go anymore", mRecyclerView!!) + return currentPath + } + return path.substring(0, lastIndexOf) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + mStorage = Storage(applicationContext) + + setContentView(R.layout.activity_main) + toolbar = findViewById(R.id.toolbar) + setSupportActionBar(toolbar) + + mRecyclerView = findViewById(R.id.recycler) + mPathView = findViewById(R.id.path) + mMovingLayout = findViewById(R.id.moving_layout) + mMovingText = mMovingLayout!!.findViewById(R.id.moving_file_name) + + mMovingLayout!!.findViewById(R.id.accept_move).setOnClickListener { + mMovingLayout!!.visibility = View.GONE + if (mMovingPath != null) { + + if (!mCopy) { + val toPath = currentPath + File.separator + mStorage!!.getFile(mMovingPath!!).name + if (mMovingPath != toPath) { + mStorage!!.move(mMovingPath!!, toPath) + Helper.showSnackbar("Moved", mRecyclerView!!) + showFiles(currentPath) + } else { + Helper.showSnackbar("The file is already here", mRecyclerView!!) + } + } else { + val toPath = currentPath + File.separator + "copy " + mStorage!!.getFile(mMovingPath!!) + .name + mStorage!!.copy(mMovingPath!!, toPath) + Helper.showSnackbar("Copied", mRecyclerView!!) + showFiles(currentPath) + } + mMovingPath = null + } + } + + mMovingLayout!!.findViewById(R.id.decline_move).setOnClickListener { + mMovingLayout!!.visibility = View.GONE + mMovingPath = null + } + + val layoutManager = GridLayoutManager(this, 3) + mRecyclerView!!.layoutManager = layoutManager + mFilesAdapter = FilesAdapter(applicationContext) + mFilesAdapter!!.setListener(this) + mRecyclerView!!.adapter = mFilesAdapter + + findViewById(R.id.fab).setOnClickListener { AddItemsDialog.newInstance().show(supportFragmentManager, "add_items") } + + mPathView!!.setOnClickListener { showPathMenu() } + + // load files + showFiles(mStorage!!.externalStorageDirectory) + + checkPermission() + } + + private fun showPathMenu() { + val popUpMenu = PopupMenu(this, mPathView) + val inflater = popUpMenu.menuInflater + inflater.inflate(R.menu.path_menu, popUpMenu.menu) + + popUpMenu.menu.findItem(R.id.go_internal).isVisible = !mInternal + popUpMenu.menu.findItem(R.id.go_external).isVisible = mInternal + + popUpMenu.show() + + popUpMenu.setOnMenuItemClickListener { item -> + when (item.itemId) { + R.id.go_up -> { + val previousPath = previousPath + mTreeSteps = 0 + showFiles(previousPath) + } + R.id.go_internal -> { + showFiles(mStorage!!.internalFilesDirectory) + mInternal = true + } + R.id.go_external -> { + showFiles(mStorage!!.externalStorageDirectory) + mInternal = false + } + } + true + } + } + + private fun showFiles(path: String) { + toolbar.title = File(path).name + currentPath = path + + mPathView!!.text = getPathString(path) + val files = mStorage!!.getFiles(path) + if (files != null) { + Collections.sort(files, OrderType.NAME.comparator) + } + mFilesAdapter!!.setFiles(files) + mFilesAdapter!!.notifyDataSetChanged() + } + + private fun getPathString(path: String): CharSequence? { + val file = File(path) + val sb = StringBuilder() + if (file.parentFile != null && file.parentFile!!.parentFile != null) { + sb.append("...") + .append(" > ") + } + sb.append(file.parentFile!!.name) + .append(" > ") + .append(file.name) + return sb.toString() + } + + + override fun onClick(file: File) { + if (file.isDirectory) { + mTreeSteps++ + val path = file.absolutePath + showFiles(path) + } else { + + try { + val intent = Intent(Intent.ACTION_VIEW) + val mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExt(file.absolutePath)) + val apkURI = FileProvider.getUriForFile( + this, + applicationContext + .packageName + ".provider", file) + intent.setDataAndType(apkURI, mimeType) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + startActivity(intent) + } catch (e: ActivityNotFoundException) { + if (mStorage!!.getSize(file, SizeUnit.KB) > 500) { + Helper.showSnackbar("The file is too big for preview", mRecyclerView!!) + return + } + val intent = Intent(this, ViewTextActivity::class.java) + intent.putExtra(ViewTextActivity.EXTRA_FILE_NAME, file.name) + intent.putExtra(ViewTextActivity.EXTRA_FILE_PATH, file.absolutePath) + startActivity(intent) + } + + } + } + + override fun onLongClick(file: File) { + UpdateItemDialog.newInstance(file.absolutePath).show(supportFragmentManager, "update_item") + } + + override fun onBackPressed() { + if (mTreeSteps > 0) { + val path = previousPath + mTreeSteps-- + showFiles(path) + return + } + super.onBackPressed() + } + + override fun onOptionClick(which: Int, path: String?) { + when (which) { + R.id.new_file -> NewTextFileDialog.newInstance().show(supportFragmentManager, "new_file_dialog") + R.id.new_folder -> NewFolderDialog.newInstance().show(supportFragmentManager, "new_folder_dialog") + R.id.delete -> ConfirmDeleteDialog.newInstance(path!!).show(supportFragmentManager, "confirm_delete") + R.id.rename -> RenameDialog.newInstance(path!!).show(supportFragmentManager, "rename") + R.id.move -> { + mMovingText!!.text = getString(R.string.moving_file, mStorage!!.getFile(path!!).name) + mMovingPath = path + mCopy = false + mMovingLayout!!.visibility = View.VISIBLE + } + R.id.copy -> { + mMovingText!!.text = getString(R.string.copy_file, mStorage!!.getFile(path!!).name) + mMovingPath = path + mCopy = true + mMovingLayout!!.visibility = View.VISIBLE + } + } + } + + override fun onNewFolder(name: String) { + val currentPath = currentPath + val folderPath = currentPath + File.separator + name + val created = mStorage!!.createDirectory(folderPath) + if (created) { + showFiles(currentPath) + Helper.showSnackbar("New folder created: $name", mRecyclerView!!) + } else { + Helper.showSnackbar("Failed create folder: $name", mRecyclerView!!) + } + } + + override fun onNewFile(name: String, content: String, encrypt: Boolean) { + val currentPath = currentPath + val folderPath = currentPath + File.separator + name + if (encrypt) { + mStorage!!.setEncryptConfiguration(EncryptConfiguration.Builder() + .setEncryptContent(IVX, SECRET_KEY, SALT) + .build()) + } + mStorage!!.createFile(folderPath, content) + showFiles(currentPath) + Helper.showSnackbar("New file created: $name", mRecyclerView!!) + } + + override fun onConfirmDelete(path: String?) { + if (mStorage!!.getFile(path!!).isDirectory) { + mStorage!!.deleteDirectory(path) + Helper.showSnackbar("Folder was deleted", mRecyclerView!!) + } else { + mStorage!!.deleteFile(path) + Helper.showSnackbar("File was deleted", mRecyclerView!!) + } + showFiles(currentPath) + } + + override fun onRename(fromPath: String, toPath: String) { + mStorage!!.rename(fromPath, toPath) + showFiles(currentPath) + Helper.showSnackbar("Renamed", mRecyclerView!!) + } + + // @Override + // public boolean onCreateOptionsMenu(Menu menu) { + // MenuInflater inflater = getMenuInflater(); + // inflater.inflate(R.menu.main_menu, menu); + // return true; + // } + // + // @Override + // public boolean onOptionsItemSelected(MenuItem item) { + // switch (item.getItemId()) { + // case R.id.order: + // break; + // case R.id.filter: + // break; + // } + // + // return super.onOptionsItemSelected(item); + // } + + private fun checkPermission() { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager + .PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), + PERMISSION_REQUEST_CODE) + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + showFiles(mStorage!!.externalStorageDirectory) + } else { + finish() + } + } + + companion object { + + private const val PERMISSION_REQUEST_CODE = 1000 + private const val IVX = "abcdefghijklmnop" + private const val SECRET_KEY = "secret1234567890" + private val SALT = "0000111100001111".toByteArray() + } +} diff --git a/app/src/main/java/com/snatik/storage/app/MyApplication.java b/app/src/main/java/com/snatik/storage/app/MyApplication.java deleted file mode 100644 index d2bcfbf..0000000 --- a/app/src/main/java/com/snatik/storage/app/MyApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.snatik.storage.app; - -import android.app.Application; - -public class MyApplication extends Application { - - public static String TAG = "MyApplication"; - - @Override - public void onCreate() { - super.onCreate(); - } -} diff --git a/app/src/main/java/com/snatik/storage/app/MyApplication.kt b/app/src/main/java/com/snatik/storage/app/MyApplication.kt new file mode 100644 index 0000000..157cb2b --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/MyApplication.kt @@ -0,0 +1,15 @@ +package com.snatik.storage.app + +import android.app.Application + +class MyApplication : Application() { + + override fun onCreate() { + super.onCreate() + } + + companion object { + + var TAG = "MyApplication" + } +} diff --git a/app/src/main/java/com/snatik/storage/app/ViewTextActivity.java b/app/src/main/java/com/snatik/storage/app/ViewTextActivity.java deleted file mode 100644 index 90321ee..0000000 --- a/app/src/main/java/com/snatik/storage/app/ViewTextActivity.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.snatik.storage.app; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.graphics.drawable.DrawerArrowDrawable; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.widget.TextView; - -import com.snatik.storage.EncryptConfiguration; -import com.snatik.storage.Storage; - -/** - * Created by sromku on June, 2017. - */ -public class ViewTextActivity extends AppCompatActivity { - - public final static String EXTRA_FILE_NAME = "name"; - public final static String EXTRA_FILE_PATH = "path"; - - private final static String IVX = "abcdefghijklmnop"; - private final static String SECRET_KEY = "secret1234567890"; - private final static byte[] SALT = "0000111100001111".getBytes(); - - private TextView mContentView; - private String mPath; - private Storage mStorage; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - String name = getIntent().getStringExtra(EXTRA_FILE_NAME); - mPath = getIntent().getStringExtra(EXTRA_FILE_PATH); - - setContentView(R.layout.activity_view_text_file); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - DrawerArrowDrawable drawerDrawable = new DrawerArrowDrawable(this); - drawerDrawable.setColor(getResources().getColor(android.R.color.white)); - drawerDrawable.setProgress(1f); - toolbar.setNavigationIcon(drawerDrawable); - - setSupportActionBar(toolbar); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle(name); - getSupportActionBar().setHomeButtonEnabled(true); - - mContentView = (TextView) findViewById(R.id.content); - mStorage = new Storage(this); - byte[] bytes = mStorage.readFile(mPath); - mContentView.setText(new String(bytes)); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.text_menu, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - onBackPressed(); - return true; - case R.id.decrypt: - mStorage.setEncryptConfiguration(new EncryptConfiguration.Builder() - .setEncryptContent(IVX, SECRET_KEY, SALT) - .build()); - byte[] bytes = mStorage.readFile(mPath); - if (bytes != null) { - mContentView.setText(new String(bytes)); - } else { - Helper.showSnackbar("Failed to decrypt", mContentView); - } - break; - } - - return super.onOptionsItemSelected(item); - } -} diff --git a/app/src/main/java/com/snatik/storage/app/ViewTextActivity.kt b/app/src/main/java/com/snatik/storage/app/ViewTextActivity.kt new file mode 100644 index 0000000..24b03d6 --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/ViewTextActivity.kt @@ -0,0 +1,85 @@ +package com.snatik.storage.app + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.graphics.drawable.DrawerArrowDrawable +import androidx.appcompat.widget.Toolbar +import android.view.Menu +import android.view.MenuInflater +import android.view.MenuItem +import android.view.View +import android.widget.TextView + +import com.snatik.storage.EncryptConfiguration +import com.snatik.storage.Storage + +/** + * Created by sromku on June, 2017. + */ +class ViewTextActivity : AppCompatActivity() { + + private var mContentView: TextView? = null + private var mPath: String? = null + private var mStorage: Storage? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val name = intent.getStringExtra(EXTRA_FILE_NAME) + mPath = intent.getStringExtra(EXTRA_FILE_PATH) + + setContentView(R.layout.activity_view_text_file) + val toolbar = findViewById(R.id.toolbar) as Toolbar + val drawerDrawable = DrawerArrowDrawable(this) + drawerDrawable.color = resources.getColor(android.R.color.white) + drawerDrawable.progress = 1f + toolbar.navigationIcon = drawerDrawable + + setSupportActionBar(toolbar) + supportActionBar!!.setDisplayHomeAsUpEnabled(true) + supportActionBar!!.setTitle(name) + supportActionBar!!.setHomeButtonEnabled(true) + + mContentView = findViewById(R.id.content) as TextView + mStorage = Storage(this) + val bytes = mStorage!!.readFile(mPath!!) + mContentView!!.text = String(bytes!!) + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + val inflater = menuInflater + inflater.inflate(R.menu.text_menu, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + onBackPressed() + return true + } + R.id.decrypt -> { + mStorage!!.setEncryptConfiguration(EncryptConfiguration.Builder() + .setEncryptContent(IVX, SECRET_KEY, SALT) + .build()) + val bytes = mStorage!!.readFile(mPath!!) + if (bytes != null) { + mContentView!!.text = String(bytes) + } else { + Helper.showSnackbar("Failed to decrypt", mContentView!!) + } + } + } + + return super.onOptionsItemSelected(item) + } + + companion object { + + val EXTRA_FILE_NAME = "name" + val EXTRA_FILE_PATH = "path" + + private val IVX = "abcdefghijklmnop" + private val SECRET_KEY = "secret1234567890" + private val SALT = "0000111100001111".toByteArray() + } +} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/AddItemsDialog.java b/app/src/main/java/com/snatik/storage/app/dialogs/AddItemsDialog.java deleted file mode 100644 index 36accc9..0000000 --- a/app/src/main/java/com/snatik/storage/app/dialogs/AddItemsDialog.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.snatik.storage.app.dialogs; - -import android.app.Activity; -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.design.widget.BottomSheetDialog; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.snatik.storage.app.R; - -public class AddItemsDialog extends DialogFragment { - - private DialogListener mListener; - - public static AddItemsDialog newInstance() { - AddItemsDialog fragment = new AddItemsDialog(); - return fragment; - } - - public AddItemsDialog() { - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - final Dialog dialog = new BottomSheetDialog(getActivity(), getTheme()); - - View view = LayoutInflater.from(getActivity()).inflate(R.layout.add_items_dialog, null); - dialog.setContentView(view); - dialog.setCancelable(true); - - view.findViewById(R.id.new_folder).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dialog.dismiss(); - mListener.onOptionClick(R.id.new_folder, null); - } - }); - - view.findViewById(R.id.new_file).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dialog.dismiss(); - mListener.onOptionClick(R.id.new_file, null); - } - }); - - // control dialog width on different devices - dialog.setOnShowListener(new DialogInterface.OnShowListener() { - @Override - public void onShow(DialogInterface dialogINterface) { - int width = (int) getResources().getDimension(R.dimen.bottom_sheet_dialog_width); - dialog.getWindow().setLayout( - width == 0 ? ViewGroup.LayoutParams.MATCH_PARENT : width, - ViewGroup.LayoutParams.MATCH_PARENT); - } - }); - - return dialog; - } - - public interface DialogListener { - void onOptionClick(int which, String path); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - mListener = (DialogListener) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement DialogListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - - -} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/AddItemsDialog.kt b/app/src/main/java/com/snatik/storage/app/dialogs/AddItemsDialog.kt new file mode 100644 index 0000000..c102858 --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/dialogs/AddItemsDialog.kt @@ -0,0 +1,73 @@ +package com.snatik.storage.app.dialogs + +import android.app.Activity +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.DialogFragment +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.snatik.storage.app.R + +class AddItemsDialog : DialogFragment() { + + private var mListener: DialogListener? = null + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + + val dialog = BottomSheetDialog(activity!!, theme) + + val view = LayoutInflater.from(activity).inflate(R.layout.add_items_dialog, null) + dialog.setContentView(view) + dialog.setCancelable(true) + + view.findViewById(R.id.new_folder).setOnClickListener { + dialog.dismiss() + mListener!!.onOptionClick(R.id.new_folder, null) + } + + view.findViewById(R.id.new_file).setOnClickListener { + dialog.dismiss() + mListener!!.onOptionClick(R.id.new_file, null) + } + + // control dialog width on different devices + dialog.setOnShowListener { + val width = resources.getDimension(R.dimen.bottom_sheet_dialog_width).toInt() + dialog.window!!.setLayout( + if (width == 0) ViewGroup.LayoutParams.MATCH_PARENT else width, + ViewGroup.LayoutParams.MATCH_PARENT) + } + + return dialog + } + + interface DialogListener { + fun onOptionClick(which: Int, path: String?) + } + + override fun onAttach(activity: Activity) { + super.onAttach(activity) + try { + mListener = activity as DialogListener + } catch (e: ClassCastException) { + throw ClassCastException("$activity must implement DialogListener") + } + + } + + override fun onDetach() { + super.onDetach() + mListener = null + } + + companion object { + + fun newInstance(): AddItemsDialog { + return AddItemsDialog() + } + } + + +} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/ConfirmDeleteDialog.java b/app/src/main/java/com/snatik/storage/app/dialogs/ConfirmDeleteDialog.java deleted file mode 100644 index 44d9b5b..0000000 --- a/app/src/main/java/com/snatik/storage/app/dialogs/ConfirmDeleteDialog.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.snatik.storage.app.dialogs; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; - -import com.snatik.storage.Storage; -import com.snatik.storage.app.R; - -import java.io.File; - -public class ConfirmDeleteDialog extends DialogFragment { - - private final static String PATH = "path"; - private String mPath; - - public static ConfirmDeleteDialog newInstance(String path) { - ConfirmDeleteDialog fragment = new ConfirmDeleteDialog(); - Bundle args = new Bundle(); - args.putString(PATH, path); - fragment.setArguments(args); - return fragment; - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - - String msg; - final String path = getArguments().getString(PATH); - Storage storage = new Storage(getActivity()); - File file = storage.getFile(path); - if (file.isDirectory()) { - msg = "You are about to delete the folder with all it's content for real."; - } else { - msg = "You are about to delete the file"; - } - builder.setMessage(msg); - builder.setPositiveButton(R.string.label_delete, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - ((ConfirmListener) getActivity()).onConfirmDelete(path); - } - }); - builder.setNegativeButton(R.string.label_cancel, null); - return builder.create(); - } - - public interface ConfirmListener { - void onConfirmDelete(String path); - } -} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/ConfirmDeleteDialog.kt b/app/src/main/java/com/snatik/storage/app/dialogs/ConfirmDeleteDialog.kt new file mode 100644 index 0000000..d1f627a --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/dialogs/ConfirmDeleteDialog.kt @@ -0,0 +1,46 @@ +package com.snatik.storage.app.dialogs + +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import com.snatik.storage.Storage +import com.snatik.storage.app.R + +class ConfirmDeleteDialog : DialogFragment() { + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val builder = AlertDialog.Builder(activity) + + val msg: String + val path = arguments?.getString(PATH) + val storage = Storage(activity!!) + val file = storage.getFile(path!!) + msg = if (file.isDirectory) { + "You are about to delete the folder with all it's content for real." + } else { + "You are about to delete the file" + } + builder.setMessage(msg) + builder.setPositiveButton(R.string.label_delete) { _, _ -> (activity as ConfirmListener).onConfirmDelete(path) } + builder.setNegativeButton(R.string.label_cancel, null) + return builder.create() + } + + interface ConfirmListener { + fun onConfirmDelete(path: String?) + } + + companion object { + + private const val PATH = "path" + + fun newInstance(path: String): ConfirmDeleteDialog { + val fragment = ConfirmDeleteDialog() + val args = Bundle() + args.putString(PATH, path) + fragment.arguments = args + return fragment + } + } +} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/NewFolderDialog.java b/app/src/main/java/com/snatik/storage/app/dialogs/NewFolderDialog.java deleted file mode 100644 index 44aae9c..0000000 --- a/app/src/main/java/com/snatik/storage/app/dialogs/NewFolderDialog.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.snatik.storage.app.dialogs; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.EditText; - -import com.snatik.storage.app.R; - -/** - * Created by sromku on June, 2017. - */ -public class NewFolderDialog extends DialogFragment { - - private NewFolderDialog.DialogListener mListener; - - public static NewFolderDialog newInstance() { - NewFolderDialog fragment = new NewFolderDialog(); - return fragment; - } - - public NewFolderDialog() { - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - - final View view = LayoutInflater.from(getActivity()) - .inflate(R.layout.new_folder_dialog, (ViewGroup) getView(), false); - - // if text is empty, disable the dialog positive button - final EditText editText = (EditText) view.findViewById(R.id.name); - editText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - } - - @Override - public void afterTextChanged(Editable editable) { - ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(editable != null && - editable.length() > 0); - } - }); - - builder.setTitle(R.string.new_folder); - builder.setView(view); - builder.setPositiveButton(R.string.label_save, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - mListener.onNewFolder(editText.getText().toString()); - } - }); - - final AlertDialog dialog = builder.create(); - view.post(new Runnable() { - @Override - public void run() { - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); - } - }); - dialog.setCancelable(false); - return dialog; - } - - public interface DialogListener { - void onNewFolder(String name); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - mListener = (DialogListener) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement DialogListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - -} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/NewFolderDialog.kt b/app/src/main/java/com/snatik/storage/app/dialogs/NewFolderDialog.kt new file mode 100644 index 0000000..60c42af --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/dialogs/NewFolderDialog.kt @@ -0,0 +1,78 @@ +package com.snatik.storage.app.dialogs + +import android.app.Activity +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import androidx.fragment.app.DialogFragment +import com.snatik.storage.app.R + +/** + * Created by sromku on June, 2017. + */ +class NewFolderDialog : DialogFragment() { + + private var mListener: NewFolderDialog.DialogListener? = null + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + + val builder = AlertDialog.Builder(activity) + + val view = LayoutInflater.from(activity) + .inflate(R.layout.new_folder_dialog, view as ViewGroup?, false) + + // if text is empty, disable the dialog positive button + val editText = view.findViewById(R.id.name) as EditText + editText.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + + override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + + override fun afterTextChanged(editable: Editable?) { + (dialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editable != null && editable.length > 0 + } + }) + + builder.setTitle(R.string.new_folder) + builder.setView(view) + builder.setPositiveButton(R.string.label_save) { dialogInterface, i -> mListener!!.onNewFolder(editText.text.toString()) } + + val dialog = builder.create() + view.post { dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false } + dialog.setCancelable(false) + return dialog + } + + interface DialogListener { + fun onNewFolder(name: String) + } + + override fun onAttach(activity: Activity) { + super.onAttach(activity) + try { + mListener = activity as DialogListener + } catch (e: ClassCastException) { + throw ClassCastException("$activity must implement DialogListener") + } + + } + + override fun onDetach() { + super.onDetach() + mListener = null + } + + companion object { + + fun newInstance(): NewFolderDialog { + return NewFolderDialog() + } + } + +} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/NewTextFileDialog.java b/app/src/main/java/com/snatik/storage/app/dialogs/NewTextFileDialog.java deleted file mode 100644 index fbfa245..0000000 --- a/app/src/main/java/com/snatik/storage/app/dialogs/NewTextFileDialog.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.snatik.storage.app.dialogs; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CheckBox; -import android.widget.EditText; - -import com.snatik.storage.app.R; - -/** - * Created by sromku on June, 2017. - */ -public class NewTextFileDialog extends DialogFragment { - - private NewTextFileDialog.DialogListener mListener; - - public static NewTextFileDialog newInstance() { - NewTextFileDialog fragment = new NewTextFileDialog(); - return fragment; - } - - public NewTextFileDialog() { - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - - final View view = LayoutInflater.from(getActivity()) - .inflate(R.layout.new_file_dialog, (ViewGroup) getView(), false); - - // if text is empty, disable the dialog positive button - final EditText nameEditText = (EditText) view.findViewById(R.id.name); - final EditText contentEditText = (EditText) view.findViewById(R.id.content); - final CheckBox encryptCheckbox = (CheckBox) view.findViewById(R.id.checkbox); - - nameEditText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - } - - @Override - public void afterTextChanged(Editable editable) { - ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(editable.length() > 0 && contentEditText.getText().length() > 0); - } - }); - - contentEditText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - } - - @Override - public void afterTextChanged(Editable editable) { - ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(editable.length() > 0 && nameEditText.getText().length() > 0); - } - }); - - builder.setTitle(R.string.new_file); - builder.setView(view); - builder.setPositiveButton(R.string.label_save, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - mListener.onNewFile(nameEditText.getText().toString(), contentEditText.getText().toString(), encryptCheckbox.isChecked()); - } - }); - - final AlertDialog dialog = builder.create(); - view.post(new Runnable() { - @Override - public void run() { - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); - } - }); - dialog.setCancelable(false); - return dialog; - } - - public interface DialogListener { - void onNewFile(String name, String content, boolean encrypt); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - mListener = (DialogListener) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement DialogListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - -} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/NewTextFileDialog.kt b/app/src/main/java/com/snatik/storage/app/dialogs/NewTextFileDialog.kt new file mode 100644 index 0000000..c36209c --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/dialogs/NewTextFileDialog.kt @@ -0,0 +1,92 @@ +package com.snatik.storage.app.dialogs + +import android.app.Activity +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.CheckBox +import android.widget.EditText +import androidx.fragment.app.DialogFragment +import com.snatik.storage.app.R + +/** + * Created by sromku on June, 2017. + */ +class NewTextFileDialog : DialogFragment() { + + private var mListener: DialogListener? = null + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + + val builder = AlertDialog.Builder(activity) + + val view = LayoutInflater.from(activity) + .inflate(R.layout.new_file_dialog, view as ViewGroup?, false) + + // if text is empty, disable the dialog positive button + val nameEditText = view.findViewById(R.id.name) as EditText + val contentEditText = view.findViewById(R.id.content) as EditText + val encryptCheckbox = view.findViewById(R.id.checkbox) as CheckBox + + nameEditText.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + + override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + + override fun afterTextChanged(editable: Editable) { + (dialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editable.length > 0 && contentEditText.text.length > 0 + } + }) + + contentEditText.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + + override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + + override fun afterTextChanged(editable: Editable) { + (dialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editable.length > 0 && nameEditText.text.length > 0 + } + }) + + builder.setTitle(R.string.new_file) + builder.setView(view) + builder.setPositiveButton(R.string.label_save) { _, _ -> mListener!!.onNewFile(nameEditText.text.toString(), contentEditText.text.toString(), encryptCheckbox.isChecked) } + + val dialog = builder.create() + view.post { dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false } + dialog.setCancelable(false) + return dialog + } + + interface DialogListener { + fun onNewFile(name: String, content: String, encrypt: Boolean) + } + + override fun onAttach(activity: Activity) { + super.onAttach(activity) + try { + mListener = activity as DialogListener + } catch (e: ClassCastException) { + throw ClassCastException("$activity must implement DialogListener") + } + + } + + override fun onDetach() { + super.onDetach() + mListener = null + } + + companion object { + + fun newInstance(): NewTextFileDialog { + return NewTextFileDialog() + } + } + +} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/RenameDialog.java b/app/src/main/java/com/snatik/storage/app/dialogs/RenameDialog.java deleted file mode 100644 index 63b6a07..0000000 --- a/app/src/main/java/com/snatik/storage/app/dialogs/RenameDialog.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.snatik.storage.app.dialogs; - -import android.app.Activity; -import android.app.AlertDialog; -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.EditText; - -import com.snatik.storage.Storage; -import com.snatik.storage.app.R; - -import java.io.File; - -/** - * Created by sromku on June, 2017. - */ -public class RenameDialog extends DialogFragment { - - private final static String PATH = "path"; - private DialogListener mListener; - private Storage mStorage; - - public static RenameDialog newInstance(String path) { - RenameDialog fragment = new RenameDialog(); - Bundle args = new Bundle(); - args.putString(PATH, path); - fragment.setArguments(args); - return fragment; - } - - public RenameDialog() { - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - mStorage = new Storage(getActivity()); - - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - - final View view = LayoutInflater.from(getActivity()) - .inflate(R.layout.rename_dialog, (ViewGroup) getView(), false); - - // if text is empty, disable the dialog positive button - final EditText currentNameText = (EditText) view.findViewById(R.id.current_name); - String path = getArguments().getString(PATH); - - final File file = mStorage.getFile(path); - currentNameText.setText(file.getName()); - final String parent = file.getParent(); - - final EditText newNameText = (EditText) view.findViewById(R.id.new_name); - newNameText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { - } - - @Override - public void afterTextChanged(Editable editable) { - ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(editable != null && - editable.length() > 0); - } - }); - - builder.setTitle(R.string.rename); - builder.setView(view); - builder.setPositiveButton(R.string.label_save, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - String newName = newNameText.getText().toString(); - String toPath = parent == null ? newName : parent + File.separator + newName; - mListener.onRename(file.getPath(), toPath); - } - }); - - final AlertDialog dialog = builder.create(); - view.post(new Runnable() { - @Override - public void run() { - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); - } - }); - dialog.setCancelable(false); - return dialog; - } - - public interface DialogListener { - void onRename(String fromPath, String toPath); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - mListener = (DialogListener) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement DialogListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - -} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/RenameDialog.kt b/app/src/main/java/com/snatik/storage/app/dialogs/RenameDialog.kt new file mode 100644 index 0000000..a81b464 --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/dialogs/RenameDialog.kt @@ -0,0 +1,99 @@ +package com.snatik.storage.app.dialogs + +import android.app.Activity +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import androidx.fragment.app.DialogFragment +import com.snatik.storage.Storage +import com.snatik.storage.app.R +import java.io.File + +/** + * Created by sromku on June, 2017. + */ +class RenameDialog : DialogFragment() { + private var mListener: DialogListener? = null + private var mStorage: Storage? = null + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + + mStorage = Storage(activity!!) + + val builder = AlertDialog.Builder(activity) + + val view = LayoutInflater.from(activity) + .inflate(R.layout.rename_dialog, view as ViewGroup?, false) + + // if text is empty, disable the dialog positive button + val currentNameText = view.findViewById(R.id.current_name) as EditText + val path = arguments?.getString(PATH) + + val file = mStorage!!.getFile(path!!) + currentNameText.setText(file.name) + val parent = file.parent + + val newNameText = view.findViewById(R.id.new_name) as EditText + newNameText.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + + override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + + override fun afterTextChanged(editable: Editable?) { + (dialog as AlertDialog).getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = editable != null && editable.length > 0 + } + }) + + builder.setTitle(R.string.rename) + builder.setView(view) + builder.setPositiveButton(R.string.label_save) { dialogInterface, i -> + val newName = newNameText.text.toString() + val toPath = if (parent == null) newName else parent + File.separator + newName + mListener!!.onRename(file.path, toPath) + } + + val dialog = builder.create() + view.post { dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false } + dialog.setCancelable(false) + return dialog + } + + interface DialogListener { + fun onRename(fromPath: String, toPath: String) + } + + override fun onAttach(activity: Activity) { + super.onAttach(activity) + try { + mListener = activity as DialogListener + } catch (e: ClassCastException) { + throw ClassCastException("$activity must implement DialogListener") + } + + } + + override fun onDetach() { + super.onDetach() + mListener = null + } + + companion object { + + private val PATH = "path" + + fun newInstance(path: String): RenameDialog { + val fragment = RenameDialog() + val args = Bundle() + args.putString(PATH, path) + fragment.arguments = args + return fragment + } + } + +} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/UpdateItemDialog.java b/app/src/main/java/com/snatik/storage/app/dialogs/UpdateItemDialog.java deleted file mode 100644 index 0cee461..0000000 --- a/app/src/main/java/com/snatik/storage/app/dialogs/UpdateItemDialog.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.snatik.storage.app.dialogs; - -import android.app.Activity; -import android.app.Dialog; -import android.app.DialogFragment; -import android.content.DialogInterface; -import android.os.Bundle; -import android.support.design.widget.BottomSheetDialog; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.snatik.storage.Storage; -import com.snatik.storage.app.R; - -public class UpdateItemDialog extends DialogFragment { - - private final static String PATH = "path"; - private DialogListener mListener; - - public static UpdateItemDialog newInstance(String path) { - UpdateItemDialog fragment = new UpdateItemDialog(); - Bundle args = new Bundle(); - args.putString(PATH, path); - fragment.setArguments(args); - return fragment; - } - - public UpdateItemDialog() { - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - - final Dialog dialog = new BottomSheetDialog(getActivity(), getTheme()); - final String path = getArguments().getString(PATH); - boolean isDirectory = new Storage(getActivity()).getFile(path).isDirectory(); - View view = LayoutInflater.from(getActivity()).inflate(R.layout.update_item_dialog, null); - dialog.setContentView(view); - dialog.setCancelable(true); - - // title - TextView title = (TextView) view.findViewById(R.id.title); - title.setText(isDirectory ? getString(R.string.folder_options) : getString(R.string.file_options)); - - View rename = view.findViewById(R.id.rename); - View delete = view.findViewById(R.id.delete); - View move = view.findViewById(R.id.move); - View copy = view.findViewById(R.id.copy); - - rename.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dialog.dismiss(); - mListener.onOptionClick(R.id.rename, path); - } - }); - - delete.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dialog.dismiss(); - mListener.onOptionClick(R.id.delete, path); - } - }); - - if (!isDirectory) { - move.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dialog.dismiss(); - mListener.onOptionClick(R.id.move, path); - } - }); - - copy.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - dialog.dismiss(); - mListener.onOptionClick(R.id.copy, path); - } - }); - } else { - move.setVisibility(View.GONE); - copy.setVisibility(View.GONE); - } - - // control dialog width on different devices - dialog.setOnShowListener(new DialogInterface.OnShowListener() { - @Override - public void onShow(DialogInterface dialogINterface) { - int width = (int) getResources().getDimension(R.dimen.bottom_sheet_dialog_width); - dialog.getWindow().setLayout( - width == 0 ? ViewGroup.LayoutParams.MATCH_PARENT : width, - ViewGroup.LayoutParams.MATCH_PARENT); - } - }); - - return dialog; - } - - public interface DialogListener { - void onOptionClick(int which, String path); - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - try { - mListener = (DialogListener) activity; - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement DialogListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - - -} diff --git a/app/src/main/java/com/snatik/storage/app/dialogs/UpdateItemDialog.kt b/app/src/main/java/com/snatik/storage/app/dialogs/UpdateItemDialog.kt new file mode 100644 index 0000000..63ce66d --- /dev/null +++ b/app/src/main/java/com/snatik/storage/app/dialogs/UpdateItemDialog.kt @@ -0,0 +1,105 @@ +package com.snatik.storage.app.dialogs + +import android.app.Activity +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.fragment.app.DialogFragment +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.snatik.storage.Storage +import com.snatik.storage.app.R + +class UpdateItemDialog : DialogFragment() { + private var mListener: DialogListener? = null + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + + val dialog = BottomSheetDialog(activity!!, theme) + val path = arguments?.getString(PATH) + val isDirectory = Storage(activity!!).getFile(path!!).isDirectory + val view = LayoutInflater.from(activity).inflate(R.layout.update_item_dialog, null) + dialog.setContentView(view) + dialog.setCancelable(true) + + // title + val title = view.findViewById(R.id.title) as TextView + title.text = if (isDirectory) getString(R.string.folder_options) else getString(R.string.file_options) + + val rename = view.findViewById(R.id.rename) + val delete = view.findViewById(R.id.delete) + val move = view.findViewById(R.id.move) + val copy = view.findViewById(R.id.copy) + + rename.setOnClickListener { + dialog.dismiss() + mListener!!.onOptionClick(R.id.rename, path) + } + + delete.setOnClickListener { + dialog.dismiss() + mListener!!.onOptionClick(R.id.delete, path) + } + + if (!isDirectory) { + move.setOnClickListener { + dialog.dismiss() + mListener!!.onOptionClick(R.id.move, path) + } + + copy.setOnClickListener { + dialog.dismiss() + mListener!!.onOptionClick(R.id.copy, path) + } + } else { + move.visibility = View.GONE + copy.visibility = View.GONE + } + + // control dialog width on different devices + dialog.setOnShowListener { + val width = resources.getDimension(R.dimen.bottom_sheet_dialog_width).toInt() + dialog.window!!.setLayout( + if (width == 0) ViewGroup.LayoutParams.MATCH_PARENT else width, + ViewGroup.LayoutParams.MATCH_PARENT) + } + + return dialog + } + + interface DialogListener { + fun onOptionClick(which: Int, path: String?) + } + + override fun onAttach(activity: Activity) { + super.onAttach(activity) + try { + mListener = activity as DialogListener + } catch (e: ClassCastException) { + throw ClassCastException("$activity must implement DialogListener") + } + + } + + override fun onDetach() { + super.onDetach() + mListener = null + } + + companion object { + + private val PATH = "path" + + fun newInstance(path: String): UpdateItemDialog { + val fragment = UpdateItemDialog() + val args = Bundle() + args.putString(PATH, path) + fragment.arguments = args + return fragment + } + } + + +} diff --git a/app/src/main/res/drawable/ic_file_primary_24dp.xml b/app/src/main/res/drawable/ic_file_primary_24dp.xml index 0fb747b..a666297 100644 --- a/app/src/main/res/drawable/ic_file_primary_24dp.xml +++ b/app/src/main/res/drawable/ic_file_primary_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_folder_primary_24dp.xml b/app/src/main/res/drawable/ic_folder_primary_24dp.xml index 5889397..9e40498 100644 --- a/app/src/main/res/drawable/ic_folder_primary_24dp.xml +++ b/app/src/main/res/drawable/ic_folder_primary_24dp.xml @@ -4,6 +4,6 @@ android:viewportHeight="24.0" android:viewportWidth="24.0"> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ddc2568..8d5ba91 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,33 +1,34 @@ - - + android:theme="@style/AppTheme.AppBarOverlay" + app:elevation="0dp"> - + app:popupTheme="@style/AppTheme.PopupOverlay" + app:titleTextColor="#000000" /> - + - + - + android:src="@drawable/ic_add_white_24dp" /> - + diff --git a/app/src/main/res/layout/activity_view_text_file.xml b/app/src/main/res/layout/activity_view_text_file.xml index 4c90e7f..9ff799d 100644 --- a/app/src/main/res/layout/activity_view_text_file.xml +++ b/app/src/main/res/layout/activity_view_text_file.xml @@ -5,19 +5,19 @@ android:layout_height="match_parent" android:orientation="vertical"> - - - + - @@ -27,8 +27,7 @@ android:layout_height="wrap_content" android:layout_margin="16dp" android:text="Moving: file.txt" - android:textColor="@android:color/white" - android:textSize="14sp"/> + android:textSize="14sp" /> + android:text="@string/decline" />