Skip to content

Commit

Permalink
Merge branch 'develop' into gutenberg/integrate_release_1.44.0
Browse files Browse the repository at this point in the history
  • Loading branch information
guarani committed Jan 8, 2021
2 parents b0bc22f + 5279814 commit d9e0a8b
Show file tree
Hide file tree
Showing 183 changed files with 5,921 additions and 2,171 deletions.
3 changes: 3 additions & 0 deletions RELEASE-NOTES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
* [***] Block Editor: Full-width and wide alignment support for Columns (https://github.com/wordpress-mobile/gutenberg-mobile/pull/2919)
* [**] Block Editor: Image block - Add link picker to the block settings and enhance link settings with auto-hide options (https://github.com/wordpress-mobile/gutenberg-mobile/pull/2841)
* [*] Block Editor: Fix button link setting, rel link will not be overwritten if modified by the user (https://github.com/wordpress-mobile/gutenberg-mobile/pull/2894)
[***] Block Editor: Cross-post suggestions are now available by typing the + character (or long-pressing the toolbar button labelled with an @-symbol) in a post on a P2 site [https://github.com/wordpress-mobile/WordPress-Android/pull/13184]
[***] Activity Log: Adds support for Date Range and Activity Type filters. [https://github.com/wordpress-mobile/WordPress-Android/issues/13268]
* [**] Page List: Adds duplicate page functionality [https://github.com/wordpress-mobile/WordPress-Android/pull/13607]


16.4
Expand Down
7 changes: 5 additions & 2 deletions WordPress/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,13 @@ android {
buildConfigField "boolean", "ANY_FILE_UPLOAD", "true"
buildConfigField "boolean", "CONSOLIDATED_MEDIA_PICKER", "false"
buildConfigField "boolean", "ACTIVITY_LOG_FILTERS", "false"
buildConfigField "boolean", "BACKUPS_AVAILABLE", "false"
buildConfigField "boolean", "SCAN_AVAILABLE", "false"
buildConfigField "boolean", "ENABLE_FEATURE_CONFIGURATION", "true"
buildConfigField "boolean", "MY_SITE_IMPROVEMENTS", "false"
buildConfigField "boolean", "BACKUP_AVAILABLE", "false"
buildConfigField "boolean", "FOLLOW_UNFOLLOW_COMMENTS", "false"
buildConfigField "boolean", "UNREAD_POSTS_COUNT", "false"
}

// Gutenberg's dependency - react-native-video is using
Expand All @@ -98,9 +100,9 @@ android {
dimension "buildType"
// Only set the release version if one isn't provided
if (!project.hasProperty("versionName")) {
versionName "16.4-rc-3"
versionName "16.4"
}
versionCode 973
versionCode 975
buildConfigField "boolean", "ME_ACTIVITY_AVAILABLE", "false"
buildConfigField "boolean", "TENOR_AVAILABLE", "false"
buildConfigField "long", "REMOTE_CONFIG_FETCH_INTERVAL", "3600"
Expand All @@ -122,6 +124,7 @@ android {
dimension "buildType"
// Enable this for testing consolidated media picker
// buildConfigField "boolean", "CONSOLIDATED_MEDIA_PICKER", "true"
buildConfigField "boolean", "UNREAD_POSTS_COUNT", "true"
}

jalapeno { // Pre-Alpha version, used for PR builds, can be installed along release, alpha, beta, dev versions
Expand Down
8 changes: 7 additions & 1 deletion WordPress/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -641,12 +641,18 @@
android:label="@string/activity_log_event"
android:theme="@style/WordPress.NoActionBar"/>

<!--Scan-->
<!-- Jetpack - Scan-->
<activity
android:name=".ui.jetpack.scan.ScanActivity"
android:label="@string/scan"
android:theme="@style/WordPress.NoActionBar"/>

<!-- Jetpack - Threat Details-->
<activity
android:name=".ui.jetpack.scan.details.ThreatDetailsActivity"
android:label="@string/threat_details"
android:theme="@style/WordPress.NoActionBar"/>

<!--Domain Registration-->
<activity
android:name=".ui.domains.DomainRegistrationActivity"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ protected static void createTables(SQLiteDatabase db) {
+ " is_notifications_enabled INTEGER DEFAULT 0,"
+ " date_updated TEXT,"
+ " organization_id INTEGER DEFAULT 0,"
+ " unseen_count INTEGER DEFAULT 0,"
+ " PRIMARY KEY (blog_id)"
+ ")");
}
Expand Down Expand Up @@ -116,6 +117,7 @@ private static ReaderBlog getBlogInfoFromCursor(Cursor c) {
blogInfo.isNotificationsEnabled = SqlUtils.sqlToBool(c.getInt(c.getColumnIndex("is_notifications_enabled")));
blogInfo.numSubscribers = c.getInt(c.getColumnIndex("num_followers"));
blogInfo.organizationId = c.getInt(c.getColumnIndex("organization_id"));
blogInfo.numUnseenPosts = c.getInt(c.getColumnIndex("unseen_count"));

return blogInfo;
}
Expand All @@ -126,8 +128,9 @@ public static void addOrUpdateBlog(ReaderBlog blogInfo) {
}
String sql = "INSERT OR REPLACE INTO tbl_blog_info"
+ " (blog_id, feed_id, blog_url, image_url, feed_url, name, description, is_private, is_jetpack, "
+ " is_following, is_notifications_enabled, num_followers, date_updated, organization_id)"
+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14)";
+ " is_following, is_notifications_enabled, num_followers, date_updated, "
+ " organization_id, unseen_count)"
+ " VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15)";
SQLiteStatement stmt = ReaderDatabase.getWritableDb().compileStatement(sql);
try {
stmt.bindLong(1, blogInfo.blogId);
Expand All @@ -144,6 +147,7 @@ public static void addOrUpdateBlog(ReaderBlog blogInfo) {
stmt.bindLong(12, blogInfo.numSubscribers);
stmt.bindString(13, DateTimeUtils.iso8601FromDate(new Date()));
stmt.bindLong(14, blogInfo.organizationId);
stmt.bindLong(15, blogInfo.numUnseenPosts);
stmt.execute();
} finally {
SqlUtils.closeStatement(stmt);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
*/
public class ReaderDatabase extends SQLiteOpenHelper {
protected static final String DB_NAME = "wpreader.db";
private static final int DB_VERSION = 146;
private static final int DB_VERSION = 147;
private static final int DB_LAST_VERSION_WITHOUT_MIGRATION_SCRIPT = 136; // do not change this value

/*
Expand Down Expand Up @@ -105,6 +105,7 @@ public class ReaderDatabase extends SQLiteOpenHelper {
* 144 - added tbl_posts.is_wpforteams_site
* 145 - added tbl_blog_info.is_wp_for_teams
* 146 - replaced tbl_blog_info.is_wp_for_teams and tbl_posts.is_wpforteams_site with organization_id
* 147 - added tbl_blog_info.unseen_count
*/

/*
Expand Down Expand Up @@ -223,6 +224,9 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE tbl_blog_info ADD organization_id INTEGER;");
db.execSQL("ALTER TABLE tbl_posts ADD organization_id INTEGER;");
currentVersion++;
case 146:
db.execSQL("ALTER TABLE tbl_blog_info ADD unseen_count INTEGER;");
currentVersion++;
}
if (currentVersion != newVersion) {
throw new RuntimeException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class ReaderBlog {
public boolean isNotificationsEnabled;
public int numSubscribers;
public int organizationId;
public int numUnseenPosts;

private String mName;
private String mDescription;
Expand Down Expand Up @@ -81,6 +82,10 @@ public static ReaderBlog fromJson(JSONObject json) {
blog.numSubscribers = json.optInt("subscribers_count");
}

if (json.has("unseen_count")) {
blog.numUnseenPosts = json.optInt("unseen_count");
}

// blogId will be empty for feeds, so set it to the feedId (consistent with /read/ endpoints)
if (blog.blogId == 0 && blog.feedId != 0) {
blog.blogId = blog.feedId;
Expand Down Expand Up @@ -192,6 +197,7 @@ public boolean isSameAs(ReaderBlog blogInfo) {
&& this.isFollowing == blogInfo.isFollowing
&& this.isPrivate == blogInfo.isPrivate
&& this.numSubscribers == blogInfo.numSubscribers
&& this.numUnseenPosts == blogInfo.numUnseenPosts
&& this.getName().equals(blogInfo.getName())
&& this.getDescription().equals(blogInfo.getDescription())
&& this.getUrl().equals(blogInfo.getUrl())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@
import org.wordpress.android.ui.jetpack.backup.download.complete.BackupDownloadCompleteFragment;
import org.wordpress.android.ui.jetpack.backup.download.details.BackupDownloadDetailsFragment;
import org.wordpress.android.ui.jetpack.backup.download.progress.BackupDownloadProgressFragment;
import org.wordpress.android.ui.jetpack.scan.ScanActivity;
import org.wordpress.android.ui.jetpack.scan.ScanFragment;
import org.wordpress.android.ui.jetpack.scan.details.ThreatDetailsFragment;
import org.wordpress.android.ui.main.AddContentAdapter;
import org.wordpress.android.ui.main.MainBottomSheetFragment;
import org.wordpress.android.ui.main.MeFragment;
Expand Down Expand Up @@ -469,10 +469,10 @@ public interface AppComponent extends AndroidInjector<WordPress> {

void inject(ActivityLogDetailFragment object);

void inject(ScanActivity object);

void inject(ScanFragment object);

void inject(ThreatDetailsFragment object);

void inject(PluginListFragment object);

void inject(PluginDetailActivity object);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.wordpress.android.ui.jetpack.backup.download.details.BackupDownloadDetailsViewModel;
import org.wordpress.android.ui.jetpack.backup.download.progress.BackupDownloadProgressViewModel;
import org.wordpress.android.ui.jetpack.scan.ScanViewModel;
import org.wordpress.android.ui.jetpack.scan.details.ThreatDetailsViewModel;
import org.wordpress.android.ui.main.MeViewModel;
import org.wordpress.android.ui.mediapicker.MediaPickerViewModel;
import org.wordpress.android.ui.mysite.MySiteViewModel;
Expand Down Expand Up @@ -438,6 +439,11 @@ abstract class ViewModelModule {
@ViewModelKey(ScanViewModel.class)
abstract ViewModel scanViewModel(ScanViewModel viewModel);

@Binds
@IntoMap
@ViewModelKey(ThreatDetailsViewModel.class)
abstract ViewModel threatDetailsViewModel(ThreatDetailsViewModel viewModel);

@Binds
@IntoMap
@ViewModelKey(MySiteViewModel.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import org.wordpress.android.ui.history.HistoryDetailContainerFragment;
import org.wordpress.android.ui.history.HistoryListItem.Revision;
import org.wordpress.android.ui.jetpack.backup.download.BackupDownloadActivity;
import org.wordpress.android.ui.jetpack.scan.details.ThreatDetailsActivity;
import org.wordpress.android.ui.main.MeActivity;
import org.wordpress.android.ui.main.SitePickerActivity;
import org.wordpress.android.ui.main.SitePickerAdapter.SitePickerMode;
Expand Down Expand Up @@ -115,6 +116,7 @@
import static org.wordpress.android.login.LoginMode.WPCOM_LOGIN_ONLY;
import static org.wordpress.android.ui.WPWebViewActivity.ENCODING_UTF8;
import static org.wordpress.android.ui.jetpack.backup.download.BackupDownloadViewModelKt.KEY_BACKUP_DOWNLOAD_ACTIVITY_ID_KEY;
import static org.wordpress.android.ui.jetpack.scan.ScanFragment.ARG_THREAT_ID;
import static org.wordpress.android.ui.media.MediaBrowserActivity.ARG_BROWSER_TYPE;
import static org.wordpress.android.ui.pages.PagesActivityKt.EXTRA_PAGE_REMOTE_ID_KEY;
import static org.wordpress.android.ui.stories.StoryComposerActivity.KEY_ALL_UNFLATTENED_LOADED_SLIDES;
Expand Down Expand Up @@ -623,6 +625,12 @@ public static void viewScan(Activity activity, SiteModel site) {
activity.startActivity(intent);
}

public static void viewThreatDetails(Activity activity, @NonNull Long threatId) {
Intent intent = new Intent(activity, ThreatDetailsActivity.class);
intent.putExtra(ARG_THREAT_ID, threatId);
activity.startActivity(intent);
}

public static void viewBlogSettingsForResult(Activity activity, SiteModel site) {
Intent intent = new Intent(activity, BlogPreferencesActivity.class);
intent.putExtra(WordPress.SITE, site);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,12 +222,15 @@ class ActivityLogListFragment : Fragment() {
private fun updateFilters(uiState: FiltersShown) {
with(requireActivity().date_range_picker) {
text = uiHelpers.getTextOfUiString(requireContext(), uiState.dateRangeLabel)
contentDescription = uiHelpers.getTextOfUiString(requireContext(), uiState.dateRangeLabelContentDescription)
isCloseIconVisible = uiState.onClearDateRangeFilterClicked != null
setOnCloseIconClickListener { uiState.onClearDateRangeFilterClicked?.invoke() }
}

with(requireActivity().activity_type_filter) {
text = uiHelpers.getTextOfUiString(requireContext(), uiState.activityTypeLabel)
contentDescription = uiHelpers
.getTextOfUiString(requireContext(), uiState.activityTypeLabelContentDescription)
isCloseIconVisible = uiState.onClearActivityTypeFilterClicked != null
setOnCloseIconClickListener { uiState.onClearActivityTypeFilterClicked?.invoke() }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,11 @@ class ActivityLogTypeFilterFragment : DialogFragment() {
}

private fun refreshErrorScreen(uiState: Error) {
uiHelpers.setTextOrHide(actionable_empty_view.title, uiState.errorTitle)
uiHelpers.setTextOrHide(actionable_empty_view.subtitle, uiState.errorSubtitle)
uiHelpers.setTextOrHide(actionable_empty_view.button, uiState.errorButtonText)
actionable_empty_view.button.setOnClickListener { uiState.retryAction.action.invoke() }
actionable_empty_view.image.setImageResource(uiState.image)
uiHelpers.setTextOrHide(actionable_empty_view.title, uiState.title)
uiHelpers.setTextOrHide(actionable_empty_view.subtitle, uiState.subtitle)
uiHelpers.setTextOrHide(actionable_empty_view.button, uiState.buttonText)
actionable_empty_view.button.setOnClickListener { uiState.retryAction?.action?.invoke() }
}

private fun refreshContentScreen(uiState: Content) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.wordpress.android.ui.activitylog.list.filter

import androidx.core.util.Pair
import androidx.annotation.DrawableRes
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import kotlinx.coroutines.CoroutineDispatcher
Expand All @@ -14,6 +14,7 @@ import org.wordpress.android.fluxc.store.ActivityLogStore.FetchActivityTypesPayl
import org.wordpress.android.modules.BG_THREAD
import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.ui.activitylog.list.filter.ActivityLogTypeFilterViewModel.UiState.Content
import org.wordpress.android.ui.activitylog.list.filter.ActivityLogTypeFilterViewModel.UiState.Error
import org.wordpress.android.ui.activitylog.list.filter.ActivityLogTypeFilterViewModel.UiState.FullscreenLoading
import org.wordpress.android.ui.utils.UiString
import org.wordpress.android.ui.utils.UiString.UiStringRes
Expand Down Expand Up @@ -77,10 +78,12 @@ class ActivityLogTypeFilterViewModel @Inject constructor(
}

private fun buildErrorUiState() =
UiState.Error(Action(UiStringRes(R.string.retry)).apply { action = ::onRetryClicked })
Error.ConnectionError(Action(UiStringRes(R.string.retry)).apply { action = ::onRetryClicked })

private suspend fun buildContentUiState(activityTypes: List<ActivityTypeModel>): Content {
private suspend fun buildContentUiState(activityTypes: List<ActivityTypeModel>): UiState {
return withContext(bgDispatcher) {
if (activityTypes.isEmpty()) { return@withContext Error.NoActivitiesError }

val headerListItem = ListItemUiState.SectionHeader(
UiStringRes(R.string.activity_log_activity_type_filter_header)
)
Expand All @@ -96,7 +99,7 @@ class ActivityLogTypeFilterViewModel @Inject constructor(
Content(
listOf(headerListItem) + activityTypeListItems,
primaryAction = Action(label = UiStringRes(R.string.activity_log_activity_type_filter_apply))
.apply { action = ::onApplyClicked },
.apply { action = { onApplyClicked(activityTypes) } },
secondaryAction = Action(label = UiStringRes(R.string.activity_log_activity_type_filter_clear))
.apply { action = ::onClearClicked }
)
Expand All @@ -116,8 +119,11 @@ class ActivityLogTypeFilterViewModel @Inject constructor(
}
}

private fun onApplyClicked() {
parentViewModel.onActivityTypesSelected(getSelectedActivityTypeIds())
private fun onApplyClicked(activityTypes: List<ActivityTypeModel>) {
val selectedModels = getSelectedActivityTypeIds().mapNotNull { key ->
activityTypes.find { model -> model.key == key }
}
parentViewModel.onActivityTypesSelected(selectedModels)
_dismissDialog.value = Event(Unit)
}

Expand All @@ -140,11 +146,11 @@ class ActivityLogTypeFilterViewModel @Inject constructor(
}
}

private fun getSelectedActivityTypeIds(): List<Pair<String, UiString>> =
private fun getSelectedActivityTypeIds(): List<String> =
(_uiState.value as Content).items
.filterIsInstance(ListItemUiState.ActivityType::class.java)
.filter { it.checked }
.map { Pair(it.id, it.title) }
.map { it.id }

sealed class UiState {
open val contentVisibility = false
Expand All @@ -156,13 +162,26 @@ class ActivityLogTypeFilterViewModel @Inject constructor(
val loadingText: UiString = UiStringRes(R.string.loading)
}

data class Error(val retryAction: Action) : UiState() {
sealed class Error : UiState() {
override val errorVisibility = true
abstract val image: Int
abstract val title: UiString
abstract val subtitle: UiString
open val buttonText: UiString? = null
open val retryAction: Action? = null

data class ConnectionError(override val retryAction: Action) : Error() {
@DrawableRes override val image = R.drawable.img_illustration_cloud_off_152dp
override val title: UiString = UiStringRes(R.string.activity_log_activity_type_error_title)
override val subtitle: UiString = UiStringRes(R.string.activity_log_activity_type_error_subtitle)
override val buttonText: UiString = UiStringRes(R.string.retry)
}

// TODO malinjir replace strings according to design
val errorTitle: UiString = UiStringRes(R.string.error)
val errorSubtitle: UiString = UiStringRes(R.string.hpp_retry_error)
val errorButtonText: UiString = UiStringRes(R.string.retry)
object NoActivitiesError : Error() {
@DrawableRes override val image = R.drawable.img_illustration_empty_results_216dp
override val title = UiStringRes(R.string.activity_log_activity_type_empty_title)
override val subtitle = UiStringRes(R.string.activity_log_activity_type_empty_subtitle)
}
}

data class Content(
Expand Down
Loading

0 comments on commit d9e0a8b

Please sign in to comment.