Skip to content

Commit ff4d395

Browse files
author
Leo Neat
committed
Adding permissions request
1 parent cce593b commit ff4d395

File tree

4 files changed

+147
-15
lines changed

4 files changed

+147
-15
lines changed

mediacontroller/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
xmlns:tools="http://schemas.android.com/tools"
1818
package="com.example.android.mediacontroller">
1919

20+
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
21+
2022
<uses-feature
2123
android:name="android.hardware.touchscreen"
2224
android:required="false" />

mediacontroller/src/main/java/com/example/android/mediacontroller/MediaAppControllerActivity.java

Lines changed: 142 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static androidx.media.MediaBrowserServiceCompat.BrowserRoot.EXTRA_SUGGESTED;
1919
import static java.util.Arrays.asList;
2020

21+
import android.Manifest;
2122
import android.app.Activity;
2223
import android.app.PendingIntent;
2324
import android.content.Context;
@@ -33,6 +34,7 @@
3334
import android.os.RemoteException;
3435
import android.support.v4.media.MediaBrowserCompat;
3536
import android.support.v4.media.MediaBrowserCompat.MediaItem;
37+
import android.support.v4.media.MediaDescriptionCompat;
3638
import android.support.v4.media.MediaMetadataCompat;
3739
import android.support.v4.media.RatingCompat;
3840
import android.support.v4.media.session.MediaControllerCompat;
@@ -61,6 +63,7 @@
6163
import androidx.appcompat.app.ActionBar;
6264
import androidx.appcompat.app.AppCompatActivity;
6365
import androidx.appcompat.widget.Toolbar;
66+
import androidx.core.app.ActivityCompat;
6467
import androidx.core.content.ContextCompat;
6568
import androidx.core.content.res.ResourcesCompat;
6669
import androidx.core.graphics.drawable.DrawableCompat;
@@ -73,6 +76,11 @@
7376

7477
import com.google.android.material.tabs.TabLayout;
7578

79+
import java.io.File;
80+
import java.io.FileNotFoundException;
81+
import java.io.FileOutputStream;
82+
import java.io.IOException;
83+
import java.io.PrintWriter;
7684
import java.util.ArrayList;
7785
import java.util.Collections;
7886
import java.util.Comparator;
@@ -117,6 +125,9 @@ public class MediaAppControllerActivity extends AppCompatActivity {
117125
private static final int MEDIA_ID_INDEX = 1;
118126
private static final int URI_INDEX = 2;
119127

128+
// Used for user storage permission request
129+
private static final int STORAGE_PERMISSION_REQUEST = 1;
130+
120131
private MediaAppDetails mMediaAppDetails;
121132
private MediaControllerCompat mController;
122133
private MediaBrowserCompat mBrowser;
@@ -153,7 +164,7 @@ public class MediaAppControllerActivity extends AppCompatActivity {
153164
* @return An Intent that can be used to start the Activity.
154165
*/
155166
public static Intent buildIntent(final Activity activity,
156-
final MediaAppDetails appDetails) {
167+
final MediaAppDetails appDetails) {
157168
final Intent intent = new Intent(activity, MediaAppControllerActivity.class);
158169
intent.putExtra(APP_DETAILS_EXTRA, appDetails);
159170
return intent;
@@ -167,6 +178,8 @@ protected void onCreate(Bundle savedInstanceState) {
167178
setSupportActionBar(toolbar);
168179
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
169180
toolbar.setNavigationOnClickListener(v -> finish());
181+
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
182+
ActivityCompat.requestPermissions(MediaAppControllerActivity.this, permissions, STORAGE_PERMISSION_REQUEST);
170183

171184
mViewPager = findViewById(R.id.view_pager);
172185
mInputTypeView = findViewById(R.id.input_type);
@@ -248,20 +261,20 @@ public Object instantiateItem(@NonNull ViewGroup container, int position) {
248261
browseTreeList.setHasFixedSize(true);
249262
browseTreeList.setAdapter(mBrowseMediaItemsAdapter);
250263
mBrowseMediaItemsAdapter.init(findViewById(R.id.media_browse_tree_top),
251-
findViewById(R.id.media_browse_tree_up));
264+
findViewById(R.id.media_browse_tree_up), findViewById(R.id.media_browse_tree_save));
252265

253266
final RecyclerView browseTreeListExtraSuggested = findViewById(R.id.media_items_list_extra_suggested);
254267
browseTreeListExtraSuggested.setLayoutManager(new LinearLayoutManager(this));
255268
browseTreeListExtraSuggested.setHasFixedSize(true);
256269
browseTreeListExtraSuggested.setAdapter(mBrowseMediaItemsExtraSuggestedAdapter);
257270
mBrowseMediaItemsExtraSuggestedAdapter.init(findViewById(R.id.media_browse_tree_top_extra_suggested),
258-
findViewById(R.id.media_browse_tree_up_extra_suggested));
271+
findViewById(R.id.media_browse_tree_up_extra_suggested), findViewById(R.id.media_browse_tree_save));
259272

260273
final RecyclerView searchItemsList = findViewById(R.id.search_items_list);
261274
searchItemsList.setLayoutManager(new LinearLayoutManager(this));
262275
searchItemsList.setHasFixedSize(true);
263276
searchItemsList.setAdapter(mSearchMediaItemsAdapter);
264-
mSearchMediaItemsAdapter.init(null, null);
277+
mSearchMediaItemsAdapter.init(null, null, null);
265278

266279
findViewById(R.id.search_button).setOnClickListener(v -> {
267280
CharSequence queryText = ((TextView) findViewById(R.id.search_query)).getText();
@@ -271,6 +284,34 @@ public Object instantiateItem(@NonNull ViewGroup container, int position) {
271284
});
272285
}
273286

287+
288+
289+
@Override
290+
public void onRequestPermissionsResult(int requestCode,
291+
@NonNull String[] permissions,
292+
@NonNull int[] grantResults)
293+
{
294+
super.onRequestPermissionsResult(requestCode,
295+
permissions,
296+
grantResults);
297+
298+
if (requestCode == STORAGE_PERMISSION_REQUEST) {
299+
if (grantResults.length > 0
300+
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
301+
Toast.makeText(getApplicationContext(),
302+
"Storage Permission Granted, can save browse tree.",
303+
Toast.LENGTH_SHORT)
304+
.show();
305+
}
306+
else {
307+
Toast.makeText(getApplicationContext(),
308+
"Storage Permission Denied, can not save browse tree to file.",
309+
Toast.LENGTH_SHORT)
310+
.show();
311+
}
312+
}
313+
}
314+
274315
@Override
275316
protected void onDestroy() {
276317
if (mController != null) {
@@ -786,7 +827,7 @@ private void showActions(@PlaybackStateCompat.Actions long actions) {
786827
}
787828

788829
private boolean actionSupported(@PlaybackStateCompat.Actions long actions,
789-
@PlaybackStateCompat.Actions long checkAction) {
830+
@PlaybackStateCompat.Actions long checkAction) {
790831
return ((actions & checkAction) != 0);
791832
}
792833

@@ -813,8 +854,8 @@ private static class AudioFocusHelper
813854
private final Spinner mFocusTypeSpinner;
814855

815856
private AudioFocusHelper(@NonNull Context context,
816-
@NonNull ToggleButton focusToggleButton,
817-
@NonNull Spinner focusTypeSpinner) {
857+
@NonNull ToggleButton focusToggleButton,
858+
@NonNull Spinner focusTypeSpinner) {
818859

819860
mAudioManager = (AudioManager) context.getSystemService(AUDIO_SERVICE);
820861
mToggleButton = focusToggleButton;
@@ -932,7 +973,7 @@ public int getItemCount() {
932973
}
933974

934975
void setActions(MediaControllerCompat controller,
935-
List<PlaybackStateCompat.CustomAction> actions) {
976+
List<PlaybackStateCompat.CustomAction> actions) {
936977
mControls = controller.getTransportControls();
937978
try {
938979
mMediaAppResources = getPackageManager()
@@ -994,9 +1035,9 @@ private static abstract class ModeHelper implements AdapterView.OnItemSelectedLi
9941035
private final List<Integer> modes;
9951036

9961037
ModeHelper(ViewGroup container,
997-
@IdRes int stateSpinnerView,
998-
@IdRes int iconImageView,
999-
List<Integer> modes) {
1038+
@IdRes int stateSpinnerView,
1039+
@IdRes int iconImageView,
1040+
List<Integer> modes) {
10001041
this.context = container.getContext();
10011042
this.spinner = container.findViewById(stateSpinnerView);
10021043
this.icon = container.findViewById(iconImageView);
@@ -1108,7 +1149,7 @@ private class BrowseMediaItemsAdapter extends
11081149
new MediaBrowserCompat.SubscriptionCallback() {
11091150
@Override
11101151
public void onChildrenLoaded(@NonNull String parentId,
1111-
@NonNull List<MediaItem> children) {
1152+
@NonNull List<MediaItem> children) {
11121153
updateItemsEmptyIfNull(children);
11131154
}
11141155
};
@@ -1206,7 +1247,7 @@ void updateItems(List items) {
12061247
* Assigns click handlers to the buttons if provided for moving to the top of the tree or
12071248
* for moving up one level in the tree.
12081249
*/
1209-
void init(View topButtonView, View upButtonView) {
1250+
void init(View topButtonView, View upButtonView, View saveButtonView) {
12101251
if (topButtonView != null) {
12111252
topButtonView.setOnClickListener(v -> {
12121253
if (mNodes.size() > 1) {
@@ -1228,6 +1269,92 @@ void init(View topButtonView, View upButtonView) {
12281269
}
12291270
});
12301271
}
1272+
if (saveButtonView != null) {
1273+
notifyDataSetChanged();
1274+
saveButtonView.setOnClickListener(
1275+
v -> {
1276+
1277+
if (mNodes.isEmpty()) {
1278+
Toast toast =
1279+
Toast.makeText(
1280+
getApplicationContext(), "List Empty, nothing saved! ", Toast.LENGTH_LONG);
1281+
toast.setMargin(50, 50);
1282+
toast.show();
1283+
return;
1284+
}
1285+
File root = android.os.Environment.getExternalStorageDirectory();
1286+
try {
1287+
String dirs_path = root.getAbsolutePath() + "/Temp/";
1288+
File dirs = new File(dirs_path);
1289+
File file = new File(dirs.getAbsolutePath(), "_BrowseTreeContent.txt");
1290+
FileOutputStream f = new FileOutputStream(file);
1291+
PrintWriter pw = new PrintWriter(f);
1292+
// We print the file path at the beginning of the file so that we can use it
1293+
// to pull the file from platform to local computer.
1294+
1295+
pw.println(file.toString());
1296+
if(mItems == null){
1297+
Toast toast =
1298+
Toast.makeText(
1299+
getApplicationContext(),
1300+
"No media items found, could not save tree.",
1301+
Toast.LENGTH_LONG);
1302+
toast.setMargin(50, 50);
1303+
toast.show();
1304+
return;
1305+
}
1306+
1307+
for (MediaBrowserCompat.MediaItem item : mItems) {
1308+
if(item != null) {
1309+
Log.i(TAG, "Logging media item");
1310+
MediaDescriptionCompat descriptionCompat = item.getDescription();
1311+
if (descriptionCompat != null) {
1312+
String infoStr = "Title:";
1313+
infoStr += descriptionCompat.getTitle() != null
1314+
? descriptionCompat.getTitle().toString()
1315+
: "NAN";
1316+
1317+
infoStr += ",Subtitle:";
1318+
infoStr += descriptionCompat.getSubtitle() != null
1319+
? descriptionCompat.getSubtitle().toString()
1320+
: "NAN";
1321+
1322+
infoStr += ",MediaId:";
1323+
infoStr += descriptionCompat.getMediaId() != null
1324+
? descriptionCompat.getMediaId().toString()
1325+
: "NAN";
1326+
infoStr += ",Uri:";
1327+
infoStr += descriptionCompat.getMediaUri() != null
1328+
? descriptionCompat.getMediaUri().toString()
1329+
: "NAN";
1330+
infoStr += ",Description:";
1331+
infoStr += descriptionCompat.getDescription() != null
1332+
? descriptionCompat.getDescription().toString()
1333+
: "NAN";
1334+
1335+
pw.println(infoStr);
1336+
}
1337+
}
1338+
}
1339+
1340+
pw.flush();
1341+
pw.close();
1342+
f.close();
1343+
Toast toast =
1344+
Toast.makeText(
1345+
getApplicationContext(),
1346+
"MediaItems saved to " + file.getAbsolutePath(),
1347+
Toast.LENGTH_LONG);
1348+
toast.setMargin(50, 50);
1349+
toast.show();
1350+
} catch (FileNotFoundException e) {
1351+
e.printStackTrace();
1352+
} catch (IOException e) {
1353+
e.printStackTrace();
1354+
}
1355+
});
1356+
}
1357+
12311358
}
12321359

12331360
protected void subscribe() {
@@ -1287,7 +1414,7 @@ protected void subscribe() {
12871414
mBrowser.search(getCurrentNode(), null, new MediaBrowserCompat.SearchCallback() {
12881415
@Override
12891416
public void onSearchResult(@NonNull String query, Bundle extras,
1290-
@NonNull List<MediaBrowserCompat.MediaItem> items) {
1417+
@NonNull List<MediaBrowserCompat.MediaItem> items) {
12911418
if (query.equals(getCurrentNode())) {
12921419
updateItemsEmptyIfNull(items);
12931420
}
@@ -1311,4 +1438,4 @@ protected void unsubscribe() {
13111438
super.unsubscribe();
13121439
}
13131440
}
1314-
}
1441+
}

mediacontroller/src/main/res/layout/media_browse_tree.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
android:layout_height="wrap_content"
4545
android:text="@string/media_browse_tree_up" />
4646

47+
<Button android:id="@+id/media_browse_tree_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/media_browse_tree_save"/>
48+
4749
LinearLayout>
4850

4951
<TextView

mediacontroller/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
<string name="media_no_browser">No Browserstring>
120120
<string name="media_browse_tree_loading">Loading…string>
121121
<string name="media_browse_tree_empty">Empty.string>
122+
<string name="media_browse_tree_save">Save to filestring>
122123
<string name="search_media">Searchstring>
123124

124125
<string name="rating_thumb_up">Thumb Upstring>

0 commit comments

Comments
 (0)