Skip to content

Commit 3c2be4a

Browse files
authored
Update MainActivity.java
1 parent da3838a commit 3c2be4a

1 file changed

Lines changed: 58 additions & 16 deletions

File tree

app/src/main/java/com/example/rootfilepicker/MainActivity.java

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ public class MainActivity extends AppCompatActivity {
3131
private final List<FileItem> fileItems = new ArrayList<>();
3232
private final List<FileItem> selectedItems = new ArrayList<>();
3333
private final String fileFilter = ""; // ví dụ: ".txt"
34-
private List<String> extensionFilter = new ArrayList<>();
35-
34+
3635
@Override
3736
protected void onCreate(Bundle savedInstanceState) {
3837
Intent intent = getIntent();
@@ -96,7 +95,11 @@ protected void onCreate(Bundle savedInstanceState) {
9695

9796
btnSave.setOnClickListener(v -> saveSelectedPaths());
9897

99-
98+
if (checkPermission()) {
99+
initFilePicker();
100+
} else {
101+
requestPermission();
102+
}
100103
}
101104

102105
private void initFilePicker() {
@@ -105,19 +108,32 @@ private void initFilePicker() {
105108
}
106109

107110
private void loadDirectory(File dir) {
108-
currentDirectory = dir;
109-
tvCurrentPath.setText(dir.getAbsolutePath());
110-
File[] files = dir.listFiles();
111-
fileItems.clear();
112-
if (files != null) {
113-
Arrays.sort(files, Comparator.comparing(File::getName));
114-
for (File f : files) {
115-
if (!fileFilter.isEmpty() && f.isFile() && !f.getName().endsWith(fileFilter)) continue;
116-
fileItems.add(new FileItem(f));
111+
currentDirectory = dir;
112+
tvCurrentPath.setText(dir.getAbsolutePath());
113+
File[] files = dir.listFiles();
114+
fileItems.clear();
115+
if (files != null) {
116+
Arrays.sort(files, (f1, f2) -> {
117+
if (f1.isDirectory() && !f2.isDirectory()) return -1;
118+
if (!f1.isDirectory() && f2.isDirectory()) return 1;
119+
return f1.getName().compareToIgnoreCase(f2.getName());
120+
});
121+
for (File f : files) {
122+
if (!fileFilter.isEmpty() && f.isFile()) {
123+
boolean matched = false;
124+
for (String ext : fileFilter) {
125+
if (f.getName().toLowerCase().endsWith(ext)) {
126+
matched = true;
127+
break;
128+
}
129+
}
130+
if (!matched) continue;
117131
}
132+
fileItems.add(new FileItem(f));
118133
}
119-
adapter.notifyDataSetChanged();
120134
}
135+
adapter.notifyDataSetChanged();
136+
}
121137

122138
private void saveSelectedPaths() {
123139
File outFile = new File(Environment.getExternalStorageDirectory(), "list.txt");
@@ -134,12 +150,38 @@ private void saveSelectedPaths() {
134150
writer.write(item.getFile().getAbsolutePath() + "\n");
135151
}
136152
}
137-
super.onBackPressed();
153+
Toast.makeText(this, "Đã lưu tại: " + outFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
154+
} catch (IOException e) {
155+
Toast.makeText(this, "Lỗi lưu file", Toast.LENGTH_SHORT).show();
138156
}
139157
}
140-
}
141-
142158

159+
private boolean checkPermission() {
160+
return ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
161+
}
143162

163+
private void requestPermission() {
164+
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
165+
}
144166

167+
@Override
168+
public void onBackPressed() {
169+
if (currentDirectory != null && !currentDirectory.getAbsolutePath().equals("/")) {
170+
loadDirectory(currentDirectory.getParentFile());
171+
} else {
172+
saveSelectedPaths();
173+
super.onBackPressed();
174+
}
175+
}
145176

177+
@Override
178+
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
179+
if (requestCode == PERMISSION_REQUEST_CODE) {
180+
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
181+
initFilePicker();
182+
} else {
183+
Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show();
184+
}
185+
}
186+
}
187+
}

0 commit comments

Comments
 (0)