diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 253bdaea8..6aab09b55 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -91,6 +91,10 @@
android:name=".notification.NotificationActivity"
android:label="@string/navigation_item_notification" />
+
+
adapterView, View view, int i, long l) {
+ if (mediaDetails == null || !mediaDetails.isVisible()) {
+ // set isFeaturedImage true for featured images, to include author field on media detail
+ mediaDetails = new MediaDetailPagerFragment(false, true);
+ FragmentManager supportFragmentManager = getSupportFragmentManager();
+ supportFragmentManager
+ .beginTransaction()
+ .replace(R.id.featuredFragmentContainer, mediaDetails)
+ .addToBackStack(null)
+ .commit();
+ supportFragmentManager.executePendingTransactions();
+ }
+ mediaDetails.showImage(i);
+ }
+
+ @Override
+ public Media getMediaAtPosition(int i) {
+ if (featuredImagesListFragment.getAdapter() == null) {
+ // not yet ready to return data
+ return null;
+ } else {
+ return ((FeaturedImage)featuredImagesListFragment.getAdapter().getItem(i)).getImage();
+ }
+ }
+
+ @Override
+ public int getTotalMediaCount() {
+ if (featuredImagesListFragment.getAdapter() == null) {
+ return 0;
+ }
+ return featuredImagesListFragment.getAdapter().getCount();
+ }
+
+ @Override
+ public void notifyDatasetChanged() {
+
+ }
+
+ @Override
+ public void registerDataSetObserver(DataSetObserver observer) {
+
+ }
+
+ @Override
+ public void unregisterDataSetObserver(DataSetObserver observer) {
+
+ }
+}
diff --git a/app/src/main/java/fr/free/nrw/commons/featured/FeaturedImagesListFragment.java b/app/src/main/java/fr/free/nrw/commons/featured/FeaturedImagesListFragment.java
new file mode 100644
index 000000000..3e5c37bd6
--- /dev/null
+++ b/app/src/main/java/fr/free/nrw/commons/featured/FeaturedImagesListFragment.java
@@ -0,0 +1,57 @@
+package fr.free.nrw.commons.featured;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.GridView;
+import android.widget.ListAdapter;
+
+import java.util.ArrayList;
+
+import butterknife.ButterKnife;
+import dagger.android.support.DaggerFragment;
+import fr.free.nrw.commons.Media;
+import fr.free.nrw.commons.R;
+
+
+/**
+ * Created by root on 09.01.2018.
+ */
+
+public class FeaturedImagesListFragment extends DaggerFragment {
+ private GridView gridView;
+ private MockGridViewAdapter gridAdapter;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.fragment_featured_images, container, false);
+ ButterKnife.bind(this, v);
+ return v;
+ }
+
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ gridView = getView().findViewById(R.id.featuredImagesList);
+ gridView.setOnItemClickListener((AdapterView.OnItemClickListener) getActivity());
+ gridAdapter = new MockGridViewAdapter(this.getContext(), R.layout.layout_featured_images, getMockFeaturedImages());
+ gridView.setAdapter(gridAdapter);
+
+ }
+
+ private ArrayList getMockFeaturedImages(){
+ ArrayList featuredImages = new ArrayList<>();
+ for (int i=0; i<10; i++){
+ featuredImages.add(new FeaturedImage(new Media("test.jpg"), "username: test", "test file name"));
+ }
+ return featuredImages;
+ }
+
+ public ListAdapter getAdapter() {
+ return gridView.getAdapter();
+ }
+}
diff --git a/app/src/main/java/fr/free/nrw/commons/featured/MockGridViewAdapter.java b/app/src/main/java/fr/free/nrw/commons/featured/MockGridViewAdapter.java
new file mode 100644
index 000000000..7aa2a8892
--- /dev/null
+++ b/app/src/main/java/fr/free/nrw/commons/featured/MockGridViewAdapter.java
@@ -0,0 +1,50 @@
+package fr.free.nrw.commons.featured;
+
+import android.app.Activity;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+import fr.free.nrw.commons.MediaWikiImageView;
+import fr.free.nrw.commons.R;
+
+/**
+ * This is created to only display UI implementation. Needs to be changed in real implementation
+ */
+
+public class MockGridViewAdapter extends ArrayAdapter {
+ private Context context;
+ private int layoutResourceId;
+ private ArrayList data = new ArrayList();
+
+ public MockGridViewAdapter(Context context, int layoutResourceId, ArrayList data) {
+ super(context, layoutResourceId, data);
+ this.layoutResourceId = layoutResourceId;
+ this.context = context;
+ this.data = data;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+
+ if (convertView == null) {
+ LayoutInflater inflater = ((Activity) context).getLayoutInflater();
+ convertView = inflater.inflate(R.layout.layout_featured_images, null);
+ }
+
+ FeaturedImage item = data.get(position);
+ MediaWikiImageView imageView = convertView.findViewById(R.id.featuredImageView);
+ TextView fileName = convertView.findViewById(R.id.featuredImageTitle);
+ TextView author = convertView.findViewById(R.id.featuredImageAuthor);
+ fileName.setText("Test file name");
+ author.setText("Uploaded by: Test user name");
+ imageView.setMedia(item.getImage());
+ return convertView;
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java
index 75e366767..aeb28669b 100644
--- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java
@@ -40,14 +40,16 @@ import timber.log.Timber;
public class MediaDetailFragment extends DaggerFragment {
private boolean editable;
+ private boolean isFeaturedMedia;
private MediaDetailPagerFragment.MediaDetailProvider detailProvider;
private int index;
- public static MediaDetailFragment forMedia(int index, boolean editable) {
+ public static MediaDetailFragment forMedia(int index, boolean editable, boolean isFeaturedMedia) {
MediaDetailFragment mf = new MediaDetailFragment();
Bundle state = new Bundle();
state.putBoolean("editable", editable);
+ state.putBoolean("isFeaturedMedia", isFeaturedMedia);
state.putInt("index", index);
state.putInt("listIndex", 0);
state.putInt("listTop", 0);
@@ -66,10 +68,12 @@ public class MediaDetailFragment extends DaggerFragment {
private TextView title;
private TextView desc;
+ private TextView author;
private TextView license;
private TextView coordinates;
private TextView uploadedDate;
private LinearLayout categoryContainer;
+ private LinearLayout authorLayout;
private ScrollView scrollView;
private ArrayList categoryNames;
private boolean categoriesLoaded = false;
@@ -85,6 +89,7 @@ public class MediaDetailFragment extends DaggerFragment {
super.onSaveInstanceState(outState);
outState.putInt("index", index);
outState.putBoolean("editable", editable);
+ outState.putBoolean("isFeaturedMedia", isFeaturedMedia);
getScrollPosition();
outState.putInt("listTop", initialListTop);
@@ -100,13 +105,16 @@ public class MediaDetailFragment extends DaggerFragment {
if (savedInstanceState != null) {
editable = savedInstanceState.getBoolean("editable");
+ isFeaturedMedia = savedInstanceState.getBoolean("isFeaturedMedia");
index = savedInstanceState.getInt("index");
initialListTop = savedInstanceState.getInt("listTop");
} else {
editable = getArguments().getBoolean("editable");
+ isFeaturedMedia = getArguments().getBoolean("isFeaturedMedia");
index = getArguments().getInt("index");
initialListTop = 0;
}
+
categoryNames = new ArrayList<>();
categoryNames.add(getString(R.string.detail_panel_cats_loading));
@@ -119,10 +127,18 @@ public class MediaDetailFragment extends DaggerFragment {
spacer = (MediaDetailSpacer) view.findViewById(R.id.mediaDetailSpacer);
title = (TextView) view.findViewById(R.id.mediaDetailTitle);
desc = (TextView) view.findViewById(R.id.mediaDetailDesc);
+ author = (TextView) view.findViewById(R.id.mediaDetailAuthor);
license = (TextView) view.findViewById(R.id.mediaDetailLicense);
coordinates = (TextView) view.findViewById(R.id.mediaDetailCoordinates);
uploadedDate = (TextView) view.findViewById(R.id.mediaDetailuploadeddate);
categoryContainer = (LinearLayout) view.findViewById(R.id.mediaDetailCategoryContainer);
+ authorLayout = (LinearLayout) view.findViewById(R.id.authorLinearLayout);
+
+ if (isFeaturedMedia){
+ authorLayout.setVisibility(View.VISIBLE);
+ } else {
+ authorLayout.setVisibility(View.GONE);
+ }
licenseList = new LicenseList(getActivity());
diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
index 5d6e66faf..c067a9ce3 100644
--- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
+++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java
@@ -49,14 +49,16 @@ public class MediaDetailPagerFragment extends DaggerFragment implements ViewPage
private ViewPager pager;
private Boolean editable;
+ private boolean isFeaturedImage;
public MediaDetailPagerFragment() {
- this(false);
+ this(false, false);
}
@SuppressLint("ValidFragment")
- public MediaDetailPagerFragment(Boolean editable) {
+ public MediaDetailPagerFragment(Boolean editable, boolean isFeaturedImage) {
this.editable = editable;
+ this.isFeaturedImage = isFeaturedImage;
}
@Override
@@ -90,6 +92,7 @@ public class MediaDetailPagerFragment extends DaggerFragment implements ViewPage
super.onSaveInstanceState(outState);
outState.putInt("current-page", pager.getCurrentItem());
outState.putBoolean("editable", editable);
+ outState.putBoolean("isFeaturedImage", isFeaturedImage);
}
@Override
@@ -97,6 +100,7 @@ public class MediaDetailPagerFragment extends DaggerFragment implements ViewPage
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
editable = savedInstanceState.getBoolean("editable");
+ isFeaturedImage = savedInstanceState.getBoolean("isFeaturedImage");
}
setHasOptionsMenu(true);
}
@@ -272,7 +276,7 @@ public class MediaDetailPagerFragment extends DaggerFragment implements ViewPage
// See bug https://code.google.com/p/android/issues/detail?id=27526
pager.postDelayed(() -> getActivity().supportInvalidateOptionsMenu(), 5);
}
- return MediaDetailFragment.forMedia(i, editable);
+ return MediaDetailFragment.forMedia(i, editable, isFeaturedImage);
}
@Override
diff --git a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
index 4e7cf767f..dd8e3017c 100644
--- a/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/theme/NavigationBaseActivity.java
@@ -26,6 +26,7 @@ import fr.free.nrw.commons.WelcomeActivity;
import fr.free.nrw.commons.auth.AccountUtil;
import fr.free.nrw.commons.auth.LoginActivity;
import fr.free.nrw.commons.contributions.ContributionsActivity;
+import fr.free.nrw.commons.featured.FeaturedImagesActivity;
import fr.free.nrw.commons.nearby.NearbyActivity;
import fr.free.nrw.commons.notification.NotificationActivity;
import fr.free.nrw.commons.settings.SettingsActivity;
@@ -148,6 +149,10 @@ public abstract class NavigationBaseActivity extends BaseActivity
drawerLayout.closeDrawer(navigationView);
startActivityWithFlags(this, NotificationActivity.class, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
return true;
+ case R.id.action_featured_images:
+ drawerLayout.closeDrawer(navigationView);
+ startActivityWithFlags(this, FeaturedImagesActivity.class, Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
+ return true;
default:
Timber.e("Unknown option [%s] selected from the navigation menu", itemId);
return false;
diff --git a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java
index 15acdcd4a..0f0e742cc 100644
--- a/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java
+++ b/app/src/main/java/fr/free/nrw/commons/upload/MultipleShareActivity.java
@@ -219,7 +219,7 @@ public class MultipleShareActivity extends AuthenticatedActivity
private void showDetail(int i) {
if (mediaDetails == null || !mediaDetails.isVisible()) {
- mediaDetails = new MediaDetailPagerFragment(true);
+ mediaDetails = new MediaDetailPagerFragment(true, false);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.uploadsFragmentContainer, mediaDetails)
diff --git a/app/src/main/res/drawable/ic_star_black_24dp.xml b/app/src/main/res/drawable/ic_star_black_24dp.xml
new file mode 100644
index 000000000..a87ca098d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_star_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_featured_images.xml b/app/src/main/res/layout/activity_featured_images.xml
new file mode 100644
index 000000000..755fe4983
--- /dev/null
+++ b/app/src/main/res/layout/activity_featured_images.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_featured_images.xml b/app/src/main/res/layout/fragment_featured_images.xml
new file mode 100644
index 000000000..ca45f44c3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_featured_images.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_media_detail.xml b/app/src/main/res/layout/fragment_media_detail.xml
index cffca14c6..392ea6bef 100644
--- a/app/src/main/res/layout/fragment_media_detail.xml
+++ b/app/src/main/res/layout/fragment_media_detail.xml
@@ -80,6 +80,39 @@
android:textSize="@dimen/description_text_size" />
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/layout_featured_images.xml b/app/src/main/res/layout/layout_featured_images.xml
new file mode 100644
index 000000000..399321719
--- /dev/null
+++ b/app/src/main/res/layout/layout_featured_images.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/drawer.xml b/app/src/main/res/menu/drawer.xml
index 83c1bf0ad..3a62183d4 100644
--- a/app/src/main/res/menu/drawer.xml
+++ b/app/src/main/res/menu/drawer.xml
@@ -40,4 +40,10 @@
android:icon="@drawable/ic_notifications_black_24dp"
android:title="@string/navigation_item_notification"/>
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bcc8c3242..64dc31919 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -73,6 +73,7 @@
Categories
Settings
Sign Up
+ Featured Images
About
The Wikimedia Commons app is an open-source app created and maintained by grantees and volunteers of the Wikimedia community. The Wikimedia Foundation is not involved in the creation, development, or maintenance of the app.
Wikimedia Commons
@@ -150,6 +151,8 @@
Title of the media
Description
Description of the media goes here. This can potentially be fairly long, and will need to wrap across multiple lines. We hope it looks nice though.
+ Author
+ Featured image author user name goes here.
Uploaded date
License
Coordinates
@@ -195,6 +198,7 @@
Logout
Tutorial
Notifications
+ Featured
Nearby places cannot be displayed without location permissions
no description found
Commons file page