diff --git a/res/layout/progress_bar.xml b/res/layout/progress_bar.xml index 10ff59a9d..7f9f108fc 100755 --- a/res/layout/progress_bar.xml +++ b/res/layout/progress_bar.xml @@ -1,8 +1,35 @@ - + + android:layout_height="wrap_content" + android:background="?android:attr/listDivider" + android:layout_marginTop="-1dp" + /> - \ No newline at end of file + + + + + + diff --git a/res/layout/zim_list.xml b/res/layout/zim_list.xml index 09fde834d..dcfa73c98 100644 --- a/res/layout/zim_list.xml +++ b/res/layout/zim_list.xml @@ -25,7 +25,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/toolbar" - android:paddingBottom="60dp"> + android:paddingBottom="60dp" + android:footerDividersEnabled="false"> - - - - - - - - - - - diff --git a/res/values/strings.xml b/res/values/strings.xml index 281107006..1f4356638 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -95,6 +95,7 @@ Download ZIM files Local Remote + Downloads ZIM Management Delete this ZIM? ZIM file deleted diff --git a/src/org/kiwix/kiwixmobile/LibraryFragment.java b/src/org/kiwix/kiwixmobile/LibraryFragment.java index 414cbfbfa..2e034b101 100644 --- a/src/org/kiwix/kiwixmobile/LibraryFragment.java +++ b/src/org/kiwix/kiwixmobile/LibraryFragment.java @@ -189,7 +189,6 @@ public class LibraryFragment extends Fragment implements AdapterView.OnItemClick + bytesToHuman(getSpaceAvailable()), Toast.LENGTH_LONG).show(); return; } - bookDao.saveBook((LibraryNetworkEntity.Book) parent.getAdapter().getItem(position)); if (isWiFi()){ downloadFile((LibraryNetworkEntity.Book) parent.getAdapter().getItem(position)); } else { @@ -259,7 +258,6 @@ public class LibraryFragment extends Fragment implements AdapterView.OnItemClick } public void downloadFile(LibraryNetworkEntity.Book book) { - bookDao.saveBook(book); Toast.makeText(super.getActivity(), stringsGetter(R.string.download_started_library, super.getActivity()), Toast.LENGTH_LONG).show(); Intent service = new Intent(super.getActivity(), DownloadService.class); service.putExtra(DownloadIntent.DOWNLOAD_URL_PARAMETER, book.getUrl()); diff --git a/src/org/kiwix/kiwixmobile/ZimFileSelectFragment.java b/src/org/kiwix/kiwixmobile/ZimFileSelectFragment.java index 330191fbb..8f442b7cc 100644 --- a/src/org/kiwix/kiwixmobile/ZimFileSelectFragment.java +++ b/src/org/kiwix/kiwixmobile/ZimFileSelectFragment.java @@ -64,6 +64,9 @@ import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import org.kiwix.kiwixmobile.database.BookDao; @@ -85,17 +88,16 @@ public class ZimFileSelectFragment extends Fragment private static final int LOADER_ID = 0x02; public static Context context; public RelativeLayout llLayout; - // Adapter of the Data populated by the MediaStore - private SimpleCursorAdapter mCursorAdapter; // Adapter of the Data populated by recanning the Filesystem by ourselves private RescanDataAdapter mRescanAdapter; private ArrayList mFiles; private ListView mZimFileList; - private RelativeLayout mProgressBar; + private RelativeLayout progressBar; private TextView mFileMessage; - private TextView mProgressBarMessage; + private BookDao bookDao; + public static void finishResult(String path) { ZimManageActivity zimManageActivity = (ZimManageActivity) context; if (path != null) { @@ -110,42 +112,53 @@ public class ZimFileSelectFragment extends Fragment } } + public void refreshFragment(){ + // Of course you will want to faActivity and llLayout in the class and not this method to access them in the rest of + // the class, just initialize them here + if (mZimFileList == null) + return; + + mZimFileList.addFooterView(progressBar); + mZimFileList.setOnItemClickListener(this); + mZimFileList.setOnItemLongClickListener(this); + + bookDao = new BookDao(new KiwixDatabase(context)); + + mFiles = bookDao.getBooks(); + Collections.sort(mFiles, new fileComparator()); + + mRescanAdapter = new RescanDataAdapter(ZimFileSelectFragment.context, 0, mFiles); + + mZimFileList.setAdapter(mRescanAdapter); + mRescanAdapter.notifyDataSetChanged(); + checkPermissions(); + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { FragmentActivity faActivity = (FragmentActivity) super.getActivity(); context = super.getActivity(); // Replace LinearLayout by the type of the root element of the layout you're trying to load llLayout = (RelativeLayout) inflater.inflate(R.layout.zim_list, container, false); - // Of course you will want to faActivity and llLayout in the class and not this method to access them in the rest of - // the class, just initialize them here - new LanguageUtils(super.getActivity()).changeFont(super.getActivity().getLayoutInflater()); - mFiles = new ArrayList(); - - mProgressBar = (RelativeLayout) llLayout.findViewById(R.id.progressbar_layout); mFileMessage = (TextView) llLayout.findViewById(R.id.file_management_no_files); -// mProgressBarMessage = (TextView) llLayout.findViewById(R.id.progressbar_message); mZimFileList = (ListView) llLayout.findViewById(R.id.zimfilelist); - mZimFileList.setOnItemClickListener(this); - mZimFileList.setOnItemLongClickListener(this); - mProgressBar.setVisibility(View.VISIBLE); + mFiles = new ArrayList(); + progressBar = (RelativeLayout) super.getActivity().getLayoutInflater().inflate(R.layout.progress_bar, null); + refreshFragment(); - bookDao = new BookDao(new KiwixDatabase(context)); - - checkPermissions(); - - // Don't use this method, it's handled by inflater.inflate() above : - // setContentView(R.layout.activity_layout); - - // The FragmentActivity doesn't contain the layout directly so we must use our instance of LinearLayout : - //llLayout.findViewById(R.id.someGuiElement); - // Instead of : - // findViewById(R.id.someGuiElement); return llLayout; // We must return the loaded Layout } + private class fileComparator implements Comparator { + @Override + public int compare(LibraryNetworkEntity.Book b1, LibraryNetworkEntity.Book b2) { + return b1.getTitle().compareTo(b2.getTitle()); + } + } + public void checkPermissions(){ if (ContextCompat.checkSelfPermission(super.getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) @@ -384,8 +397,6 @@ public class ZimFileSelectFragment extends Fragment @Override protected void onPreExecute() { - mProgressBar.setVisibility(View.VISIBLE); - super.onPreExecute(); } @@ -393,6 +404,8 @@ public class ZimFileSelectFragment extends Fragment protected Void doInBackground(Void... params) { mFiles = new FileSearch().findFiles(); + Collections.sort(mFiles, new fileComparator()); + bookDao.saveBooks(mFiles); return null; } @Override @@ -401,12 +414,11 @@ public class ZimFileSelectFragment extends Fragment mZimFileList.setAdapter(mRescanAdapter); - mProgressBar.setVisibility(View.GONE); + mZimFileList.removeFooterView(progressBar); + //mZimFileList.addFooterView(emptyView); checkEmpty(); - new FileWriter(ZimFileSelectFragment.context).saveArray(mFiles); - super.onPostExecute(result); } } diff --git a/src/org/kiwix/kiwixmobile/ZimManageActivity.java b/src/org/kiwix/kiwixmobile/ZimManageActivity.java index 9581adec2..6e9406fcd 100644 --- a/src/org/kiwix/kiwixmobile/ZimManageActivity.java +++ b/src/org/kiwix/kiwixmobile/ZimManageActivity.java @@ -6,6 +6,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.database.DataSetObserver; import android.support.design.widget.TabLayout; +import android.support.v4.app.FragmentTransaction; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; @@ -63,6 +64,10 @@ public class ZimManageActivity extends AppCompatActivity { public Toolbar toolbar; + public MenuItem refeshItem; + + private MenuItem searchItem; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -82,11 +87,43 @@ public class ZimManageActivity extends AppCompatActivity { TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(mViewPager); - getIntent().getIntExtra(TAB_EXTRA,0); mViewPager.setCurrentItem(getIntent().getIntExtra(TAB_EXTRA,0)); + mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + } + + @Override + public void onPageSelected(int position) { + updateMenu(position); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); } + private void updateMenu(int position){ + if (searchItem == null) + return; + switch (position){ + case 0: + refeshItem.setVisible(true); + searchItem.setVisible(false); + break; + case 1: + refeshItem.setVisible(false); + searchItem.setVisible(true); + break; + case 2: + refeshItem.setVisible(false); + searchItem.setVisible(false); + break; + } + } private void setUpToolbar() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); @@ -130,19 +167,15 @@ public class ZimManageActivity extends AppCompatActivity { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_zim_manager, menu); mMenu = menu; - SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); - menu.findItem(R.id.action_search).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener(){ - @Override - public boolean onMenuItemClick(MenuItem v) { - mViewPager.setCurrentItem(1); - return true; - } - }); + refeshItem = (MenuItem) menu.findItem(R.id.menu_rescan_fs); + searchItem = (MenuItem) menu.findItem(R.id.action_search); + SearchView searchView = (SearchView) searchItem.getActionView(); + updateMenu(mViewPager.getCurrentItem()); toolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mViewPager.setCurrentItem(1); - MenuItemCompat.expandActionView(menu.findItem(R.id.action_search)); + if (mViewPager.getCurrentItem() == 1) + MenuItemCompat.expandActionView(menu.findItem(R.id.action_search)); } }); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @@ -173,10 +206,8 @@ public class ZimManageActivity extends AppCompatActivity { if (id == R.id.menu_rescan_fs){ - mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); - int position = mViewPager.getCurrentItem(); - mViewPager.setAdapter(mSectionsPagerAdapter); - mViewPager.setCurrentItem(position); + ZimFileSelectFragment fragment = (ZimFileSelectFragment) mSectionsPagerAdapter.getItem(0); + fragment.refreshFragment(); // mViewPager.notify(); } //noinspection SimplifiableIfStatement @@ -191,6 +222,12 @@ public class ZimManageActivity extends AppCompatActivity { */ public class SectionsPagerAdapter extends FragmentPagerAdapter { + private ZimFileSelectFragment zimFileSelectFragment = new ZimFileSelectFragment(); + + private LibraryFragment libraryFragment = new LibraryFragment(); + + private DownloadFragment downloadFragment = new DownloadFragment(); + public SectionsPagerAdapter(FragmentManager fm) { super(fm); } @@ -200,11 +237,11 @@ public class ZimManageActivity extends AppCompatActivity { // getItem is called to instantiate the fragment for the given page. switch (position) { case 0: - return new ZimFileSelectFragment(); + return zimFileSelectFragment; case 1: - return new LibraryFragment(); + return libraryFragment; case 2: - return new DownloadFragment(); + return downloadFragment; default: return null; } @@ -223,7 +260,7 @@ public class ZimManageActivity extends AppCompatActivity { case 1: return getResources().getString(R.string.remote_zims); case 2: - return "Downloads"; + return getResources().getString(R.string.zim_downloads); } return null; } diff --git a/src/org/kiwix/kiwixmobile/database/BookDao.java b/src/org/kiwix/kiwixmobile/database/BookDao.java index 76e898fc2..e43bb3f0f 100644 --- a/src/org/kiwix/kiwixmobile/database/BookDao.java +++ b/src/org/kiwix/kiwixmobile/database/BookDao.java @@ -8,7 +8,10 @@ import org.kiwix.kiwixmobile.database.entity.BookDataSource; import org.kiwix.kiwixmobile.database.entity.BookDatabaseEntity; import org.kiwix.kiwixmobile.database.entity.Bookmarks; import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity; +import org.kiwix.kiwixmobile.library.entity.LibraryNetworkEntity.Book; + +import java.io.File; import java.util.ArrayList; /** @@ -24,13 +27,13 @@ public class BookDao { } - public LibraryNetworkEntity.Book getBook(String fileName) { + public ArrayList getBooks() { SquidCursor bookCursor = mDb.query( BookDatabaseEntity.class, Query.select()); - LibraryNetworkEntity.Book book = new LibraryNetworkEntity.Book(); + ArrayList books = new ArrayList<>(); while (bookCursor.moveToNext()){ - if (bookCursor.get(BookDatabaseEntity.URL).contains("/" + fileName + ".")) { + Book book = new Book(); book.id = bookCursor.get(BookDatabaseEntity.BOOK_ID); book.title = bookCursor.get(BookDatabaseEntity.TITLE); book.description = bookCursor.get(BookDatabaseEntity.DESCRIPTION); @@ -38,38 +41,41 @@ public class BookDao { book.creator = bookCursor.get(BookDatabaseEntity.BOOK_CREATOR); book.publisher = bookCursor.get(BookDatabaseEntity.PUBLISHER); book.date = bookCursor.get(BookDatabaseEntity.DATE); - book.url = bookCursor.get(BookDatabaseEntity.URL); + book.file = new File(bookCursor.get(BookDatabaseEntity.URL)); book.articleCount = bookCursor.get(BookDatabaseEntity.ARTICLE_COUNT); book.mediaCount = bookCursor.get(BookDatabaseEntity.MEDIA_COUNT); book.size = bookCursor.get(BookDatabaseEntity.SIZE); book.favicon = bookCursor.get(BookDatabaseEntity.FAVICON); - book.downloaded = bookCursor.get(BookDatabaseEntity.DOWNLOADED); - bookCursor.close(); - return book; + if (book.file.exists()) { + books.add(book); + } else { + String path = bookCursor.get(BookDatabaseEntity.URL); + mDb.deleteWhere(BookDatabaseEntity.class, BookDatabaseEntity.URL.eq(path)); + } } - } bookCursor.close(); - return null; + return books; } - public void saveBook(LibraryNetworkEntity.Book book) { - BookDatabaseEntity bookDatabaseEntity = new BookDatabaseEntity(); - bookDatabaseEntity.setBookId(book.getId()); - bookDatabaseEntity.setTitle(book.getTitle()); - bookDatabaseEntity.setDescription(book.getTitle()); - bookDatabaseEntity.setLanguage(book.getLanguage()); - bookDatabaseEntity.setBookCreator(book.getCreator()); - bookDatabaseEntity.setPublisher(book.getPublisher()); - bookDatabaseEntity.setDate(book.getDate()); - bookDatabaseEntity.setUrl(book.getUrl()); - bookDatabaseEntity.setArticleCount(book.getArticleCount()); - bookDatabaseEntity.setMediaCount(book.getMediaCount()); - bookDatabaseEntity.setSize(book.getSize()); - bookDatabaseEntity.setFavicon(book.getFavicon()); - bookDatabaseEntity.setIsDownloaded(book.downloaded); - mDb.deleteWhere(BookDatabaseEntity.class, BookDatabaseEntity.URL.eq(book.getUrl())); - mDb.persist(bookDatabaseEntity); + public void saveBooks(ArrayList books) { + for (Book book : books){ + BookDatabaseEntity bookDatabaseEntity = new BookDatabaseEntity(); + bookDatabaseEntity.setBookId(book.getId()); + bookDatabaseEntity.setTitle(book.getTitle()); + bookDatabaseEntity.setDescription(book.getDescription()); + bookDatabaseEntity.setLanguage(book.getLanguage()); + bookDatabaseEntity.setBookCreator(book.getCreator()); + bookDatabaseEntity.setPublisher(book.getPublisher()); + bookDatabaseEntity.setDate(book.getDate()); + bookDatabaseEntity.setUrl(book.file.getPath()); + bookDatabaseEntity.setArticleCount(book.getArticleCount()); + bookDatabaseEntity.setMediaCount(book.getMediaCount()); + bookDatabaseEntity.setSize(book.getSize()); + bookDatabaseEntity.setFavicon(book.getFavicon()); + String filePath = book.file.getPath(); + mDb.deleteWhere(BookDatabaseEntity.class, BookDatabaseEntity.URL.eq(filePath)); + mDb.persist(bookDatabaseEntity); + } } - } diff --git a/src/org/kiwix/kiwixmobile/database/KiwixDatabase.java b/src/org/kiwix/kiwixmobile/database/KiwixDatabase.java index 439c9070c..d4bb25bab 100644 --- a/src/org/kiwix/kiwixmobile/database/KiwixDatabase.java +++ b/src/org/kiwix/kiwixmobile/database/KiwixDatabase.java @@ -51,7 +51,7 @@ import java.util.List; public class KiwixDatabase extends SquidDatabase { - private static final int VERSION = 8; + private static final int VERSION = 9; private Context context; @@ -113,6 +113,10 @@ public class KiwixDatabase extends SquidDatabase { if (newVersion >= 6) { tryCreateTable(Bookmarks.TABLE); } + if (newVersion >= 9) { + db.execSQL("DROP TABLE IF EXISTS book"); + tryCreateTable(BookDatabaseEntity.TABLE); + } return true; } diff --git a/src/org/kiwix/kiwixmobile/downloader/DownloadService.java b/src/org/kiwix/kiwixmobile/downloader/DownloadService.java index 01fe7e261..be71c037c 100644 --- a/src/org/kiwix/kiwixmobile/downloader/DownloadService.java +++ b/src/org/kiwix/kiwixmobile/downloader/DownloadService.java @@ -154,7 +154,6 @@ public class DownloadService extends Service { target, PendingIntent.FLAG_CANCEL_CURRENT); book.downloaded = true; notification.get(notificationID).setContentIntent(pendingIntent); - bookDao.saveBook(book); updateForeground(); } else if (progress == 0) { // Tells android to not kill the service diff --git a/src/org/kiwix/kiwixmobile/utils/files/FileWriter.java b/src/org/kiwix/kiwixmobile/utils/files/FileWriter.java index bf43faa8f..99dd7ddd5 100644 --- a/src/org/kiwix/kiwixmobile/utils/files/FileWriter.java +++ b/src/org/kiwix/kiwixmobile/utils/files/FileWriter.java @@ -52,23 +52,6 @@ public class FileWriter { mContext = context; } - // Build a CSV list from the file paths - public void saveArray(ArrayList files) { - - ArrayList list = new ArrayList<>(); - - for (LibraryNetworkEntity.Book file : files) { - list.add(file.file.getPath()); - } - - StringBuilder sb = new StringBuilder(); - for (String s : list) { - sb.append(s); - sb.append(","); - } - - saveCsvToPrefrences(sb.toString()); - } // Read the locales.txt file in the assets folder, that has been created at compile time by the // build script @@ -91,15 +74,6 @@ public class FileWriter { return readCsv(content); } - - // Split the CSV by the comma and return an ArrayList with the file paths - private ArrayList readCsv() { - - String csv = getCsvFromPrefrences(); - - return readCsv(csv); - } - private ArrayList readCsv(String csv) { String[] csvArray = csv.split(","); @@ -107,27 +81,6 @@ public class FileWriter { return new ArrayList(Arrays.asList(csvArray)); } - // Save a CSV file to the prefrences - private void saveCsvToPrefrences(String csv) { - - SharedPreferences preferences = mContext.getSharedPreferences(PREF_NAME, 0); - SharedPreferences.Editor editor = preferences.edit(); - editor.putString(CSV_PREF_NAME, csv); - - editor.apply(); - } - - // Load the CSV from the prefrences - private String getCsvFromPrefrences() { - SharedPreferences preferences = mContext.getSharedPreferences(PREF_NAME, 0); - - return preferences.getString(CSV_PREF_NAME, ""); - } - - // Remove the file path and the extension and return a file name for the given file path - private String getTitleFromFilePath(String path) { - return new File(path).getName().replaceFirst("[.][^.]+$", ""); - } }