Skip to content

Commit c04f6fc

Browse files
authored
Merge pull request #391 from domdomegg/share_button
Use native ShareActionProvider
2 parents b190f7f + 3203932 commit c04f6fc

File tree

3 files changed

+50
-89
lines changed

3 files changed

+50
-89
lines changed

app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java

+19-59
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,18 @@
22

33
import android.annotation.SuppressLint;
44
import android.app.DownloadManager;
5-
import android.content.BroadcastReceiver;
65
import android.content.Context;
76
import android.content.Intent;
8-
import android.content.IntentFilter;
9-
import android.database.Cursor;
107
import android.database.DataSetObserver;
118
import android.net.Uri;
12-
import android.os.Build;
139
import android.os.Bundle;
1410
import android.os.Environment;
1511
import android.support.v4.app.Fragment;
1612
import android.support.v4.app.FragmentManager;
1713
import android.support.v4.app.FragmentStatePagerAdapter;
14+
import android.support.v4.view.MenuItemCompat;
1815
import android.support.v4.view.ViewPager;
19-
import android.util.Log;
16+
import android.support.v7.widget.ShareActionProvider;
2017
import android.view.LayoutInflater;
2118
import android.view.Menu;
2219
import android.view.MenuInflater;
@@ -84,7 +81,7 @@ public int getCount() {
8481
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
8582
View view = inflater.inflate(R.layout.fragment_media_detail_pager, container, false);
8683
pager = (ViewPager) view.findViewById(R.id.mediaDetailsPager);
87-
pager.setOnPageChangeListener(this);
84+
pager.addOnPageChangeListener(this);
8885

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

@@ -130,27 +127,25 @@ public boolean onOptionsItemSelected(MenuItem item) {
130127
Media m = provider.getMediaAtPosition(pager.getCurrentItem());
131128
switch(item.getItemId()) {
132129
case R.id.menu_share_current_image:
130+
// Share - this is just logs it, intent set in onCreateOptionsMenu, around line 252
133131
EventLog.schema(CommonsApplication.EVENT_SHARE_ATTEMPT)
134132
.param("username", app.getCurrentAccount().name)
135133
.param("filename", m.getFilename())
136134
.log();
137-
Intent shareIntent = new Intent();
138-
shareIntent.setAction(Intent.ACTION_SEND);
139-
shareIntent.setType("text/plain");
140-
shareIntent.putExtra(Intent.EXTRA_TEXT, m.getDisplayTitle() + " " + m.getDescriptionUrl());
141-
startActivity(shareIntent);
142135
return true;
143136
case R.id.menu_browser_current_image:
137+
// View in browser
144138
Intent viewIntent = new Intent();
145139
viewIntent.setAction(Intent.ACTION_VIEW);
146140
viewIntent.setData(Uri.parse(m.getDescriptionUrl()));
147141
startActivity(viewIntent);
148142
return true;
149143
case R.id.menu_download_current_image:
144+
// Download
150145
downloadMedia(m);
151146
return true;
152147
case R.id.menu_retry_current_image:
153-
// Is this... sane? :)
148+
// Retry
154149
((ContributionsActivity)getActivity()).retryUpload(pager.getCurrentItem());
155150
getActivity().getSupportFragmentManager().popBackStack();
156151
return true;
@@ -168,69 +163,28 @@ public boolean onOptionsItemSelected(MenuItem item) {
168163
* Start the media file downloading to the local SD card/storage.
169164
* The file can then be opened in Gallery or other apps.
170165
*
171-
* @param m
166+
* @param m Media file to download
172167
*/
173168
private void downloadMedia(Media m) {
174169
String imageUrl = m.getImageUrl(),
175170
fileName = m.getFilename();
176171
// Strip 'File:' from beginning of filename, we really shouldn't store it
177172
fileName = fileName.replaceFirst("^File:", "");
178-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
179-
// Gingerbread DownloadManager has no HTTPS support...
180-
// Download file over HTTP, there'll be no credentials
181-
// sent so it should be safe-ish.
182-
imageUrl = imageUrl.replaceFirst("^https://", "http://");
183-
}
184173
Uri imageUri = Uri.parse(imageUrl);
185174

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

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

185+
// TODO: Check we have android.permission.WRITE_EXTERNAL_STORAGE
203186
final DownloadManager manager = (DownloadManager)getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
204187
final long downloadId = manager.enqueue(req);
205-
206-
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
207-
// For Gingerbread compatibility...
208-
BroadcastReceiver onComplete = new BroadcastReceiver() {
209-
@Override
210-
public void onReceive(Context context, Intent intent) {
211-
// Check if the download has completed...
212-
Cursor c = manager.query(new DownloadManager.Query()
213-
.setFilterById(downloadId)
214-
.setFilterByStatus(DownloadManager.STATUS_SUCCESSFUL | DownloadManager.STATUS_FAILED)
215-
);
216-
if (c.moveToFirst()) {
217-
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
218-
Log.d("Commons", "Download completed with status " + status);
219-
if (status == DownloadManager.STATUS_SUCCESSFUL) {
220-
// Force Gallery to index the new file
221-
Uri mediaUri = Uri.parse("file://" + Environment.getExternalStorageDirectory());
222-
getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, mediaUri));
223-
224-
// todo: show a persistent notification?
225-
}
226-
} else {
227-
Log.d("Commons", "Couldn't get download status for some reason");
228-
}
229-
getActivity().unregisterReceiver(this);
230-
}
231-
};
232-
getActivity().registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
233-
}
234188
}
235189

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

206+
// Set ShareActionProvider Intent
207+
ShareActionProvider mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.menu_share_current_image));
208+
Intent shareIntent = new Intent(Intent.ACTION_SEND);
209+
shareIntent.setType("text/plain");
210+
shareIntent.putExtra(Intent.EXTRA_TEXT, m.getDisplayTitle() + " \n" + m.getDescriptionUrl());
211+
mShareActionProvider.setShareIntent(shareIntent);
212+
252213
if(m instanceof Contribution) {
253214
Contribution c = (Contribution)m;
254215
switch(c.getState()) {
@@ -272,7 +233,6 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
272233
break;
273234
}
274235
}
275-
return;
276236
}
277237
}
278238
}

app/src/main/res/layout/activity_contributions.xml

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools"
34
android:layout_width="match_parent"
45
android:layout_height="match_parent"
56
android:orientation="horizontal"
@@ -12,6 +13,6 @@
1213
android:id="@+id/contributionsListFragment"
1314
android:layout_width="match_parent"
1415
android:layout_height="match_parent"
15-
/>
16+
tools:layout="@layout/fragment_contributions" />
1617

1718
</FrameLayout>

app/src/main/res/menu/fragment_image_detail.xml

+29-29
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,34 @@
22

33
<menu xmlns:android="http://schemas.android.com/apk/res/android"
44
xmlns:app="http://schemas.android.com/apk/res-auto">
5-
<item android:id="@+id/menu_share_current_image"
6-
app:showAsAction="ifRoom|withText"
7-
android:icon="@android:drawable/ic_menu_share"
8-
android:title="@string/menu_share"
9-
/>
10-
<item android:id="@+id/menu_browser_current_image"
11-
app:showAsAction="never"
12-
android:icon="@android:drawable/ic_menu_view"
13-
android:title="@string/menu_open_in_browser"
14-
/>
15-
<item android:id="@+id/menu_download_current_image"
16-
app:showAsAction="never"
17-
android:icon="@drawable/ic_menu_download"
18-
android:title="@string/menu_download"
19-
/>
20-
<item android:id="@+id/menu_retry_current_image"
21-
app:showAsAction="ifRoom|withText"
22-
android:icon="@android:drawable/ic_menu_revert"
23-
android:title="@string/menu_retry_upload"
24-
android:visible="false"
25-
android:enabled="false"
26-
/>
27-
<item android:id="@+id/menu_cancel_current_image"
28-
app:showAsAction="never"
29-
android:icon="@android:drawable/ic_menu_delete"
30-
android:title="@string/menu_cancel_upload"
31-
android:visible="false"
32-
android:enabled="false"
33-
/>
5+
<item
6+
android:id="@+id/menu_share_current_image"
7+
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
8+
android:title="@string/menu_share"
9+
app:showAsAction="ifRoom|withText" />
10+
<item
11+
android:id="@+id/menu_browser_current_image"
12+
android:icon="@android:drawable/ic_menu_view"
13+
android:title="@string/menu_open_in_browser"
14+
app:showAsAction="never" />
15+
<item
16+
android:id="@+id/menu_download_current_image"
17+
android:icon="@drawable/ic_menu_download"
18+
android:title="@string/menu_download"
19+
app:showAsAction="never" />
20+
<item
21+
android:id="@+id/menu_retry_current_image"
22+
android:enabled="false"
23+
android:icon="@android:drawable/ic_menu_revert"
24+
android:title="@string/menu_retry_upload"
25+
android:visible="false"
26+
app:showAsAction="ifRoom|withText" />
27+
<item
28+
android:id="@+id/menu_cancel_current_image"
29+
android:enabled="false"
30+
android:icon="@android:drawable/ic_menu_delete"
31+
android:title="@string/menu_cancel_upload"
32+
android:visible="false"
33+
app:showAsAction="never" />
3434

3535
</menu>

0 commit comments

Comments
 (0)