Merge branch 'master' into search-language-fix

This commit is contained in:
Isaac Hutt 2017-12-04 19:28:15 +00:00 committed by GitHub
commit 6335d524de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 116 additions and 71 deletions

View File

@ -29,6 +29,7 @@ import static android.support.test.espresso.Espresso.onData;
import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.longClick; import static android.support.test.espresso.action.ViewActions.longClick;
import static android.support.test.espresso.action.ViewActions.swipeDown;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withParent; import static android.support.test.espresso.matcher.ViewMatchers.withParent;
@ -103,8 +104,8 @@ public class DownloadTest {
allOf(withText("Device"), isDisplayed())); allOf(withText("Device"), isDisplayed()));
appCompatTextView3.perform(click()); appCompatTextView3.perform(click());
onView(withId(R.id.menu_rescan_fs)) onView(withId(R.id.zim_swiperefresh))
.perform(click()); .perform(swipeDown());
/* /*
Commented out the following as it uses another Activity. Commented out the following as it uses another Activity.

View File

@ -45,6 +45,7 @@ import static android.support.test.espresso.Espresso.openContextualActionModeOve
import static android.support.test.espresso.action.ViewActions.click; import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.longClick; import static android.support.test.espresso.action.ViewActions.longClick;
import static android.support.test.espresso.action.ViewActions.scrollTo; import static android.support.test.espresso.action.ViewActions.scrollTo;
import static android.support.test.espresso.action.ViewActions.swipeDown;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText; import static android.support.test.espresso.matcher.ViewMatchers.withText;
@ -130,8 +131,8 @@ public class NetworkTest {
onView(withText(R.string.local_zims)) onView(withText(R.string.local_zims))
.perform(click()); .perform(click());
onView(withId(R.id.menu_rescan_fs)) onView(withId(R.id.zim_swiperefresh))
.perform(click()); .perform(swipeDown());
onData(withContent("wikipedia_ab_all_2017-03")).inAdapterView(withId(R.id.zimfilelist)).perform(click()); onData(withContent("wikipedia_ab_all_2017-03")).inAdapterView(withId(R.id.zimfilelist)).perform(click());

View File

@ -1565,6 +1565,19 @@ public class KiwixMobileActivity extends BaseActivity implements WebViewCallback
return true; return true;
} }
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (drawerLayout.isDrawerOpen(tabDrawerLeftContainer)) {
drawerLayout.closeDrawer(tabDrawerLeftContainer);
}
if (drawerLayout.isDrawerOpen(tableDrawerRightContainer)) {
drawerLayout.closeDrawer(tableDrawerRightContainer);
}
return super.onMenuOpened(featureId, menu);
}
// This method refreshes the menu for the bookmark system. // This method refreshes the menu for the bookmark system.
@Override @Override
public boolean onPrepareOptionsMenu(Menu menu) { public boolean onPrepareOptionsMenu(Menu menu) {

View File

@ -43,6 +43,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -74,10 +75,13 @@ public class ZimContentProvider extends ContentProvider {
@Inject public static Context context; @Inject public static Context context;
private static ArrayList<String> listedEntries;
public void setupDagger() { public void setupDagger() {
KiwixApplication.getInstance().getApplicationComponent().inject(this); KiwixApplication.getInstance().getApplicationComponent().inject(this);
setIcuDataDirectory(); setIcuDataDirectory();
jniSearcher = new JNIKiwixSearcher(); jniSearcher = new JNIKiwixSearcher();
listedEntries = new ArrayList<>();
} }
@ -105,7 +109,12 @@ public class ZimContentProvider extends ContentProvider {
public synchronized static String setZimFile(String fileName) { public synchronized static String setZimFile(String fileName) {
JNIKiwixReader reader = new JNIKiwixReader(fileName); JNIKiwixReader reader = new JNIKiwixReader(fileName);
jniSearcher.addKiwixReader(reader);
if(!listedEntries.contains(reader.getId())) {
listedEntries.add(reader.getId());
jniSearcher.addKiwixReader(reader);
}
if (!new File(fileName).exists() || reader == null) { if (!new File(fileName).exists() || reader == null) {
Log.e(TAG_KIWIX, "Unable to open the ZIM file " + fileName); Log.e(TAG_KIWIX, "Unable to open the ZIM file " + fileName);
zimFileName = null; zimFileName = null;

View File

@ -63,8 +63,6 @@ public class ZimManageActivity extends AppCompatActivity {
public Toolbar toolbar; public Toolbar toolbar;
public MenuItem refeshItem;
private MenuItem searchItem; private MenuItem searchItem;
private MenuItem languageItem; private MenuItem languageItem;
@ -129,17 +127,14 @@ public class ZimManageActivity extends AppCompatActivity {
return; return;
switch (position) { switch (position) {
case 0: case 0:
refeshItem.setVisible(true);
searchItem.setVisible(false); searchItem.setVisible(false);
languageItem.setVisible(false); languageItem.setVisible(false);
break; break;
case 1: case 1:
refeshItem.setVisible(false);
searchItem.setVisible(true); searchItem.setVisible(true);
languageItem.setVisible(true); languageItem.setVisible(true);
break; break;
case 2: case 2:
refeshItem.setVisible(false);
searchItem.setVisible(false); searchItem.setVisible(false);
languageItem.setVisible(false); languageItem.setVisible(false);
break; break;
@ -195,7 +190,6 @@ public class ZimManageActivity extends AppCompatActivity {
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present. // Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_zim_manager, menu); getMenuInflater().inflate(R.menu.menu_zim_manager, menu);
refeshItem = menu.findItem(R.id.menu_rescan_fs);
searchItem = menu.findItem(R.id.action_search); searchItem = menu.findItem(R.id.action_search);
languageItem = menu.findItem(R.id.select_language); languageItem = menu.findItem(R.id.select_language);
searchView = (SearchView) searchItem.getActionView(); searchView = (SearchView) searchItem.getActionView();
@ -233,12 +227,6 @@ public class ZimManageActivity extends AppCompatActivity {
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.menu_rescan_fs: {
if (mViewPager.getCurrentItem() == 0) {
ZimFileSelectFragment fragment = (ZimFileSelectFragment) mSectionsPagerAdapter.getItem(0);
fragment.refreshFragment();
}
}
case R.id.select_language: case R.id.select_language:
if (mViewPager.getCurrentItem() == 1) if (mViewPager.getCurrentItem() == 1)
showLanguageSelect(); showLanguageSelect();

View File

@ -31,6 +31,7 @@ import android.os.Environment;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -78,11 +79,13 @@ public class ZimFileSelectFragment extends Fragment
public static final String TAG_KIWIX = "kiwix"; public static final String TAG_KIWIX = "kiwix";
public static ZimManageActivity context; public static ZimManageActivity context;
public RelativeLayout llLayout; public RelativeLayout llLayout;
public SwipeRefreshLayout swipeRefreshLayout;
private RescanDataAdapter mRescanAdapter; private RescanDataAdapter mRescanAdapter;
private ArrayList<LibraryNetworkEntity.Book> mFiles; private ArrayList<LibraryNetworkEntity.Book> mFiles;
private ListView mZimFileList; private ListView mZimFileList;
private RelativeLayout progressBar;
private TextView mFileMessage; private TextView mFileMessage;
private boolean mHasRefresh;
private BookDao bookDao; private BookDao bookDao;
@ -106,7 +109,18 @@ public class ZimFileSelectFragment extends Fragment
mZimFileList = (ListView) llLayout.findViewById(R.id.zimfilelist); mZimFileList = (ListView) llLayout.findViewById(R.id.zimfilelist);
mFiles = new ArrayList<>(); mFiles = new ArrayList<>();
progressBar = (RelativeLayout) super.getActivity().getLayoutInflater().inflate(R.layout.progress_bar, null);
// SwipeRefreshLayout for the list view
swipeRefreshLayout = (SwipeRefreshLayout) llLayout.findViewById(R.id.zim_swiperefresh);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshFragment();
}
});
// A boolean to distinguish between a user refresh and a normal loading
mHasRefresh = false;
mRescanAdapter = new RescanDataAdapter(ZimFileSelectFragment.context, 0, mFiles); mRescanAdapter = new RescanDataAdapter(ZimFileSelectFragment.context, 0, mFiles);
@ -114,7 +128,7 @@ public class ZimFileSelectFragment extends Fragment
ZimContentProvider.canIterate = true; ZimContentProvider.canIterate = true;
presenter.loadLocalZimFileFromDb(context); presenter.loadLocalZimFileFromDb(context);
bookDao = new BookDao(KiwixDatabase.getInstance(context)); bookDao = new BookDao(KiwixDatabase.getInstance(context));
return llLayout; // We must return the loaded Layout return llLayout; // We must return the loaded Layout
} }
@ -158,9 +172,13 @@ public class ZimFileSelectFragment extends Fragment
checkPermissions(); checkPermissions();
} }
public void refreshFragment(){ public void refreshFragment() {
if (mZimFileList == null) if (mZimFileList == null) {
swipeRefreshLayout.setRefreshing(false);
return; return;
}
mHasRefresh = true;
presenter.loadLocalZimFileFromDb(context); presenter.loadLocalZimFileFromDb(context);
} }
@ -171,6 +189,7 @@ public class ZimFileSelectFragment extends Fragment
mFiles.add(book); mFiles.add(book);
mRescanAdapter.notifyDataSetChanged(); mRescanAdapter.notifyDataSetChanged();
bookDao.saveBooks(mFiles); bookDao.saveBooks(mFiles);
checkEmpty();
} }
} }
@ -195,13 +214,16 @@ public class ZimFileSelectFragment extends Fragment
} }
public void getFiles() { public void getFiles() {
if (mZimFileList.getFooterViewsCount() != 0) if (swipeRefreshLayout.isRefreshing() && !mHasRefresh)
return; return;
TestingUtils.bindResource(ZimFileSelectFragment.class); TestingUtils.bindResource(ZimFileSelectFragment.class);
mZimFileList.addFooterView(progressBar); swipeRefreshLayout.setRefreshing(true);
mZimFileList.setAdapter(mRescanAdapter); mZimFileList.setAdapter(mRescanAdapter);
// Set mHasRefresh to false to prevent loops
mHasRefresh = false;
checkEmpty(); checkEmpty();
new FileSearch(context, new FileSearch.ResultListener() { new FileSearch(context, new FileSearch.ResultListener() {
@ -238,9 +260,11 @@ public class ZimFileSelectFragment extends Fragment
context.runOnUiThread(() -> { context.runOnUiThread(() -> {
mRescanAdapter.notifyDataSetChanged(); mRescanAdapter.notifyDataSetChanged();
bookDao.saveBooks(mFiles); bookDao.saveBooks(mFiles);
mZimFileList.removeFooterView(progressBar);
checkEmpty(); checkEmpty();
TestingUtils.unbindResource(ZimFileSelectFragment.class); TestingUtils.unbindResource(ZimFileSelectFragment.class);
// Stop swipe refresh animation
swipeRefreshLayout.setRefreshing(false);
}); });
} }
}).scan(PreferenceManager.getDefaultSharedPreferences(context) }).scan(PreferenceManager.getDefaultSharedPreferences(context)
@ -263,16 +287,6 @@ public class ZimFileSelectFragment extends Fragment
} }
} }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_rescan_fs:
getFiles();
}
return super.onOptionsItemSelected(item);
}
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

View File

@ -18,6 +18,7 @@ import android.preference.PreferenceManager;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -70,13 +71,14 @@ public class LibraryFragment extends Fragment
TextView networkText; TextView networkText;
@BindView(R.id.network_permission_button) @BindView(R.id.network_permission_button)
Button permissionButton; Button permissionButton;
private RelativeLayout progressBar;
@Inject @Inject
KiwixService kiwixService; KiwixService kiwixService;
public LinearLayout llLayout; public LinearLayout llLayout;
public SwipeRefreshLayout swipeRefreshLayout;
private ArrayList<Book> books = new ArrayList<>(); private ArrayList<Book> books = new ArrayList<>();
public static DownloadService mService = new DownloadService(); public static DownloadService mService = new DownloadService();
@ -116,7 +118,16 @@ public class LibraryFragment extends Fragment
// Replace LinearLayout by the type of the root element of the layout you're trying to load // Replace LinearLayout by the type of the root element of the layout you're trying to load
llLayout = (LinearLayout) inflater.inflate(R.layout.activity_library, container, false); llLayout = (LinearLayout) inflater.inflate(R.layout.activity_library, container, false);
ButterKnife.bind(this, llLayout); ButterKnife.bind(this, llLayout);
progressBar = (RelativeLayout) inflater.inflate(R.layout.progress_bar, null);
// SwipeRefreshLayout for the list view
swipeRefreshLayout = (SwipeRefreshLayout) llLayout.findViewById(R.id.library_swiperefresh);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshFragment();
}
});
displayScanningContent(); displayScanningContent();
libraryAdapter = new LibraryAdapter(super.getContext()); libraryAdapter = new LibraryAdapter(super.getContext());
libraryList.setAdapter(libraryAdapter); libraryList.setAdapter(libraryAdapter);
@ -136,7 +147,7 @@ public class LibraryFragment extends Fragment
presenter.loadRunningDownloadsFromDb(getActivity()); presenter.loadRunningDownloadsFromDb(getActivity());
// The FragmentActivity doesn't contain the layout directly so we must use our instance of LinearLayout : // The FragmentActivity doesn't contain the layout directly so we must use our instance of LinearLayout :
//llLayout.findViewById(R.id.someGuiElement); // llLayout.findViewById(R.id.someGuiElement);
// Instead of : // Instead of :
// findViewById(R.id.someGuiElement); // findViewById(R.id.someGuiElement);
return llLayout; // We must return the loaded Layout return llLayout; // We must return the loaded Layout
@ -159,19 +170,26 @@ public class LibraryFragment extends Fragment
@Override @Override
public void displayNoNetworkConnection() { public void displayNoNetworkConnection() {
libraryList.removeFooterView(progressBar); if (books.size() != 0) {
Toast.makeText(super.getActivity(), R.string.no_network_connection, Toast.LENGTH_LONG).show();
return;
}
networkText.setText(R.string.no_network_msg); networkText.setText(R.string.no_network_msg);
networkText.setVisibility(View.VISIBLE); networkText.setVisibility(View.VISIBLE);
permissionButton.setVisibility(View.GONE); permissionButton.setVisibility(View.GONE);
swipeRefreshLayout.setRefreshing(false);
swipeRefreshLayout.setEnabled(false);
TestingUtils.unbindResource(LibraryFragment.class); TestingUtils.unbindResource(LibraryFragment.class);
} }
@Override @Override
public void displayScanningContent() { public void displayScanningContent() {
if (libraryList.getFooterViewsCount() == 0) { if (!swipeRefreshLayout.isRefreshing()) {
networkText.setVisibility(View.GONE); networkText.setVisibility(View.GONE);
permissionButton.setVisibility(View.GONE); permissionButton.setVisibility(View.GONE);
libraryList.addFooterView(progressBar); swipeRefreshLayout.setEnabled(true);
swipeRefreshLayout.setRefreshing(true);
TestingUtils.bindResource(LibraryFragment.class); TestingUtils.bindResource(LibraryFragment.class);
} }
} }
@ -181,7 +199,7 @@ public class LibraryFragment extends Fragment
public void stopScanningContent() { public void stopScanningContent() {
networkText.setVisibility(View.GONE); networkText.setVisibility(View.GONE);
permissionButton.setVisibility(View.GONE); permissionButton.setVisibility(View.GONE);
libraryList.removeFooterView(progressBar); swipeRefreshLayout.setRefreshing(false);
TestingUtils.unbindResource(LibraryFragment.class); TestingUtils.unbindResource(LibraryFragment.class);
} }
@ -189,6 +207,17 @@ public class LibraryFragment extends Fragment
displayNoNetworkConnection(); displayNoNetworkConnection();
} }
public void refreshFragment() {
NetworkInfo network = conMan.getActiveNetworkInfo();
if (network == null || !network.isConnected()) {
Toast.makeText(super.getActivity(), R.string.no_network_connection, Toast.LENGTH_LONG).show();
swipeRefreshLayout.setRefreshing(false);
return;
}
networkBroadcastReceiver.onReceive(super.getActivity(), null);
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();

View File

@ -11,14 +11,6 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?attr/listBackground"> android:background="?attr/listBackground">
<ListView
android:id="@+id/library_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="60dp"
android:background="?attr/listBackground"
android:divider="@null"/>
<TextView <TextView
android:id="@+id/network_permission_text" android:id="@+id/network_permission_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -37,5 +29,20 @@
android:text="@string/proceed" android:text="@string/proceed"
android:visibility="gone"/> android:visibility="gone"/>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/library_swiperefresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ListView
android:id="@+id/library_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="60dp"
android:background="?attr/listBackground"
android:divider="@null"/>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout> </RelativeLayout>
</LinearLayout> </LinearLayout>

View File

@ -20,7 +20,8 @@
android:textSize="20sp" android:textSize="20sp"
android:visibility="gone"/> android:visibility="gone"/>
<RelativeLayout <android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/zim_swiperefresh"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -45,6 +46,6 @@
android:paddingRight="10dp" android:paddingRight="10dp"
android:text="@string/error_nozimfilesfound" android:text="@string/error_nozimfilesfound"
android:visibility="gone"/> android:visibility="gone"/>
</RelativeLayout> </android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout> </RelativeLayout>

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_rescan_fs"
android:icon="@drawable/action_refresh"
android:title="@string/menu_rescan_fs"
app:showAsAction="always"/>
</menu>

View File

@ -10,12 +10,6 @@
app:actionViewClass="android.support.v7.widget.SearchView" app:actionViewClass="android.support.v7.widget.SearchView"
app:iconifiedByDefault="true" app:iconifiedByDefault="true"
app:showAsAction="always|collapseActionView"/> app:showAsAction="always|collapseActionView"/>
<item
android:id="@+id/menu_rescan_fs"
android:icon="@drawable/action_refresh"
android:title="@string/menu_rescan_fs"
android:visible="true"
app:showAsAction="always"/>
<item <item
android:id="@+id/select_language" android:id="@+id/select_language"
android:icon="@drawable/ic_language_white_24dp" android:icon="@drawable/ic_language_white_24dp"