@@ -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