Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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.+'
}
7 changes: 5 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.csc.lesson5">
package="com.csc.malinovsky239.filemanager">

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<activity android:name="MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
12 changes: 0 additions & 12 deletions app/src/main/java/com/csc/lesson5/MainActivity.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<FileListAdapter.ItemViewHolder> {

private final Context context;
List<FileSystemItem> 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;
}
});
}
}

}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
Binary file added app/src/main/res/drawable-hdpi/file.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-hdpi/folder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-mdpi/file.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-mdpi/folder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-xhdpi/file.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-xhdpi/folder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-xxhdpi/file.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/src/main/res/drawable-xxhdpi/folder.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
42 changes: 42 additions & 0 deletions app/src/main/res/layout/item.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android.support.v7.cardview="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">

<android.support.v7.widget.CardView
android:id="@+id/item"
android:layout_width="match_parent"
android:layout_height="match_parent"
android.support.v7.cardview:cardBackgroundColor="#ffcccccc"
android.support.v7.cardview:cardCornerRadius="10dp">

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp" />

<TextView
android:id="@+id/filename"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_toEndOf="@+id/icon"
android:layout_toRightOf="@+id/icon"
android:textSize="15sp" />

</RelativeLayout>

</android.support.v7.widget.CardView>

</LinearLayout>
12 changes: 12 additions & 0 deletions app/src/main/res/layout/main_activity.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.v7.widget.RecyclerView
android:id="@+id/file_list"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</LinearLayout>
7 changes: 6 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
<resources>
<string name="app_name">lesson5</string>
<string name="app_name">File Manager</string>
<string name="rename_button">Rename</string>
<string name="delete_button">Delete</string>
<string name="root">/storage/emulated/0</string>
<string name="cancel_button">Cancel</string>
<string name="OK_button">OK</string>
</resources>
Loading