Dbrant has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/367705 )

Change subject: Populate remote compilations with response from 
CompilationClient.
......................................................................

Populate remote compilations with response from CompilationClient.

Upon receiving the payload from CompilationClient, this also updates the
user's local compilations with any updated metadata from the remote
compilations (matched on the file name of each compilation).

Bug: T163588
Bug: T163590
Change-Id: I77bc69be5e80b39939b34c41d8dc184ab07f8e39
---
M app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java
M app/src/main/java/org/wikipedia/offline/OfflineManager.java
M app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java
M app/src/main/res/layout/fragment_remote_compilations.xml
4 files changed, 227 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia 
refs/changes/05/367705/1

diff --git 
a/app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java 
b/app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java
index 3eafdaf..b616355 100644
--- a/app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java
+++ b/app/src/main/java/org/wikipedia/offline/LocalCompilationsFragment.java
@@ -185,7 +185,7 @@
             getView().setItem(compilation);
             getView().setTitle(compilation.name());
             getView().setDescription(compilation.description());
-            //TODO: getView().setImageUrl( ... );
+            getView().setImageUrl(compilation.thumbUrl());
             getView().setActionIcon(R.drawable.ic_more_vert_white_24dp);
             
getView().setActionHint(R.string.abc_action_menu_overflow_description);
         }
diff --git a/app/src/main/java/org/wikipedia/offline/OfflineManager.java 
b/app/src/main/java/org/wikipedia/offline/OfflineManager.java
index f352a5b..fff0050 100644
--- a/app/src/main/java/org/wikipedia/offline/OfflineManager.java
+++ b/app/src/main/java/org/wikipedia/offline/OfflineManager.java
@@ -79,6 +79,17 @@
         searchTask.execute();
     }
 
+    public void updateFromRemoteMetadata(@NonNull List<Compilation> 
remoteCompilations) {
+        for (Compilation remoteCompilation : remoteCompilations) {
+            for (Compilation localCompilation : compilations) {
+                if (remoteCompilation.uri() != null
+                        && new 
File(localCompilation.path()).getName().equals(remoteCompilation.uri().getLastPathSegment()))
 {
+                    localCompilation.copyMetadataFrom(remoteCompilation);
+                }
+            }
+        }
+    }
+
     public boolean titleExists(@NonNull String title) {
         for (Compilation c : compilations) {
             if (c.titleExists(title)) {
diff --git 
a/app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java 
b/app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java
index 682f280..bbd7551 100644
--- a/app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java
+++ b/app/src/main/java/org/wikipedia/offline/RemoteCompilationsFragment.java
@@ -4,20 +4,35 @@
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.design.widget.AppBarLayout;
 import android.support.design.widget.CollapsingToolbarLayout;
 import android.support.v4.app.Fragment;
 import android.support.v7.app.AppCompatActivity;
+import android.support.v7.view.ActionMode;
+import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ProgressBar;
 
 import org.wikipedia.R;
+import org.wikipedia.WikipediaApp;
+import org.wikipedia.history.SearchActionModeCallback;
+import org.wikipedia.util.ResourceUtil;
+import org.wikipedia.views.DefaultViewHolder;
+import org.wikipedia.views.DrawableItemDecoration;
+import org.wikipedia.views.PageItemView;
 import org.wikipedia.views.SearchEmptyView;
+import org.wikipedia.views.WikiErrorView;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import butterknife.BindView;
 import butterknife.ButterKnife;
@@ -25,10 +40,24 @@
 
 public class RemoteCompilationsFragment extends Fragment {
     @BindView(R.id.compilation_list_toolbar_container) CollapsingToolbarLayout 
toolbarLayout;
+    @BindView(R.id.compilation_list_app_bar) AppBarLayout appBarLayout;
     @BindView(R.id.compilation_list_toolbar) Toolbar toolbar;
     @BindView(R.id.compilation_list_contents) RecyclerView recyclerView;
     @BindView(R.id.search_empty_view) SearchEmptyView searchEmptyView;
+    @BindView(R.id.compilation_list_progress) ProgressBar progressBar;
+    @BindView(R.id.compilation_list_error) WikiErrorView errorView;
     private Unbinder unbinder;
+
+    private boolean updating;
+    private Throwable lastError;
+    private CompilationCallback compilationCallback = new 
CompilationCallback();
+    private CompilationItemAdapter adapter = new CompilationItemAdapter();
+    private ItemCallback itemCallback = new ItemCallback();
+
+    private SearchCallback searchActionModeCallback = new SearchCallback();
+    @NonNull private List<Compilation> allItems = new ArrayList<>();
+    @NonNull private List<Compilation> displayedItems = new ArrayList<>();
+    private String currentSearchQuery;
 
     @NonNull
     public static RemoteCompilationsFragment newInstance() {
@@ -49,6 +78,20 @@
         getAppCompatActivity().setSupportActionBar(toolbar);
         
getAppCompatActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(true);
         getAppCompatActivity().getSupportActionBar().setTitle("");
+
+        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
+        recyclerView.setAdapter(adapter);
+        recyclerView.addItemDecoration(new DrawableItemDecoration(getContext(),
+                ResourceUtil.getThemedAttributeId(getContext(), 
R.attr.list_separator_drawable), true));
+
+        errorView.setRetryClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                beginUpdate();
+            }
+        });
+
+        beginUpdate();
 
         return view;
     }
@@ -75,13 +118,170 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.menu_search_compilations:
-                // TODO
+                ((AppCompatActivity) 
getActivity()).startSupportActionMode(searchActionModeCallback);
                 return true;
             default:
                 return super.onOptionsItemSelected(item);
         }
     }
 
+    private void beginUpdate() {
+        updating = true;
+        lastError = null;
+        new 
CompilationClient().request(WikipediaApp.getInstance().getWikiSite(), 
compilationCallback);
+        updateEmptyState();
+    }
+
+    private void setSearchQuery(@Nullable String query) {
+        currentSearchQuery = query;
+        displayedItems.clear();
+        if (TextUtils.isEmpty(query)) {
+            displayedItems.addAll(allItems);
+        } else {
+            query = query.toUpperCase();
+            for (Compilation c : allItems) {
+                if (c.name().toUpperCase().contains(query.toUpperCase())) {
+                    displayedItems.add(c);
+                }
+            }
+        }
+        adapter.notifyDataSetChanged();
+        updateEmptyState(query);
+    }
+
+    private void updateEmptyState() {
+        updateEmptyState(currentSearchQuery);
+    }
+
+    private void updateEmptyState(@Nullable String searchQuery) {
+        progressBar.setVisibility(updating ? View.VISIBLE : View.GONE);
+        if (lastError != null) {
+            errorView.setError(lastError);
+            errorView.setVisibility(View.VISIBLE);
+            searchEmptyView.setVisibility(View.GONE);
+            recyclerView.setVisibility(View.GONE);
+            return;
+        }
+        if (TextUtils.isEmpty(searchQuery)) {
+            searchEmptyView.setVisibility(View.GONE);
+            recyclerView.setVisibility(View.VISIBLE);
+        } else {
+            recyclerView.setVisibility(displayedItems.isEmpty() ? View.GONE : 
View.VISIBLE);
+            searchEmptyView.setVisibility(displayedItems.isEmpty() ? 
View.VISIBLE : View.GONE);
+        }
+    }
+
+    private class CompilationItemHolder extends 
DefaultViewHolder<PageItemView<Compilation>> {
+        private Compilation compilation;
+
+        CompilationItemHolder(PageItemView<Compilation> itemView) {
+            super(itemView);
+        }
+
+        void bindItem(Compilation compilation) {
+            this.compilation = compilation;
+            getView().setItem(compilation);
+            getView().setTitle(compilation.name());
+            getView().setDescription(compilation.description());
+            getView().setImageUrl(compilation.thumbUrl());
+            getView().setActionIcon(R.drawable.ic_more_vert_white_24dp);
+            
getView().setActionHint(R.string.abc_action_menu_overflow_description);
+        }
+    }
+
+    private final class CompilationItemAdapter extends 
RecyclerView.Adapter<RecyclerView.ViewHolder> {
+        @Override
+        public int getItemCount() {
+            return displayedItems.size();
+        }
+
+        @Override
+        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
int type) {
+            return new CompilationItemHolder(new 
PageItemView<Compilation>(getContext()));
+        }
+
+        @Override
+        public void onBindViewHolder(RecyclerView.ViewHolder holder, int pos) {
+            ((CompilationItemHolder) holder).bindItem(displayedItems.get(pos));
+        }
+
+        @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder 
holder) {
+            super.onViewAttachedToWindow(holder);
+            ((CompilationItemHolder) 
holder).getView().setCallback(itemCallback);
+        }
+
+        @Override public void onViewDetachedFromWindow(RecyclerView.ViewHolder 
holder) {
+            ((CompilationItemHolder) holder).getView().setCallback(null);
+            super.onViewDetachedFromWindow(holder);
+        }
+    }
+
+    private class ItemCallback implements PageItemView.Callback<Compilation> {
+        @Override
+        public void onClick(@Nullable Compilation item) {
+            startActivity(CompilationDetailActivity.newIntent(getContext()));
+        }
+
+        @Override
+        public boolean onLongClick(@Nullable Compilation item) {
+            return true;
+        }
+
+        @Override
+        public void onThumbClick(@Nullable Compilation item) {
+            onClick(item);
+        }
+
+        @Override
+        public void onActionClick(@Nullable Compilation item, @NonNull 
PageItemView view) {
+        }
+
+        @Override
+        public void onSecondaryActionClick(@Nullable Compilation item, 
@NonNull PageItemView view) {
+        }
+    }
+
+    private class SearchCallback extends SearchActionModeCallback {
+        @Override
+        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
+            appBarLayout.setExpanded(false, true);
+            return super.onCreateActionMode(mode, menu);
+        }
+
+        @Override
+        protected void onQueryChange(String s) {
+            setSearchQuery(s);
+        }
+
+        @Override
+        public void onDestroyActionMode(ActionMode mode) {
+            super.onDestroyActionMode(mode);
+            setSearchQuery(null);
+        }
+
+        @Override
+        protected String getSearchHintString() {
+            return getString(R.string.offline_compilations_search_by_name);
+        }
+    }
+
+    private class CompilationCallback implements CompilationClient.Callback {
+        @Override
+        public void success(@NonNull List<Compilation> compilations) {
+            allItems = compilations;
+            updating = false;
+            OfflineManager.instance().updateFromRemoteMetadata(compilations);
+            setSearchQuery(currentSearchQuery);
+        }
+
+        @Override
+        public void error(@NonNull Throwable caught) {
+            updating = false;
+            lastError = caught;
+            updateEmptyState();
+        }
+    }
+
     private AppCompatActivity getAppCompatActivity() {
         return (AppCompatActivity) getActivity();
     }
diff --git a/app/src/main/res/layout/fragment_remote_compilations.xml 
b/app/src/main/res/layout/fragment_remote_compilations.xml
index 2824f2d..d38b359 100644
--- a/app/src/main/res/layout/fragment_remote_compilations.xml
+++ b/app/src/main/res/layout/fragment_remote_compilations.xml
@@ -85,16 +85,21 @@
                 android:layout_height="match_parent"
                 android:background="?attr/window_background_color"/>
 
-            <TextView
-                android:id="@+id/compilation_list_empty_text"
-                android:layout_width="match_parent"
+            <ProgressBar
+                android:id="@+id/compilation_list_progress"
+                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:gravity="center"
-                android:padding="16dp"
-                android:textSize="16sp"
-                android:text="@string/reading_list_empty"
-                android:visibility="gone"
-                tools:visibility="gone"/>
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="48dp"
+                android:visibility="gone"/>
+
+            <org.wikipedia.views.WikiErrorView
+                android:id="@+id/compilation_list_error"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="48dp"
+                android:visibility="gone"/>
 
             <org.wikipedia.views.SearchEmptyView
                 android:id="@+id/search_empty_view"

-- 
To view, visit https://gerrit.wikimedia.org/r/367705
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I77bc69be5e80b39939b34c41d8dc184ab07f8e39
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to