diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md index d8ef17752..691562b04 100644 --- a/ISSUE_TEMPLATE.md +++ b/ISSUE_TEMPLATE.md @@ -33,3 +33,7 @@ You can find this information by going to the navigation drawer in the app and t **Screen-shots:** Can be created by pressing the Volume Down and Power Button at the same time on Android 4.0 and higher. + +**Would you like to work on the issue?** + +Please let us know whether you want to fix the issue by yourself. If not, anyone can get the issue assigned to them. diff --git a/app/build.gradle b/app/build.gradle index 550019cc5..15cb7c312 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -99,6 +99,7 @@ dependencies { kapt "com.google.dagger:dagger-android-processor:$DAGGER_VERSION" compile 'com.borjabravo:readmoretextview:2.1.0' + compile 'com.android.support.constraint:constraint-layout:1.0.2' } android { diff --git a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java index 97fe27aa4..895190003 100644 --- a/app/src/main/java/fr/free/nrw/commons/AboutActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/AboutActivity.java @@ -58,37 +58,18 @@ public class AboutActivity extends NavigationBaseActivity { intent.setPackage("com.facebook.katana"); startActivity(intent); } catch (Exception e) { - intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.facebook.com/" + "1921335171459985\\")); - if(intent.resolveActivity(this.getPackageManager()) != null){ - Utils.handleWebUrl(this,Uri.parse("https://www.facebook.com/" + "1921335171459985")); - } else { - Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); - toast.show(); - } + Utils.handleWebUrl(this,Uri.parse("https://www.facebook.com/" + "1921335171459985")); } } @OnClick(R.id.github_launch_icon) public void launchGithub(View view) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/commons-app/apps-android-commons\\")); - //check if web browser available - if (browserIntent.resolveActivity(this.getPackageManager()) != null) { - Utils.handleWebUrl(this,Uri.parse("https://github.com/commons-app/apps-android-commons\\")); - } else { - Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); - toast.show(); - } + Utils.handleWebUrl(this,Uri.parse("https://github.com/commons-app/apps-android-commons\\")); } @OnClick(R.id.website_launch_icon) public void launchWebsite(View view) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://commons-app.github.io/\\")); - if (browserIntent.resolveActivity(this.getPackageManager()) != null) { - Utils.handleWebUrl(this,Uri.parse("https://commons-app.github.io/\\")); - } else { - Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); - toast.show(); - } + Utils.handleWebUrl(this,Uri.parse("https://commons-app.github.io/\\")); } @OnClick(R.id.about_rate_us) @@ -98,29 +79,16 @@ public class AboutActivity extends NavigationBaseActivity { @OnClick(R.id.about_credits) public void launchCredits(View view) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/commons-app/apps-android-commons/blob/master/CREDITS/\\")); - if (browserIntent.resolveActivity(this.getPackageManager()) != null) { - Utils.handleWebUrl(this,Uri.parse("https://github.com/commons-app/apps-android-commons/blob/master/CREDITS/\\")); - } else { - Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); - toast.show(); - } + Utils.handleWebUrl(this,Uri.parse("https://github.com/commons-app/apps-android-commons/blob/master/CREDITS/\\")); } @OnClick(R.id.about_privacy_policy) public void launchPrivacyPolicy(View view) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\\")); - if (browserIntent.resolveActivity(this.getPackageManager()) != null) { - Utils.handleWebUrl(this,Uri.parse("https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\\")); - } else { - Toast toast = Toast.makeText(this, getString(R.string.no_web_browser), LENGTH_SHORT); - toast.show(); - } + Utils.handleWebUrl(this,Uri.parse("https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\\")); } @OnClick(R.id.about_faq) public void launchFrequentlyAskedQuesions(View view) { Utils.handleWebUrl(this,Uri.parse("https://github.com/commons-app/apps-android-commons/wiki/Frequently-Asked-Questions\\")); } - } diff --git a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java index 77ffcfbfc..5638db97e 100644 --- a/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java +++ b/app/src/main/java/fr/free/nrw/commons/CommonsApplication.java @@ -7,6 +7,7 @@ import android.database.sqlite.SQLiteDatabase; import android.support.multidex.MultiDexApplication; import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.imagepipeline.core.ImagePipelineConfig; import com.facebook.stetho.Stetho; import com.squareup.leakcanary.LeakCanary; import com.squareup.leakcanary.RefWatcher; @@ -25,7 +26,6 @@ import fr.free.nrw.commons.category.CategoryDao; import fr.free.nrw.commons.contributions.ContributionDao; import fr.free.nrw.commons.data.DBOpenHelper; import fr.free.nrw.commons.di.ApplicationlessInjection; -import fr.free.nrw.commons.di.CommonsApplicationComponent; import fr.free.nrw.commons.modifications.ModifierSequenceDao; import fr.free.nrw.commons.utils.FileUtils; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -72,8 +72,11 @@ public class CommonsApplication extends MultiDexApplication { .getInstance(this) .getCommonsApplicationComponent() .inject(this); - - Fresco.initialize(this); +// Set DownsampleEnabled to True to downsample the image in case it's heavy + ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this) + .setDownsampleEnabled(true) + .build(); + Fresco.initialize(this,config); if (setupLeakCanary() == RefWatcher.DISABLED) { return; } diff --git a/app/src/main/java/fr/free/nrw/commons/Utils.java b/app/src/main/java/fr/free/nrw/commons/Utils.java index 2b6ba9907..05873782c 100644 --- a/app/src/main/java/fr/free/nrw/commons/Utils.java +++ b/app/src/main/java/fr/free/nrw/commons/Utils.java @@ -7,6 +7,7 @@ import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.customtabs.CustomTabsIntent; import android.support.v4.content.ContextCompat; +import android.widget.Toast; import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; @@ -15,7 +16,6 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; -import java.net.URL; import java.net.URLEncoder; import java.util.Locale; import java.util.regex.Matcher; @@ -24,6 +24,8 @@ import java.util.regex.Pattern; import fr.free.nrw.commons.settings.Prefs; import timber.log.Timber; +import static android.widget.Toast.LENGTH_SHORT; + public class Utils { /** @@ -176,6 +178,13 @@ public class Utils { } public static void handleWebUrl(Context context,Uri url){ + Intent browserIntent = new Intent(Intent.ACTION_VIEW, url); + if (browserIntent.resolveActivity(context.getPackageManager()) == null) { + Toast toast = Toast.makeText(context, context.getString(R.string.no_web_browser), LENGTH_SHORT); + toast.show(); + return; + } + CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); builder.setToolbarColor(ContextCompat.getColor(context, R.color.primaryColor)); builder.setSecondaryToolbarColor(ContextCompat.getColor(context, R.color.primaryDarkColor)); diff --git a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java index 8a41664a9..256c7e3b3 100644 --- a/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/auth/LoginActivity.java @@ -37,6 +37,7 @@ import javax.inject.Named; import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.PageTitle; import fr.free.nrw.commons.R; @@ -83,6 +84,9 @@ public class LoginActivity extends AccountAuthenticatorActivity { private AppCompatDelegate delegate; private LoginTextWatcher textWatcher = new LoginTextWatcher(); + private Boolean loginCurrentlyInProgress = false; + private static final String LOGING_IN = "logingIn"; + @Override public void onCreate(Bundle savedInstanceState) { setTheme(Utils.isDarkTheme(this) ? R.style.DarkAppTheme : R.style.LightAppTheme); @@ -132,6 +136,10 @@ public class LoginActivity extends AccountAuthenticatorActivity { Utils.handleWebUrl(this, Uri.parse(BuildConfig.FORGOT_PASSWORD_URL)); } + @OnClick(R.id.about_privacy_policy) + void onPrivacyPolicyClicked() { + Utils.handleWebUrl(this,Uri.parse("https://github.com/commons-app/apps-android-commons/wiki/Privacy-policy\\")); + } public void hideKeyboard(View view) { InputMethodManager inputMethodManager =(InputMethodManager)this.getSystemService(Activity.INPUT_METHOD_SERVICE); @@ -175,6 +183,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { } private void performLogin() { + loginCurrentlyInProgress = true; Timber.d("Login to start!"); final String username = canonicializeUsername(usernameEdit.getText().toString()); final String password = passwordEdit.getText().toString(); @@ -205,6 +214,7 @@ public class LoginActivity extends AccountAuthenticatorActivity { if (result.equals("PASS")) { handlePassResult(username, password); } else { + loginCurrentlyInProgress = false; handleOtherResults(result); } } @@ -327,6 +337,21 @@ public class LoginActivity extends AccountAuthenticatorActivity { return getDelegate().getMenuInflater(); } + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putBoolean(LOGING_IN, loginCurrentlyInProgress); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + loginCurrentlyInProgress = savedInstanceState.getBoolean(LOGING_IN, false); + if(loginCurrentlyInProgress){ + performLogin(); + } + } + public void askUserForTwoFactorAuth() { progressDialog.dismiss(); twoFactorContainer.setVisibility(VISIBLE); diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryDao.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryDao.java index e63b04c26..a5202046b 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryDao.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryDao.java @@ -108,10 +108,10 @@ public class CategoryDao { Category fromCursor(Cursor cursor) { // Hardcoding column positions! return new Category( - CategoryContentProvider.uriForId(cursor.getInt(0)), - cursor.getString(1), - new Date(cursor.getLong(2)), - cursor.getInt(3) + CategoryContentProvider.uriForId(cursor.getInt(cursor.getColumnIndex(Table.COLUMN_ID))), + cursor.getString(cursor.getColumnIndex(Table.COLUMN_NAME)), + new Date(cursor.getLong(cursor.getColumnIndex(Table.COLUMN_LAST_USED))), + cursor.getInt(cursor.getColumnIndex(Table.COLUMN_TIMES_USED)) ); } diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java index 9d3038e03..079cf6477 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionDao.java @@ -8,6 +8,7 @@ import android.net.Uri; import android.os.RemoteException; import android.support.annotation.Nullable; import android.text.TextUtils; +import android.util.Log; import java.util.Date; @@ -115,23 +116,30 @@ public class ContributionDao { // Hardcoding column positions! //Check that cursor has a value to avoid CursorIndexOutOfBoundsException if (cursor.getCount() > 0) { + int index; + if (cursor.getColumnIndex(Table.COLUMN_LICENSE) == -1){ + index = 15; + } else { + index = cursor.getColumnIndex(Table.COLUMN_LICENSE); + } return new Contribution( - uriForId(cursor.getInt(0)), - cursor.getString(1), - parseUri(cursor.getString(2)), - cursor.getString(3), - parseTimestamp(cursor.getLong(4)), - cursor.getInt(5), - cursor.getLong(6), - parseTimestamp(cursor.getLong(7)), - cursor.getLong(8), - cursor.getString(9), - cursor.getString(10), - cursor.getString(11), - cursor.getInt(12) == 1, - cursor.getInt(13), - cursor.getInt(14), - cursor.getString(15)); + uriForId(cursor.getInt(cursor.getColumnIndex(Table.COLUMN_ID))), + cursor.getString(cursor.getColumnIndex(Table.COLUMN_FILENAME)), + parseUri(cursor.getString(cursor.getColumnIndex(Table.COLUMN_LOCAL_URI))), + cursor.getString(cursor.getColumnIndex(Table.COLUMN_IMAGE_URL)), + parseTimestamp(cursor.getLong(cursor.getColumnIndex(Table.COLUMN_TIMESTAMP))), + cursor.getInt(cursor.getColumnIndex(Table.COLUMN_STATE)), + cursor.getLong(cursor.getColumnIndex(Table.COLUMN_LENGTH)), + parseTimestamp(cursor.getLong(cursor.getColumnIndex(Table.COLUMN_UPLOADED))), + cursor.getLong(cursor.getColumnIndex(Table.COLUMN_TRANSFERRED)), + cursor.getString(cursor.getColumnIndex(Table.COLUMN_SOURCE)), + cursor.getString(cursor.getColumnIndex(Table.COLUMN_DESCRIPTION)), + cursor.getString(cursor.getColumnIndex(Table.COLUMN_CREATOR)), + cursor.getInt(cursor.getColumnIndex(Table.COLUMN_MULTIPLE)) == 1, + cursor.getInt(cursor.getColumnIndex(Table.COLUMN_WIDTH)), + cursor.getInt(cursor.getColumnIndex(Table.COLUMN_HEIGHT)), + cursor.getString(index) + ); } return null; diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java index 5c1ecfaa0..ad6cff606 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsActivity.java @@ -26,6 +26,7 @@ import javax.inject.Inject; import javax.inject.Named; import butterknife.ButterKnife; +import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.HandlerService; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; @@ -139,7 +140,11 @@ public class ContributionsActivity requestAuthToken(); initDrawer(); setTitle(getString(R.string.title_activity_contributions)); - setUploadCount(); + + if(!BuildConfig.FLAVOR.equalsIgnoreCase("beta")){ + setUploadCount(); + } + } @Override @@ -279,6 +284,12 @@ public class ContributionsActivity )); } + public void betaSetUploadCount(int betaUploadCount){ + getSupportActionBar().setSubtitle(getResources() + .getQuantityString(R.plurals.contributions_subtitle, betaUploadCount, betaUploadCount)); + } + + @Override public void notifyDatasetChanged() { // Do nothing for now diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java index 25bf6eb93..12ced5f75 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/ContributionsListFragment.java @@ -27,6 +27,7 @@ import javax.inject.Named; import butterknife.BindView; import butterknife.ButterKnife; +import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.R; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.nearby.NearbyActivity; @@ -56,6 +57,7 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment { private ContributionController controller; + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_contributions, container, false); @@ -87,6 +89,10 @@ public class ContributionsListFragment extends CommonsDaggerSupportFragment { public void setAdapter(ListAdapter adapter) { this.contributionsList.setAdapter(adapter); + + if(BuildConfig.FLAVOR.equalsIgnoreCase("beta")){ + ((ContributionsActivity) getActivity()).betaSetUploadCount(adapter.getCount()); + } } public void changeProgressBarVisibility(boolean isVisible) { diff --git a/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequenceDao.java b/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequenceDao.java index a23079b5e..957656a24 100644 --- a/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequenceDao.java +++ b/app/src/main/java/fr/free/nrw/commons/modifications/ModifierSequenceDao.java @@ -54,12 +54,12 @@ public class ModifierSequenceDao { // Hardcoding column positions! ModifierSequence ms; try { - ms = new ModifierSequence(Uri.parse(cursor.getString(1)), - new JSONObject(cursor.getString(2))); + ms = new ModifierSequence(Uri.parse(cursor.getString(cursor.getColumnIndex(Table.COLUMN_MEDIA_URI))), + new JSONObject(cursor.getString(cursor.getColumnIndex(Table.COLUMN_DATA)))); } catch (JSONException e) { throw new RuntimeException(e); } - ms.setContentUri( ModificationsContentProvider.uriForId(cursor.getInt(0))); + ms.setContentUri( ModificationsContentProvider.uriForId(cursor.getInt(cursor.getColumnIndex(Table.COLUMN_ID)))); return ms; } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java index 7aecee337..399af35a9 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyActivity.java @@ -274,7 +274,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp LatLng lastLocation = locationManager.getLastLocation(); if (curLatLang != null && curLatLang.equals(lastLocation)) { //refresh view only if location has changed if (isHardRefresh) { - ViewUtil.showLongToast(this, R.string.nearby_location_has_not_changed); + ViewUtil.showSnackbar(findViewById(R.id.container), R.string.nearby_location_has_not_changed); } return; } @@ -301,9 +301,7 @@ public class NearbyActivity extends NavigationBaseActivity implements LocationUp String gsonCurLatLng = gson.toJson(curLatLang); if (placeList.size() == 0) { - int duration = Toast.LENGTH_SHORT; - Toast toast = Toast.makeText(this, R.string.no_nearby, duration); - toast.show(); + ViewUtil.showSnackbar(findViewById(R.id.container), R.string.no_nearby); } bundle.clear(); diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java b/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java index cf596e36e..26de3297a 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/PlaceRenderer.java @@ -44,8 +44,10 @@ class PlaceRenderer extends Renderer { Place place = getContent(); tvName.setText(place.name); String descriptionText = place.getLongDescription(); + tvDesc.setVisibility(View.VISIBLE); if (descriptionText.equals("?")) { descriptionText = getContext().getString(R.string.no_description_found); + tvDesc.setVisibility(View.INVISIBLE); } tvDesc.setText(descriptionText); distance.setText(place.distance); diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java index f66b0b6a0..d6fcd2685 100644 --- a/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationActivity.java @@ -1,6 +1,7 @@ package fr.free.nrw.commons.notification; import android.annotation.SuppressLint; +import android.app.FragmentManager; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -12,7 +13,6 @@ import android.widget.Toast; import com.pedrogomez.renderers.RVRendererAdapter; -import java.util.Collections; import java.util.List; import javax.inject.Inject; @@ -39,12 +39,16 @@ public class NotificationActivity extends NavigationBaseActivity { @Inject NotificationController controller; + private static final String TAG_NOTIFICATION_WORKER_FRAGMENT = "NotificationWorkerFragment"; + private NotificationWorkerFragment mNotificationWorkerFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notification); ButterKnife.bind(this); + mNotificationWorkerFragment = (NotificationWorkerFragment) getFragmentManager() + .findFragmentByTag(TAG_NOTIFICATION_WORKER_FRAGMENT); initListView(); initDrawer(); } @@ -60,14 +64,18 @@ public class NotificationActivity extends NavigationBaseActivity { private void addNotifications() { Timber.d("Add notifications"); - Observable.fromCallable(() -> controller.getNotifications()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(notificationList -> { - Collections.reverse(notificationList); - Timber.d("Number of notifications is %d", notificationList.size()); - setAdapter(notificationList); - }, throwable -> Timber.e(throwable, "Error occurred while loading notifications")); + if(mNotificationWorkerFragment == null){ + Observable.fromCallable(() -> controller.getNotifications()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(notificationList -> { + Timber.d("Number of notifications is %d", notificationList.size()); + initializeAndSetNotificationList(notificationList); + setAdapter(notificationList); + }, throwable -> Timber.e(throwable, "Error occurred while loading notifications")); + } else { + setAdapter(mNotificationWorkerFragment.getNotificationList()); + } } private void handleUrl(String url) { @@ -98,4 +106,12 @@ public class NotificationActivity extends NavigationBaseActivity { intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); context.startActivity(intent); } -} + + private void initializeAndSetNotificationList(List notificationList){ + FragmentManager fm = getFragmentManager(); + mNotificationWorkerFragment = new NotificationWorkerFragment(); + fm.beginTransaction().add(mNotificationWorkerFragment, TAG_NOTIFICATION_WORKER_FRAGMENT) + .commit(); + mNotificationWorkerFragment.setNotificationList(notificationList); + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/free/nrw/commons/notification/NotificationWorkerFragment.java b/app/src/main/java/fr/free/nrw/commons/notification/NotificationWorkerFragment.java new file mode 100644 index 000000000..bb85fc696 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/notification/NotificationWorkerFragment.java @@ -0,0 +1,29 @@ +package fr.free.nrw.commons.notification; + +import android.app.Fragment; +import android.os.Bundle; +import android.support.annotation.Nullable; + +import java.util.List; + +/** + * Created by knightshade on 25/2/18. + */ + +public class NotificationWorkerFragment extends Fragment { + private List notificationList; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRetainInstance(true); + } + + public void setNotificationList(List notificationList){ + this.notificationList = notificationList; + } + + public List getNotificationList(){ + return notificationList; + } +} diff --git a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java index c7ee3df48..741905e30 100644 --- a/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/settings/SettingsFragment.java @@ -3,10 +3,13 @@ package fr.free.nrw.commons.settings; import android.Manifest; import android.app.AlertDialog; import android.content.ActivityNotFoundException; +import android.content.ComponentName; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -21,6 +24,8 @@ import android.support.v4.content.FileProvider; import android.widget.Toast; import java.io.File; +import java.util.ArrayList; +import java.util.List; import javax.inject.Inject; import javax.inject.Named; @@ -141,19 +146,24 @@ public class SettingsFragment extends PreferenceFragment { appLogsFile ); - Intent feedbackIntent = new Intent(Intent.ACTION_SEND); - feedbackIntent.setType("message/rfc822"); - feedbackIntent.putExtra(Intent.EXTRA_EMAIL, - new String[]{CommonsApplication.LOGS_PRIVATE_EMAIL}); - feedbackIntent.putExtra(Intent.EXTRA_SUBJECT, - String.format(CommonsApplication.FEEDBACK_EMAIL_SUBJECT, - BuildConfig.VERSION_NAME)); - feedbackIntent.putExtra(Intent.EXTRA_STREAM,appLogsFilePath); + //initialize the emailSelectorIntent + Intent emailSelectorIntent = new Intent(Intent.ACTION_SENDTO); + emailSelectorIntent.setData(Uri.parse("mailto:")); + //initialize the emailIntent + final Intent emailIntent = new Intent(Intent.ACTION_SEND); + emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{CommonsApplication.FEEDBACK_EMAIL}); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, String.format(CommonsApplication.FEEDBACK_EMAIL_SUBJECT, BuildConfig.VERSION_NAME)); + emailIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + emailIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + emailIntent.setSelector( emailSelectorIntent ); + //adding the attachment to the intent + emailIntent.putExtra(Intent.EXTRA_STREAM, appLogsFilePath); try { - startActivity(feedbackIntent); + startActivity(Intent.createChooser(emailIntent, "Send mail..")); } catch (ActivityNotFoundException e) { Toast.makeText(getActivity(), R.string.no_email_client, Toast.LENGTH_SHORT).show(); } } + } 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 81f56adea..b65d6aa25 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 @@ -88,8 +88,11 @@ public abstract class NavigationBaseActivity extends BaseActivity private void setDrawerPaneWidth() { ViewGroup.LayoutParams params = navigationView.getLayoutParams(); - // set width to lowerBound of 80% of the screen size - params.width = (getResources().getDisplayMetrics().widthPixels * 70) / 100; + // set width to lowerBound of 70% of the screen size in portrait mode + // set width to lowerBound of 50% of the screen size in landscape mode + int percentageWidth = getResources().getInteger(R.integer.drawer_width); + + params.width = (getResources().getDisplayMetrics().widthPixels * percentageWidth) / 100; navigationView.setLayoutParams(params); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java b/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java index fee0765a4..f74c40867 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ExistingFileAsync.java @@ -1,11 +1,13 @@ package fr.free.nrw.commons.upload; +import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.AsyncTask; import android.support.v7.app.AlertDialog; import java.io.IOException; +import java.lang.ref.WeakReference; import fr.free.nrw.commons.R; import fr.free.nrw.commons.contributions.ContributionsActivity; @@ -28,12 +30,14 @@ public class ExistingFileAsync extends AsyncTask { DUPLICATE_CANCELLED } + private final WeakReference activity; private final MediaWikiApi api; private final String fileSha1; - private final Context context; + private final WeakReference context; private final Callback callback; - public ExistingFileAsync(String fileSha1, Context context, Callback callback, MediaWikiApi mwApi) { + public ExistingFileAsync(WeakReference activity, String fileSha1, WeakReference context, Callback callback, MediaWikiApi mwApi) { + this.activity = activity; this.fileSha1 = fileSha1; this.context = context; this.callback = callback; @@ -69,19 +73,21 @@ public class ExistingFileAsync extends AsyncTask { // If file exists, display warning to user. // Use soft warning for now (user able to choose to proceed) until have determined that implementation works without bugs if (fileExists) { - AlertDialog.Builder builder = new AlertDialog.Builder(context); + AlertDialog.Builder builder = new AlertDialog.Builder(context.get()); builder.setMessage(R.string.file_exists) .setTitle(R.string.warning); builder.setPositiveButton(R.string.no, (dialog, id) -> { //Go back to ContributionsActivity - Intent intent = new Intent(context, ContributionsActivity.class); - context.startActivity(intent); + Intent intent = new Intent(context.get(), ContributionsActivity.class); + context.get().startActivity(intent); callback.onResult(Result.DUPLICATE_CANCELLED); }); builder.setNegativeButton(R.string.yes, (dialog, id) -> callback.onResult(Result.DUPLICATE_PROCEED)); AlertDialog dialog = builder.create(); - dialog.show(); + if (!activity.get().isFinishing()) { + dialog.show(); + } } else { callback.onResult(Result.NO_DUPLICATE); } diff --git a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java index a5756c06b..73b4db034 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/ShareActivity.java @@ -1,7 +1,9 @@ package fr.free.nrw.commons.upload; import android.Manifest; +import android.app.Activity; import android.content.ContentResolver; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -32,6 +34,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.lang.ref.WeakReference; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -371,7 +374,7 @@ public class ShareActivity Timber.d("File SHA1 is: %s", fileSHA1); ExistingFileAsync fileAsyncTask = - new ExistingFileAsync(fileSHA1, this, result -> { + new ExistingFileAsync(new WeakReference(this), fileSHA1, new WeakReference(this), result -> { Timber.d("%s duplicate check: %s", mediaUri.toString(), result); duplicateCheckPassed = (result == DUPLICATE_PROCEED || result == NO_DUPLICATE); diff --git a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java index 6a6083403..a11e7066c 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/upload/SingleUploadFragment.java @@ -101,6 +101,14 @@ public class SingleUploadFragment extends CommonsDaggerSupportFragment { View rootView = inflater.inflate(R.layout.fragment_single_upload, container, false); ButterKnife.bind(this, rootView); + Intent activityIntent = getActivity().getIntent(); + if (activityIntent.hasExtra("title")) { + titleEdit.setText(activityIntent.getStringExtra("title")); + } + if (activityIntent.hasExtra("description")) { + descEdit.setText(activityIntent.getStringExtra("description")); + } + ArrayList licenseItems = new ArrayList<>(); licenseItems.add(getString(R.string.license_name_cc0)); licenseItems.add(getString(R.string.license_name_cc_by)); diff --git a/app/src/main/java/fr/free/nrw/commons/utils/ViewUtil.java b/app/src/main/java/fr/free/nrw/commons/utils/ViewUtil.java index f2a02398f..82227c59a 100644 --- a/app/src/main/java/fr/free/nrw/commons/utils/ViewUtil.java +++ b/app/src/main/java/fr/free/nrw/commons/utils/ViewUtil.java @@ -1,12 +1,12 @@ package fr.free.nrw.commons.utils; -import android.content.Context; -import android.support.annotation.StringRes; -import android.widget.Toast; +import android.support.design.widget.Snackbar; +import android.view.View; public class ViewUtil { - public static void showLongToast(final Context context, @StringRes final int stringResId) { - ExecutorUtils.uiExecutor().execute(() -> Toast.makeText(context, context.getString(stringResId), Toast.LENGTH_LONG).show()); + public static void showSnackbar(View view, int messageResourceId) { + Snackbar.make(view, messageResourceId, Snackbar.LENGTH_SHORT).show(); } + } diff --git a/app/src/main/res/layout-land/welcome_do_upload.xml b/app/src/main/res/layout-land/welcome_do_upload.xml index d96b00675..01e5c2af3 100644 --- a/app/src/main/res/layout-land/welcome_do_upload.xml +++ b/app/src/main/res/layout-land/welcome_do_upload.xml @@ -1,163 +1,189 @@ - + + + + + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintEnd_toStartOf="@id/center_guideline"> + android:scaleType="fitXY" + android:src="@drawable/mount_zao" /> + android:scaleType="fitXY" + android:src="@drawable/llamas" /> + android:scaleType="fitXY" + android:src="@drawable/rainbow_bridge" /> + android:scaleType="fitXY" + android:src="@drawable/tulip" /> - + + + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:gravity="center_horizontal" + android:maxWidth="240dp" + android:text="@string/tutorial_2_text" + android:textAlignment="center" + android:textColor="@android:color/white" + android:textSize="@dimen/normal_text" + android:textStyle="bold" /> + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:maxWidth="240dp" + android:paddingTop="@dimen/standard_gap" + android:text="@string/tutorial_2_subtext_1" + android:textAlignment="textStart" + android:textColor="@android:color/white" /> + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:textColor="@android:color/white" /> + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:textColor="@android:color/white" /> - + + diff --git a/app/src/main/res/layout-land/welcome_dont_upload.xml b/app/src/main/res/layout-land/welcome_dont_upload.xml index d950ffc1d..6d954e2d7 100644 --- a/app/src/main/res/layout-land/welcome_dont_upload.xml +++ b/app/src/main/res/layout-land/welcome_dont_upload.xml @@ -1,59 +1,82 @@ - + xmlns:app="http://schemas.android.com/apk/res-auto" + android:background="#0c609c"> - + android:layout_marginTop="@dimen/standard_gap" + android:text="@string/welcome_skip_button" + android:textColor="#fff" + android:textSize="@dimen/normal_text" + android:textStyle="bold" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + + + + + android:src="@drawable/selfie_x" /> + android:src="@drawable/proprietary_x" /> - + - + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toEndOf="@id/center_guideline" + app:layout_constraintTop_toTopOf="parent" + android:orientation="vertical"> + + android:textStyle="bold" /> + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:maxWidth="240dp" + android:paddingTop="@dimen/standard_gap" + android:text="@string/tutorial_3_subtext_1" + android:textAlignment="textStart" + android:textColor="@android:color/white" /> + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:textColor="@android:color/white" /> @@ -121,24 +142,23 @@ + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:textColor="@android:color/white" /> - + diff --git a/app/src/main/res/layout-land/welcome_image_details.xml b/app/src/main/res/layout-land/welcome_image_details.xml index 79f48829b..e7d704e15 100644 --- a/app/src/main/res/layout-land/welcome_image_details.xml +++ b/app/src/main/res/layout-land/welcome_image_details.xml @@ -1,42 +1,72 @@ - + android:orientation="horizontal"> - + android:layout_height="@dimen/overflow_button_dimen" + android:layout_marginEnd="@dimen/standard_gap" + android:layout_marginRight="@dimen/standard_gap" + android:layout_marginTop="@dimen/standard_gap" + android:text="@string/welcome_skip_button" + android:textColor="#fff" + android:textSize="@dimen/normal_text" + android:textStyle="bold" + android:visibility="gone" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + android:orientation="vertical" + app:layout_constraintGuide_percent="0.60" /> + + + + + + android:textStyle="bold" /> + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:maxWidth="240dp" + android:paddingTop="@dimen/standard_gap" + android:text="@string/tutorial_4_subtext_1" + android:textAlignment="textStart" + android:textColor="@android:color/white" /> @@ -76,21 +105,20 @@ + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:textColor="@android:color/white" /> @@ -103,24 +131,23 @@ + android:text="@string/bullet" + android:textColor="@android:color/white" + android:textSize="16sp" /> + android:textColor="@android:color/white" /> - + diff --git a/app/src/main/res/layout-land/welcome_wikipedia.xml b/app/src/main/res/layout-land/welcome_wikipedia.xml index b4fbe9048..73b96fc14 100644 --- a/app/src/main/res/layout-land/welcome_wikipedia.xml +++ b/app/src/main/res/layout-land/welcome_wikipedia.xml @@ -1,51 +1,76 @@ - + + + + + + + + + + + + - - - - - + android:maxWidth="240dp" + android:paddingTop="@dimen/standard_gap" + android:text="@string/tutorial_1_subtext" + android:textAlignment="center" + android:textColor="@android:color/white" /> - + diff --git a/app/src/main/res/layout/fragment_single_upload.xml b/app/src/main/res/layout/fragment_single_upload.xml index 87285fa5d..a340e0213 100644 --- a/app/src/main/res/layout/fragment_single_upload.xml +++ b/app/src/main/res/layout/fragment_single_upload.xml @@ -1,73 +1,88 @@ - + android:paddingBottom="@dimen/small_gap" + android:paddingEnd="@dimen/standard_gap" + android:paddingLeft="@dimen/standard_gap" + android:paddingRight="@dimen/standard_gap" + android:paddingStart="@dimen/standard_gap" + android:paddingTop="@dimen/small_gap" + android:theme="@style/DarkAppTheme"> - + android:layout_gravity="fill" + android:orientation="vertical"> - + - + + -