/
LocalFilesFragment.java
149 lines (130 loc) · 5.6 KB
/
LocalFilesFragment.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package com.filestack.android.internal;
import android.app.Activity;
import android.content.ClipData;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.OpenableColumns;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ImageViewCompat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import com.filestack.android.FsConstants;
import com.filestack.android.R;
import com.filestack.android.Selection;
import com.filestack.android.Theme;
import java.util.ArrayList;
import static android.app.Activity.RESULT_FIRST_USER;
/**
* Handles opening system file browser and processing results for local file selection.
*
* @see <a href="https://developer.android.com/guide/topics/providers/document-provider">
* https://developer.android.com/guide/topics/providers/document-provider</a>
*/
public class LocalFilesFragment extends Fragment implements View.OnClickListener {
private static final String ARG_ALLOW_MULTIPLE_FILES = "multipleFiles";
private static final int READ_REQUEST_CODE = RESULT_FIRST_USER;
private static final String ARG_THEME = "theme";
public static Fragment newInstance(boolean allowMultipleFiles, Theme theme) {
Fragment fragment = new LocalFilesFragment();
Bundle args = new Bundle();
args.putBoolean(ARG_ALLOW_MULTIPLE_FILES, allowMultipleFiles);
args.putParcelable(ARG_THEME, theme);
fragment.setArguments(args);
return fragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
View view = inflater.inflate(R.layout.filestack__fragment_local_files, container, false);
Button openGalleryButton = view.findViewById(R.id.select_gallery);
openGalleryButton.setOnClickListener(this);
Theme theme = getArguments().getParcelable(ARG_THEME);
ViewCompat.setBackgroundTintList(openGalleryButton, ColorStateList.valueOf(theme.getAccentColor()));
openGalleryButton.setTextColor(theme.getBackgroundColor());
ImageViewCompat.setImageTintList((ImageView) view.findViewById(R.id.icon), ColorStateList.valueOf(theme.getTextColor()));
return view;
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.action_logout).setVisible(false);
menu.findItem(R.id.action_toggle_list_grid).setVisible(false);
}
@Override
public void onClick(View view) {
startFilePicker();
}
private void startFilePicker() {
final Intent intent;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
boolean allowMultipleFiles = getArguments().getBoolean(ARG_ALLOW_MULTIPLE_FILES, true);
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, allowMultipleFiles);
intent.setType("*/*");
Intent launchIntent = getActivity().getIntent();
String[] mimeTypes = launchIntent.getStringArrayExtra(FsConstants.EXTRA_MIME_TYPES);
if (mimeTypes != null) {
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
}
startActivityForResult(intent, READ_REQUEST_CODE);
} else {
intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
startActivityForResult(intent, READ_REQUEST_CODE);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
ClipData clipData = resultData.getClipData();
ArrayList<Uri> uris = new ArrayList<>();
if (clipData != null) {
for (int i = 0; i < clipData.getItemCount(); i++) {
uris.add(clipData.getItemAt(i).getUri());
}
} else {
uris.add(resultData.getData());
}
for (Uri uri : uris) {
Selection selection = processUri(uri);
Util.getSelectionSaver().toggleItem(selection);
}
}
}
private Selection processUri(Uri uri) {
ContentResolver resolver = getActivity().getContentResolver();
Cursor cursor = null;
try {
cursor = resolver.query(uri, null, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
// We can't upload files without knowing the size
if (cursor.isNull(sizeIndex)) {
return null;
}
String name = cursor.getString(nameIndex);
int size = cursor.getInt(sizeIndex);
String mimeType = resolver.getType(uri);
return SelectionFactory.from(uri, size, mimeType, name);
} else {
return null;
}
} finally {
if (cursor != null) {
cursor.close();
}
}
}
}