diff --git a/app/build.gradle b/app/build.gradle index 6d6317e..7004d4b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,4 +21,6 @@ android { dependencies { compile 'com.android.support:appcompat-v7:23.2.1' + compile 'com.android.support:cardview-v7:21.0.+' + compile 'com.android.support:recyclerview-v7:21.0.+' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6296c85..985cc04 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,9 @@ + package="com.csc.malinovsky239.filemanager"> + + + - + diff --git a/app/src/main/java/com/csc/lesson5/MainActivity.java b/app/src/main/java/com/csc/lesson5/MainActivity.java deleted file mode 100644 index 613d372..0000000 --- a/app/src/main/java/com/csc/lesson5/MainActivity.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.csc.lesson5; - -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; - -public class MainActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } -} diff --git a/app/src/main/java/com/csc/malinovsky239/filemanager/FileListAdapter.java b/app/src/main/java/com/csc/malinovsky239/filemanager/FileListAdapter.java new file mode 100644 index 0000000..60b7229 --- /dev/null +++ b/app/src/main/java/com/csc/malinovsky239/filemanager/FileListAdapter.java @@ -0,0 +1,171 @@ +package com.csc.malinovsky239.filemanager; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.os.Environment; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class FileListAdapter extends RecyclerView.Adapter { + + private final Context context; + List items = new ArrayList<>(); + private String currentWorkingDirectory; + private final OnItemClickListener listener = new OnItemClickListener() { + @Override + public void onItemClick(FileSystemItem item) { + if (item.isFolder()) { + if (item.getTitle().equals("...")) { + currentWorkingDirectory = currentWorkingDirectory.substring(0, currentWorkingDirectory.lastIndexOf('/')); + } else { + currentWorkingDirectory = new File(new File(currentWorkingDirectory), item.getTitle()).toString(); + } + clear(); + File[] listFiles = (new File(currentWorkingDirectory)).listFiles(); + for (File file : listFiles) { + addItem(file.getName(), file.isDirectory()); + } + notifyDataSetChanged(); + } else { + Intent myIntent = new Intent(android.content.Intent.ACTION_VIEW); + File file = new File(currentWorkingDirectory); + File file2 = new File(file, item.getTitle()); + String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file2).toString()); + String mimeType = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension); + myIntent.setDataAndType(Uri.fromFile(file2), mimeType); + context.startActivity(myIntent); + } + } + + @Override + public void onItemLongClick(final FileSystemItem item) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle("") + .setMessage("") + .setPositiveButton(R.string.rename_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.rename_button); + final EditText input = new EditText(context); + builder.setView(input); + + builder.setPositiveButton(R.string.OK_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String newName = input.getText().toString(); + File from = new File(currentWorkingDirectory, item.getTitle()); + File to = new File(currentWorkingDirectory, newName); + if (from.renameTo(to)) { + item.setTitle(newName); + notifyDataSetChanged(); + } + } + }); + builder.setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + + builder.show(); + } + }) + .setNeutralButton(R.string.delete_button, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + File file = new File(currentWorkingDirectory, item.getTitle()); + if (file.delete()) { + items.remove(item); + notifyDataSetChanged(); + } + } + }); + AlertDialog alert = builder.create(); + alert.show(); + } + }; + + public FileListAdapter(Context context) { + this.context = context; + currentWorkingDirectory = Environment.getExternalStorageDirectory().toString(); + } + + public void clear() { + items.clear(); + if (!currentWorkingDirectory.equals(context.getString(R.string.root))) { + addItem("...", true); + } + } + + public void addItem(String title, boolean isFolder) { + items.add(new FileSystemItem(title, isFolder)); + } + + @Override + public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); + v.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.MATCH_PARENT)); + return new ItemViewHolder(v); + } + + @Override + public void onBindViewHolder(ItemViewHolder holder, int position) { + holder.filename.setText(items.get(position).getTitle()); + if (items.get(position).isFolder()) { + holder.icon.setImageResource(R.drawable.folder); + } else { + holder.icon.setImageResource(R.drawable.file); + } + holder.bind(items.get(position), listener); + } + + @Override + public int getItemCount() { + return items.size(); + } + + public class ItemViewHolder extends RecyclerView.ViewHolder { + CardView item; + TextView filename; + ImageView icon; + + ItemViewHolder(View itemView) { + super(itemView); + item = (CardView) itemView.findViewById(R.id.item); + filename = (TextView) itemView.findViewById(R.id.filename); + icon = (ImageView) itemView.findViewById(R.id.icon); + } + + public void bind(final FileSystemItem fileSystemItem, final OnItemClickListener listener) { + itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + listener.onItemClick(fileSystemItem); + } + }); + itemView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + listener.onItemLongClick(fileSystemItem); + return true; + } + }); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/csc/malinovsky239/filemanager/FileSystemItem.java b/app/src/main/java/com/csc/malinovsky239/filemanager/FileSystemItem.java new file mode 100644 index 0000000..ff78d91 --- /dev/null +++ b/app/src/main/java/com/csc/malinovsky239/filemanager/FileSystemItem.java @@ -0,0 +1,26 @@ +package com.csc.malinovsky239.filemanager; + +/** + * Created by malinovsky239 on 28.03.2016. + */ +public class FileSystemItem { + private String title; + private boolean isFolder; + + FileSystemItem(String title, boolean isFolder) { + this.title = title; + this.isFolder = isFolder; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public boolean isFolder() { + return isFolder; + } +} diff --git a/app/src/main/java/com/csc/malinovsky239/filemanager/MainActivity.java b/app/src/main/java/com/csc/malinovsky239/filemanager/MainActivity.java new file mode 100644 index 0000000..3fb6297 --- /dev/null +++ b/app/src/main/java/com/csc/malinovsky239/filemanager/MainActivity.java @@ -0,0 +1,75 @@ +package com.csc.malinovsky239.filemanager; + +import android.Manifest; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; + +import java.io.File; + +public class MainActivity extends AppCompatActivity { + + final int READ_WRITE_PERMISSION_CODE = 200; + private RecyclerView fileList; + private FileListAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.main_activity); + fileList = (RecyclerView) findViewById(R.id.file_list); + LinearLayoutManager llm = new LinearLayoutManager(this); + fileList.setLayoutManager(llm); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + if (ContextCompat.checkSelfPermission(this, + Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, + Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + if (!ActivityCompat.shouldShowRequestPermissionRationale(this, + Manifest.permission.READ_EXTERNAL_STORAGE) || !ActivityCompat.shouldShowRequestPermissionRationale(this, + Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, + READ_WRITE_PERMISSION_CODE); + } + } else { + initializeAdapter(); + } + } else { + initializeAdapter(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + switch (requestCode) { + case READ_WRITE_PERMISSION_CODE: { + if (grantResults.length == 2 + && grantResults[0] == PackageManager.PERMISSION_GRANTED + && grantResults[1] == PackageManager.PERMISSION_GRANTED) { + initializeAdapter(); + } + } + } + } + + private void initializeAdapter() { + adapter = new FileListAdapter(this); + File[] listFiles = Environment.getExternalStorageDirectory().listFiles(); + for (File file : listFiles) { + adapter.addItem(file.getName(), file.isDirectory()); + } + fileList.setAdapter(adapter); + adapter.notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/com/csc/malinovsky239/filemanager/OnItemClickListener.java b/app/src/main/java/com/csc/malinovsky239/filemanager/OnItemClickListener.java new file mode 100644 index 0000000..93450ed --- /dev/null +++ b/app/src/main/java/com/csc/malinovsky239/filemanager/OnItemClickListener.java @@ -0,0 +1,10 @@ +package com.csc.malinovsky239.filemanager; + +/** + * Created by malinovsky239 on 28.03.2016. + */ +public interface OnItemClickListener { + void onItemClick(FileSystemItem item); + + void onItemLongClick(FileSystemItem item); +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/file.png b/app/src/main/res/drawable-hdpi/file.png new file mode 100644 index 0000000..d783b3b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/file.png differ diff --git a/app/src/main/res/drawable-hdpi/folder.png b/app/src/main/res/drawable-hdpi/folder.png new file mode 100644 index 0000000..05adea9 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/folder.png differ diff --git a/app/src/main/res/drawable-mdpi/file.png b/app/src/main/res/drawable-mdpi/file.png new file mode 100644 index 0000000..faaad7e Binary files /dev/null and b/app/src/main/res/drawable-mdpi/file.png differ diff --git a/app/src/main/res/drawable-mdpi/folder.png b/app/src/main/res/drawable-mdpi/folder.png new file mode 100644 index 0000000..1a36f36 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/folder.png differ diff --git a/app/src/main/res/drawable-xhdpi/file.png b/app/src/main/res/drawable-xhdpi/file.png new file mode 100644 index 0000000..947343f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/file.png differ diff --git a/app/src/main/res/drawable-xhdpi/folder.png b/app/src/main/res/drawable-xhdpi/folder.png new file mode 100644 index 0000000..8667a8b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/folder.png differ diff --git a/app/src/main/res/drawable-xxhdpi/file.png b/app/src/main/res/drawable-xxhdpi/file.png new file mode 100644 index 0000000..d74428b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/file.png differ diff --git a/app/src/main/res/drawable-xxhdpi/folder.png b/app/src/main/res/drawable-xxhdpi/folder.png new file mode 100644 index 0000000..997003f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/folder.png differ diff --git a/app/src/main/res/layout/item.xml b/app/src/main/res/layout/item.xml new file mode 100644 index 0000000..2533740 --- /dev/null +++ b/app/src/main/res/layout/item.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml new file mode 100644 index 0000000..25b679d --- /dev/null +++ b/app/src/main/res/layout/main_activity.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e2827ac..9b817a5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,8 @@ - lesson5 + File Manager + Rename + Delete + /storage/emulated/0 + Cancel + OK diff --git a/build.gradle b/build.gradle index e0b366a..9418a49 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,6 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:1.5.0' - // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }