Skip to content

Commit 6588a6f

Browse files
Fixes #545 - Add support for campaigns (#4423)
* Integrate WLM - Show monuments in maps along with nearby * BugFix in Monuments 1. Single preference for monuments and campaigns 2. Expand collapse chips container in nearby 3. Typo fix in Monuments card in Nearby 4. If a nearby place is a monument as well - do not show them separately, show it as a monument instead 5. Bug fix, monument radius, use the same one as that of nearby * More bug fixes 1. Possible NPE in nearby 2. Added column location_address in BookmarkLocationDao 3. Bug Fix - Display Date in WLM card 4. WLM card on click takes to nearby * Use lowercase country code in WLM uploads * Bug-Fix, WLM Campaign Icon * 1. Updated monuments query to use any of the following properties for monuments - [P1435, P2186, P1459, P1460, P1216, P709, P718, P5694] 2. Append WikiData QID to descriptions template * Updated WLM Banner String, Handle NPE in contributions callback * Added nearby-monuments query log lines * Handle WLM Query exception : - if an exception is thrown in WLM query, continue showing the nearby items if that succeeds * Fix BookmarkLocationDaoTest * Added Column Address in BookmarkLocationDaoTest * Use fallback description as usual nearby pins even for WLM pins, instead of relying on P6375 * Test fix in BookmarkLocationDao * Updated template for WLM, removed redundant feilds * Fixed WLM template * Removed categories from WLM template * Fixed BookmarkControllerTest * Fixed BookmarkLocationFragmentUnitTest * fix ModelFunctions * Fixed BookmarksDaoLocationTest * Fixed WLM template
1 parent 67f5b6c commit 6588a6f

39 files changed

+2906
-185
lines changed

app/src/main/java/fr/free/nrw/commons/Utils.java

+34
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import androidx.browser.customtabs.CustomTabsIntent;
1818
import androidx.core.content.ContextCompat;
1919

20+
import fr.free.nrw.commons.kvstore.JsonKvStore;
21+
import java.util.Date;
2022
import org.wikipedia.dataclient.WikiSite;
2123
import org.wikipedia.page.PageTitle;
2224

@@ -29,6 +31,7 @@
2931
import timber.log.Timber;
3032

3133
import static android.widget.Toast.LENGTH_SHORT;
34+
import static fr.free.nrw.commons.campaigns.CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE;
3235

3336
public class Utils {
3437

@@ -210,4 +213,35 @@ public static void setUnderlinedText(TextView textView, int stringResourceName,
210213
textView.setText(content);
211214
}
212215

216+
/**
217+
* For now we are enabling the monuments only when the date lies between 1 Sept & 31 OCt
218+
* @param date
219+
* @return
220+
*/
221+
public static boolean isMonumentsEnabled(final Date date, final JsonKvStore store){
222+
if(date.getDay()>=1 && date.getMonth()>=9 && date.getDay()<=31 && date.getMonth()<=10 ){
223+
return true;
224+
}
225+
226+
return store.getBoolean(CAMPAIGNS_DEFAULT_PREFERENCE) || true ;
227+
}
228+
229+
/**
230+
* Util function to get the start date of wlm monument
231+
* For this release we are hardcoding it to be 1st September
232+
* @return
233+
*/
234+
public static String getWLMStartDate() {
235+
return "1 Sep";
236+
}
237+
238+
/***
239+
* Util function to get the end date of wlm monument
240+
* For this release we are hardcoding it to be 31st October
241+
* @return
242+
*/
243+
public static String getWLMEndDate() {
244+
return "31 Oct";
245+
}
246+
213247
}

app/src/main/java/fr/free/nrw/commons/bookmarks/locations/BookmarkLocationsDao.java

+14-14
Original file line numberDiff line numberDiff line change
@@ -147,25 +147,25 @@ public boolean findBookmarkLocation(Place bookmarkLocation) {
147147
}
148148

149149
@NonNull
150-
Place fromCursor(Cursor cursor) {
151-
LatLng location = new LatLng(cursor.getDouble(cursor.getColumnIndex(Table.COLUMN_LAT)),
150+
Place fromCursor(final Cursor cursor) {
151+
final LatLng location = new LatLng(cursor.getDouble(cursor.getColumnIndex(Table.COLUMN_LAT)),
152152
cursor.getDouble(cursor.getColumnIndex(Table.COLUMN_LONG)), 1F);
153153

154-
Sitelinks.Builder builder = new Sitelinks.Builder();
154+
final Sitelinks.Builder builder = new Sitelinks.Builder();
155155
builder.setWikipediaLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_WIKIPEDIA_LINK)));
156156
builder.setWikidataLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_WIKIDATA_LINK)));
157157
builder.setCommonsLink(cursor.getString(cursor.getColumnIndex(Table.COLUMN_COMMONS_LINK)));
158158

159159
return new Place(
160-
cursor.getString(cursor.getColumnIndex(Table.COLUMN_LANGUAGE)),
161-
cursor.getString(cursor.getColumnIndex(Table.COLUMN_NAME)),
162-
Label.fromText((cursor.getString(cursor.getColumnIndex(Table.COLUMN_LABEL_TEXT)))),
163-
cursor.getString(cursor.getColumnIndex(Table.COLUMN_DESCRIPTION)),
164-
location,
165-
cursor.getString(cursor.getColumnIndex(Table.COLUMN_CATEGORY)),
166-
builder.build(),
167-
cursor.getString(cursor.getColumnIndex(Table.COLUMN_PIC)),
168-
Boolean.parseBoolean(cursor.getString(cursor.getColumnIndex(Table.COLUMN_EXISTS)))
160+
cursor.getString(cursor.getColumnIndex(Table.COLUMN_LANGUAGE)),
161+
cursor.getString(cursor.getColumnIndex(Table.COLUMN_NAME)),
162+
Label.fromText((cursor.getString(cursor.getColumnIndex(Table.COLUMN_LABEL_TEXT)))),
163+
cursor.getString(cursor.getColumnIndex(Table.COLUMN_DESCRIPTION)),
164+
location,
165+
cursor.getString(cursor.getColumnIndex(Table.COLUMN_CATEGORY)),
166+
builder.build(),
167+
cursor.getString(cursor.getColumnIndex(Table.COLUMN_PIC)),
168+
Boolean.parseBoolean(cursor.getString(cursor.getColumnIndex(Table.COLUMN_EXISTS)))
169169
);
170170
}
171171

@@ -220,7 +220,7 @@ public static class Table {
220220
COLUMN_WIKIDATA_LINK,
221221
COLUMN_COMMONS_LINK,
222222
COLUMN_PIC,
223-
COLUMN_EXISTS
223+
COLUMN_EXISTS,
224224
};
225225

226226
static final String DROP_TABLE_STATEMENT = "DROP TABLE IF EXISTS " + TABLE_NAME;
@@ -251,7 +251,7 @@ public static void onDelete(SQLiteDatabase db) {
251251
onCreate(db);
252252
}
253253

254-
public static void onUpdate(SQLiteDatabase db, int from, int to) {
254+
public static void onUpdate(final SQLiteDatabase db, int from, final int to) {
255255
Timber.d("bookmarksLocations db is updated from:"+from+", to:"+to);
256256
if (from == to) {
257257
return;

app/src/main/java/fr/free/nrw/commons/campaigns/Campaign.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ data class Campaign(var title: String? = null,
77
var description: String? = null,
88
var startDate: String? = null,
99
var endDate: String? = null,
10-
var link: String? = null)
10+
var link: String? = null,
11+
var isWLMCampaign: Boolean = false)

app/src/main/java/fr/free/nrw/commons/campaigns/CampaignView.java

+41-13
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44
import android.net.Uri;
55
import android.util.AttributeSet;
66
import android.view.View;
7+
import android.widget.ImageView;
78
import android.widget.TextView;
89

910
import androidx.annotation.NonNull;
1011
import androidx.annotation.Nullable;
1112

13+
import fr.free.nrw.commons.theme.BaseActivity;
1214
import org.wikipedia.util.DateUtil;
1315

1416
import java.text.ParseException;
@@ -27,9 +29,14 @@
2729
* A view which represents a single campaign
2830
*/
2931
public class CampaignView extends SwipableCardView {
30-
Campaign campaign = null;
32+
Campaign campaign;
3133
private ViewHolder viewHolder;
3234

35+
public static final String CAMPAIGNS_DEFAULT_PREFERENCE = "displayCampaignsCardView";
36+
public static final String WLM_CARD_PREFERENCE = "displayWLMCardView";
37+
38+
private String campaignPreference = CAMPAIGNS_DEFAULT_PREFERENCE;
39+
3340
public CampaignView(@NonNull Context context) {
3441
super(context);
3542
init();
@@ -45,37 +52,46 @@ public CampaignView(@NonNull Context context, @Nullable AttributeSet attrs, int
4552
init();
4653
}
4754

48-
public void setCampaign(Campaign campaign) {
55+
public void setCampaign(final Campaign campaign) {
4956
this.campaign = campaign;
5057
if (campaign != null) {
51-
this.setVisibility(View.VISIBLE);
58+
if (campaign.isWLMCampaign()) {
59+
campaignPreference = WLM_CARD_PREFERENCE;
60+
}
61+
setVisibility(View.VISIBLE);
5262
viewHolder.init();
5363
} else {
5464
this.setVisibility(View.GONE);
5565
}
5666
}
5767

58-
@Override public boolean onSwipe(View view) {
68+
@Override public boolean onSwipe(final View view) {
5969
view.setVisibility(View.GONE);
60-
((MainActivity) getContext()).defaultKvStore
61-
.putBoolean("displayCampaignsCardView", false);
70+
((BaseActivity) getContext()).defaultKvStore
71+
.putBoolean(campaignPreference, false);
6272
ViewUtil.showLongToast(getContext(),
6373
getResources().getString(R.string.nearby_campaign_dismiss_message));
6474
return true;
6575
}
6676

6777
private void init() {
68-
View rootView = inflate(getContext(), R.layout.layout_campagin, this);
78+
final View rootView = inflate(getContext(), R.layout.layout_campagin, this);
6979
viewHolder = new ViewHolder(rootView);
7080
setOnClickListener(view -> {
7181
if (campaign != null) {
72-
Utils.handleWebUrl(getContext(), Uri.parse(campaign.getLink()));
82+
if (campaign.isWLMCampaign()) {
83+
((MainActivity)(getContext())).showNearby();
84+
} else {
85+
Utils.handleWebUrl(getContext(), Uri.parse(campaign.getLink()));
86+
}
7387
}
7488
});
7589
}
7690

7791
public class ViewHolder {
7892

93+
@BindView(R.id.iv_campaign)
94+
ImageView ivCampaign;
7995
@BindView(R.id.tv_title) TextView tvTitle;
8096
@BindView(R.id.tv_description) TextView tvDescription;
8197
@BindView(R.id.tv_dates) TextView tvDates;
@@ -86,14 +102,26 @@ public ViewHolder(View itemView) {
86102

87103
public void init() {
88104
if (campaign != null) {
105+
ivCampaign.setImageDrawable(
106+
getResources().getDrawable(R.drawable.ic_campaign));
107+
89108
tvTitle.setText(campaign.getTitle());
90109
tvDescription.setText(campaign.getDescription());
91110
try {
92-
Date startDate = CommonsDateUtil.getIso8601DateFormatShort().parse(campaign.getStartDate());
93-
Date endDate = CommonsDateUtil.getIso8601DateFormatShort().parse(campaign.getEndDate());
94-
tvDates.setText(String.format("%1s - %2s", DateUtil.getExtraShortDateString(startDate),
95-
DateUtil.getExtraShortDateString(endDate)));
96-
} catch (ParseException e) {
111+
if (campaign.isWLMCampaign()) {
112+
tvDates.setText(
113+
String.format("%1s - %2s", campaign.getStartDate(),
114+
campaign.getEndDate()));
115+
} else {
116+
final Date startDate = CommonsDateUtil.getIso8601DateFormatShort()
117+
.parse(campaign.getStartDate());
118+
final Date endDate = CommonsDateUtil.getIso8601DateFormatShort()
119+
.parse(campaign.getEndDate());
120+
tvDates.setText(
121+
String.format("%1s - %2s", startDate,
122+
endDate));
123+
}
124+
} catch (final ParseException e) {
97125
e.printStackTrace();
98126
}
99127
}

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsFragment.java

+24-15
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22

33
import static fr.free.nrw.commons.contributions.Contribution.STATE_FAILED;
44
import static fr.free.nrw.commons.contributions.Contribution.STATE_PAUSED;
5+
import static fr.free.nrw.commons.nearby.fragments.NearbyParentFragment.WLM_URL;
56
import static fr.free.nrw.commons.utils.LengthUtils.formatDistanceBetween;
67

78
import android.Manifest;
89
import android.annotation.SuppressLint;
9-
import android.content.ComponentName;
1010
import android.content.Context;
1111
import android.os.Bundle;
12-
import android.util.Log;
1312
import android.view.LayoutInflater;
1413
import android.view.Menu;
1514
import android.view.MenuInflater;
@@ -27,21 +26,21 @@
2726
import androidx.fragment.app.FragmentManager.OnBackStackChangedListener;
2827
import androidx.fragment.app.FragmentTransaction;
2928
import fr.free.nrw.commons.CommonsApplication;
29+
import fr.free.nrw.commons.Utils;
3030
import fr.free.nrw.commons.auth.SessionManager;
3131
import fr.free.nrw.commons.notification.Notification;
3232
import fr.free.nrw.commons.notification.NotificationController;
3333
import fr.free.nrw.commons.theme.BaseActivity;
34+
import java.text.ParseException;
35+
import java.util.Date;
3436
import java.util.List;
3537
import javax.inject.Inject;
3638
import javax.inject.Named;
37-
import androidx.work.WorkInfo;
3839
import androidx.work.WorkManager;
3940
import butterknife.BindView;
4041
import butterknife.ButterKnife;
41-
import fr.free.nrw.commons.CommonsApplication;
4242
import fr.free.nrw.commons.Media;
4343
import fr.free.nrw.commons.R;
44-
import fr.free.nrw.commons.auth.SessionManager;
4544
import fr.free.nrw.commons.campaigns.Campaign;
4645
import fr.free.nrw.commons.campaigns.CampaignView;
4746
import fr.free.nrw.commons.campaigns.CampaignsPresenter;
@@ -59,10 +58,7 @@
5958
import fr.free.nrw.commons.nearby.NearbyController;
6059
import fr.free.nrw.commons.nearby.NearbyNotificationCardView;
6160
import fr.free.nrw.commons.nearby.Place;
62-
import fr.free.nrw.commons.notification.Notification;
6361
import fr.free.nrw.commons.notification.NotificationActivity;
64-
import fr.free.nrw.commons.notification.NotificationController;
65-
import fr.free.nrw.commons.theme.BaseActivity;
6662
import fr.free.nrw.commons.upload.worker.UploadWorker;
6763
import fr.free.nrw.commons.utils.ConfigUtils;
6864
import fr.free.nrw.commons.utils.DialogUtil;
@@ -73,9 +69,6 @@
7369
import io.reactivex.android.schedulers.AndroidSchedulers;
7470
import io.reactivex.disposables.CompositeDisposable;
7571
import io.reactivex.schedulers.Schedulers;
76-
import java.util.List;
77-
import javax.inject.Inject;
78-
import javax.inject.Named;
7972
import timber.log.Timber;
8073

8174
public class ContributionsFragment
@@ -118,6 +111,8 @@ public class ContributionsFragment
118111

119112
public TextView notificationCount;
120113

114+
private Campaign wlmCampaign;
115+
121116
@NonNull
122117
public static ContributionsFragment newInstance() {
123118
ContributionsFragment fragment = new ContributionsFragment();
@@ -137,6 +132,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
137132
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
138133
View view = inflater.inflate(R.layout.fragment_contributions, container, false);
139134
ButterKnife.bind(this, view);
135+
initWLMCampaign();
140136
presenter.onAttachView(this);
141137
contributionsPresenter.onAttachView(this);
142138
campaignView.setVisibility(View.GONE);
@@ -177,6 +173,15 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
177173
return view;
178174
}
179175

176+
/**
177+
* Initialise the campaign object for WML
178+
*/
179+
private void initWLMCampaign() {
180+
wlmCampaign = new Campaign(getString(R.string.wlm_campaign_title),
181+
getString(R.string.wlm_campaign_description), Utils.getWLMStartDate().toString(),
182+
Utils.getWLMEndDate().toString(), WLM_URL, true);
183+
}
184+
180185
@Override
181186
public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) {
182187
inflater.inflate(R.menu.contribution_activity_notification_menu, menu);
@@ -518,13 +523,17 @@ public void onLocationChangedMedium(LatLng latLng) {
518523
}
519524

520525
/**
521-
* ask the presenter to fetch the campaigns only if user has not manually disabled it
526+
* As the home screen has limited space, we have choosen to show either campaigns or WLM card.
527+
* The WLM Card gets the priority over monuments, so if the WLM is going on we show that instead
528+
* of campaigns on the campaigns card
522529
*/
523530
private void fetchCampaigns() {
524-
if (store.getBoolean("displayCampaignsCardView", true)) {
531+
if (Utils.isMonumentsEnabled(new Date(), store)) {
532+
campaignView.setCampaign(wlmCampaign);
533+
campaignView.setVisibility(View.VISIBLE);
534+
} else if (store.getBoolean(CampaignView.CAMPAIGNS_DEFAULT_PREFERENCE, true)) {
525535
presenter.getCampaigns();
526-
}
527-
else{
536+
} else {
528537
campaignView.setVisibility(View.GONE);
529538
}
530539
}

app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment impl
9090

9191
private ContributionsListAdapter adapter;
9292

93-
private Callback callback;
93+
@Nullable private Callback callback;
9494

9595
private final int SPAN_COUNT_LANDSCAPE = 3;
9696
private final int SPAN_COUNT_PORTRAIT = 1;
@@ -150,7 +150,9 @@ private void initRecyclerView() {
150150
contributionsListPresenter.contributionList.observe(this.getViewLifecycleOwner(), list -> {
151151
contributionsSize = list.size();
152152
adapter.submitList(list);
153-
callback.notifyDataSetChanged();
153+
if (callback != null) {
154+
callback.notifyDataSetChanged();
155+
}
154156
});
155157
rvContributionsList.setAdapter(adapter);
156158
adapter.registerAdapterDataObserver(new AdapterDataObserver() {
@@ -172,7 +174,9 @@ public void onItemRangeInserted(int positionStart, int itemCount) {
172174
@Override
173175
public void onItemRangeChanged(final int positionStart, final int itemCount) {
174176
super.onItemRangeChanged(positionStart, itemCount);
175-
callback.viewPagerNotifyDataSetChanged();
177+
if (callback != null) {
178+
callback.viewPagerNotifyDataSetChanged();
179+
}
176180
}
177181
});
178182

app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java

+7
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,13 @@ protected void onDestroy() {
373373
super.onDestroy();
374374
}
375375

376+
/**
377+
* Public method to show nearby from the reference of this.
378+
*/
379+
public void showNearby() {
380+
tabLayout.setSelectedItemId(NavTab.NEARBY.code());
381+
}
382+
376383
public enum ActiveFragment {
377384
CONTRIBUTIONS,
378385
NEARBY,

0 commit comments

Comments
 (0)