Skip to content

Use native ShareActionProvider #391

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 6, 2017
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,18 @@

import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.support.v7.widget.ShareActionProvider;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
Expand Down Expand Up @@ -84,7 +81,7 @@ public int getCount() {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_media_detail_pager, container, false);
pager = (ViewPager) view.findViewById(R.id.mediaDetailsPager);
pager.setOnPageChangeListener(this);
pager.addOnPageChangeListener(this);

final MediaDetailAdapter adapter = new MediaDetailAdapter(getChildFragmentManager());

Expand Down Expand Up @@ -130,27 +127,25 @@ public boolean onOptionsItemSelected(MenuItem item) {
Media m = provider.getMediaAtPosition(pager.getCurrentItem());
switch(item.getItemId()) {
case R.id.menu_share_current_image:
// Share - this is just logs it, intent set in onCreateOptionsMenu, around line 252
EventLog.schema(CommonsApplication.EVENT_SHARE_ATTEMPT)
.param("username", app.getCurrentAccount().name)
.param("filename", m.getFilename())
.log();
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, m.getDisplayTitle() + " " + m.getDescriptionUrl());
startActivity(shareIntent);
return true;
case R.id.menu_browser_current_image:
// View in browser
Intent viewIntent = new Intent();
viewIntent.setAction(Intent.ACTION_VIEW);
viewIntent.setData(Uri.parse(m.getDescriptionUrl()));
startActivity(viewIntent);
return true;
case R.id.menu_download_current_image:
// Download
downloadMedia(m);
return true;
case R.id.menu_retry_current_image:
// Is this... sane? :)
// Retry
((ContributionsActivity)getActivity()).retryUpload(pager.getCurrentItem());
getActivity().getSupportFragmentManager().popBackStack();
return true;
Expand All @@ -168,69 +163,28 @@ public boolean onOptionsItemSelected(MenuItem item) {
* Start the media file downloading to the local SD card/storage.
* The file can then be opened in Gallery or other apps.
*
* @param m
* @param m Media file to download
*/
private void downloadMedia(Media m) {
String imageUrl = m.getImageUrl(),
fileName = m.getFilename();
// Strip 'File:' from beginning of filename, we really shouldn't store it
fileName = fileName.replaceFirst("^File:", "");
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
// Gingerbread DownloadManager has no HTTPS support...
// Download file over HTTP, there'll be no credentials
// sent so it should be safe-ish.
imageUrl = imageUrl.replaceFirst("^https://", "http://");
}
Uri imageUri = Uri.parse(imageUrl);

DownloadManager.Request req = new DownloadManager.Request(imageUri);
//These are not the image title and description fields, they are download descs for notifications
req.setDescription(getString(R.string.app_name));
req.setTitle(m.getDisplayTitle());
req.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// Modern Android updates the gallery automatically. Yay!
req.allowScanningByMediaScanner();

// On HC/ICS/JB we can leave the download notification up when complete.
// This allows folks to open the file directly in gallery viewer.
// But for some reason it fails on Honeycomb (Google TV). Sigh.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
}
}
// Modern Android updates the gallery automatically. Yay!
req.allowScanningByMediaScanner();
req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

// TODO: Check we have android.permission.WRITE_EXTERNAL_STORAGE
final DownloadManager manager = (DownloadManager)getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
final long downloadId = manager.enqueue(req);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
// For Gingerbread compatibility...
BroadcastReceiver onComplete = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Check if the download has completed...
Cursor c = manager.query(new DownloadManager.Query()
.setFilterById(downloadId)
.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL | DownloadManager.STATUS_FAILED)
);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
Log.d("Commons", "Download completed with status " + status);
if (status == DownloadManager.STATUS_SUCCESSFUL) {
// Force Gallery to index the new file
Uri mediaUri = Uri.parse("file://" + Environment.getExternalStorageDirectory());
getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, mediaUri));

// todo: show a persistent notification?
}
} else {
Log.d("Commons", "Couldn't get download status for some reason");
}
getActivity().unregisterReceiver(this);
}
};
getActivity().registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
}

@Override
Expand All @@ -249,6 +203,13 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.findItem(R.id.menu_share_current_image).setEnabled(true).setVisible(true);
menu.findItem(R.id.menu_download_current_image).setEnabled(true).setVisible(true);

// Set ShareActionProvider Intent
ShareActionProvider mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.menu_share_current_image));
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, m.getDisplayTitle() + " \n" + m.getDescriptionUrl());
mShareActionProvider.setShareIntent(shareIntent);

if(m instanceof Contribution) {
Contribution c = (Contribution)m;
switch(c.getState()) {
Expand All @@ -272,7 +233,6 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
break;
}
}
return;
}
}
}
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/res/layout/activity_contributions.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
Expand All @@ -12,6 +13,6 @@
android:id="@+id/contributionsListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
tools:layout="@layout/fragment_contributions" />

</FrameLayout>
58 changes: 29 additions & 29 deletions app/src/main/res/menu/fragment_image_detail.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,34 @@

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_share_current_image"
app:showAsAction="ifRoom|withText"
android:icon="@android:drawable/ic_menu_share"
android:title="@string/menu_share"
/>
<item android:id="@+id/menu_browser_current_image"
app:showAsAction="never"
android:icon="@android:drawable/ic_menu_view"
android:title="@string/menu_open_in_browser"
/>
<item android:id="@+id/menu_download_current_image"
app:showAsAction="never"
android:icon="@drawable/ic_menu_download"
android:title="@string/menu_download"
/>
<item android:id="@+id/menu_retry_current_image"
app:showAsAction="ifRoom|withText"
android:icon="@android:drawable/ic_menu_revert"
android:title="@string/menu_retry_upload"
android:visible="false"
android:enabled="false"
/>
<item android:id="@+id/menu_cancel_current_image"
app:showAsAction="never"
android:icon="@android:drawable/ic_menu_delete"
android:title="@string/menu_cancel_upload"
android:visible="false"
android:enabled="false"
/>
<item
android:id="@+id/menu_share_current_image"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
android:title="@string/menu_share"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/menu_browser_current_image"
android:icon="@android:drawable/ic_menu_view"
android:title="@string/menu_open_in_browser"
app:showAsAction="never" />
<item
android:id="@+id/menu_download_current_image"
android:icon="@drawable/ic_menu_download"
android:title="@string/menu_download"
app:showAsAction="never" />
<item
android:id="@+id/menu_retry_current_image"
android:enabled="false"
android:icon="@android:drawable/ic_menu_revert"
android:title="@string/menu_retry_upload"
android:visible="false"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/menu_cancel_current_image"
android:enabled="false"
android:icon="@android:drawable/ic_menu_delete"
android:title="@string/menu_cancel_upload"
android:visible="false"
app:showAsAction="never" />

</menu>