diff --git a/assets/www/js/jsfile.js b/assets/www/js/jsfile.js
new file mode 100644
index 000000000..1ced46cbf
--- /dev/null
+++ b/assets/www/js/jsfile.js
@@ -0,0 +1,12 @@
+function() {
+ window.onload = onLoad();
+
+ function onLoad() {
+ window.HTMLUtils.start();
+ for (i=0; i
+ android:src="?attr/arrowBackDrawable"
+ android:id="@+id/action_back_button" />
+ android:src="?attr/arrowForwardDrawable"
+ android:id="@+id/action_forward_button" />
diff --git a/res/layout/drawer_right.xml b/res/layout/drawer_right.xml
new file mode 100644
index 000000000..fd8e5bc24
--- /dev/null
+++ b/res/layout/drawer_right.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/main.xml b/res/layout/main.xml
index 7539b2c98..556d1daa3 100644
--- a/res/layout/main.xml
+++ b/res/layout/main.xml
@@ -65,7 +65,8 @@
-
+
+
\ No newline at end of file
diff --git a/res/layout/section_list.xml b/res/layout/section_list.xml
new file mode 100644
index 000000000..2a2977edd
--- /dev/null
+++ b/res/layout/section_list.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 520df3b53..594a7fd6b 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -55,4 +55,7 @@
Go to Play Store
No Bookmarks!
Bookmarks
+ No Content Headers Found
+ To search for zim files we need access to your storage
+ Warning
\ No newline at end of file
diff --git a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java
index 82ee1a8db..2b82612cc 100644
--- a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java
+++ b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java
@@ -27,6 +27,10 @@ import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -87,8 +91,10 @@ import java.util.prefs.Preferences;
import org.json.JSONArray;
import org.kiwix.kiwixmobile.settings.Constants;
import org.kiwix.kiwixmobile.settings.KiwixSettingsActivity;
+import org.kiwix.kiwixmobile.utils.HTMLUtils;
import org.kiwix.kiwixmobile.utils.KiwixTextToSpeech;
import org.kiwix.kiwixmobile.utils.LanguageUtils;
+import org.kiwix.kiwixmobile.utils.files.FileReader;
import org.kiwix.kiwixmobile.utils.files.FileUtils;
import org.kiwix.kiwixmobile.utils.files.RateAppCounter;
import org.kiwix.kiwixmobile.views.AnimatedProgressBar;
@@ -104,6 +110,8 @@ public class KiwixMobileActivity extends AppCompatActivity {
public static final int REQUEST_FILE_SEARCH = 1236;
+ public static final int REQUEST_STORAGE_PERMISSION = 1;
+
private static final String TAG_CURRENT_FILE = "currentzimfile";
private static final String TAG_CURRENT_ARTICLES = "currentarticles";
@@ -128,6 +136,8 @@ public class KiwixMobileActivity extends AppCompatActivity {
private static final int REQUEST_PREFERENCES = 1235;
+ private static String jsContent;
+
public static ArrayList mPrefState;
public static boolean mIsFullscreenOpened;
@@ -140,6 +150,10 @@ public class KiwixMobileActivity extends AppCompatActivity {
public ImageButton exitFullscreenButton;
+ public List sectionProperties;
+
+ private HTMLUtils htmlUtils;
+
protected boolean requestClearHistoryAfterLoad;
protected boolean requestInitAllMenuItems;
@@ -152,19 +166,27 @@ public class KiwixMobileActivity extends AppCompatActivity {
private Button mBackToTopButton;
- private ListView mDrawerList;
+ private ListView mLeftDrawerList;
- private DrawerLayout mDrawerLayout;
+ private ListView mRightDrawerList;
+
+ private DrawerLayout mLeftDrawerLayout;
+
+ public DrawerLayout mRightDrawerLayout;
private ArrayList bookmarks;
private List mWebViews = new ArrayList<>();
+ private List mSections = new ArrayList<>();
+
private KiwixTextToSpeech tts;
private CompatFindActionModeCallback mCompatCallback;
- private ArrayAdapter mDrawerAdapter;
+ private ArrayAdapter mLeftArrayAdapter;
+
+ private ArrayAdapter mRightArrayAdapter;
private FrameLayout mContentFrame;
@@ -174,6 +196,8 @@ public class KiwixMobileActivity extends AppCompatActivity {
private AnimatedProgressBar mProgressBar;
+ public Handler mHandler = new Handler();
+
// Initialized when onActionModeStarted is triggered.
private ActionMode mActionMode = null;
private KiwixWebView tempForUndo;
@@ -247,10 +271,15 @@ public class KiwixMobileActivity extends AppCompatActivity {
mToolbarContainer = (RelativeLayout) findViewById(R.id.toolbar_layout);
mProgressBar = (AnimatedProgressBar) findViewById(R.id.progress_view);
exitFullscreenButton = (ImageButton) findViewById(R.id.FullscreenControlButton);
+
tempForUndo =
new KiwixWebView(getApplicationContext()); /** initializing temporary tab value **/
snackbarLayout =
(LinearLayout) findViewById(R.id.linearlayout_main); /** Linear layout definition**/
+
+ FileReader fileReader = new FileReader();
+ jsContent = fileReader.readFile("www/js/jsfile.js", this);
+
RelativeLayout newTabButton = (RelativeLayout) findViewById(R.id.new_tab_button);
newTabButton.setOnClickListener(new View.OnClickListener() {
@@ -277,22 +306,72 @@ public class KiwixMobileActivity extends AppCompatActivity {
}
});
- mDrawerAdapter = new KiwixWebViewAdapter(this, R.layout.tabs_list, mWebViews);
- mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
- mDrawerList = (ListView) findViewById(R.id.left_drawer_list);
- mDrawerList.setDivider(null);
- mDrawerList.setDividerHeight(0);
- mDrawerList.setAdapter(mDrawerAdapter);
- mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ mLeftArrayAdapter = new KiwixWebViewAdapter(this, R.layout.tabs_list, mWebViews);
+ mLeftDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mLeftDrawerList = (ListView) findViewById(R.id.left_drawer_list);
+ mLeftDrawerList.setDivider(null);
+ mLeftDrawerList.setDividerHeight(0);
+ mLeftDrawerList.setAdapter(mLeftArrayAdapter);
+
+ mRightArrayAdapter = new KiwixToCAdapter(this, R.layout.section_list, mSections, this);
+ mRightDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mRightDrawerList = (ListView) findViewById(R.id.right_drawer_list);
+ mRightDrawerList.setDivider(null);
+ mRightDrawerList.setDividerHeight(0);
+ mRightDrawerList.setAdapter(mRightArrayAdapter);
+ TextView tView = (TextView) findViewById(R.id.empty);
+ mRightDrawerList.setEmptyView(tView);
+ sectionProperties = new ArrayList();
+ mRightArrayAdapter.notifyDataSetChanged();
+
+ mLeftDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
selectTab(position);
}
});
- ActionBarDrawerToggle drawerToggle =
- new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, 0, 0);
+ mRightDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ getCurrentWebView().loadUrl("javascript:document.getElementById('" + sectionProperties.get(position - mRightDrawerList.getHeaderViewsCount()).sectionId+ "').scrollIntoView();");
+ mRightDrawerLayout.closeDrawers();
+ }
+ });
+ final ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mLeftDrawerLayout, toolbar,
+ 0, 0){
- mDrawerLayout.setDrawerListener(drawerToggle);
+ @Override
+ public void onDrawerSlide(View drawerView, float slideOffset) {
+ // Make sure it was the navigation drawer
+ if (drawerView.getId() == R.id.left_drawer){
+ super.onDrawerSlide(drawerView, slideOffset);
+ }
+ }
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ // Make sure it was the navigation drawer
+ if (drawerView.getId() == R.id.left_drawer){
+ super.onDrawerOpened(drawerView);
+ mRightDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT);
+ } else {
+ mLeftDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.LEFT);
+ }
+ }
+
+ @Override
+ public void onDrawerClosed(View drawerView) {
+ // Make sure it was the navigation drawer
+ if (drawerView.getId() == R.id.left_drawer){
+ super.onDrawerClosed(drawerView);
+ mRightDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.RIGHT);
+ } else {
+ mLeftDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.LEFT);
+ }
+ }
+ };
+
+ mLeftDrawerLayout.setDrawerListener(drawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
drawerToggle.syncState();
@@ -300,6 +379,7 @@ public class KiwixMobileActivity extends AppCompatActivity {
mCompatCallback = new CompatFindActionModeCallback(this);
mContentFrame = (FrameLayout) findViewById(R.id.content_frame);
setUpTTS();
+ htmlUtils= new HTMLUtils(sectionProperties, mSections, mRightDrawerList, this, mHandler);
newTab();
manageExternalLaunchAndRestoringViewState(savedInstanceState);
@@ -413,6 +493,11 @@ public class KiwixMobileActivity extends AppCompatActivity {
tts.shutdown();
}
+ private void updateTableOfContents(){
+ mRightDrawerList.clearChoices();
+ getCurrentWebView().loadUrl("javascript:(" + jsContent + ")()");
+ }
+
private KiwixWebView newTab() {
String mainPage =
Uri.parse(ZimContentProvider.CONTENT_URI + ZimContentProvider.getMainPage()).toString();
@@ -421,28 +506,31 @@ public class KiwixMobileActivity extends AppCompatActivity {
private KiwixWebView newTab(String url) {
KiwixWebView webView = new KiwixWebView(KiwixMobileActivity.this);
- webView.setWebViewClient(new KiwixWebViewClient(KiwixMobileActivity.this, mDrawerAdapter));
+ webView.setWebViewClient(new KiwixWebViewClient(KiwixMobileActivity.this, mLeftArrayAdapter));
webView.setWebChromeClient(new KiwixWebChromeClient());
webView.loadUrl(url);
webView.loadPrefs();
mWebViews.add(webView);
- mDrawerAdapter.notifyDataSetChanged();
+ mLeftArrayAdapter.notifyDataSetChanged();
selectTab(mWebViews.size() - 1);
setUpWebView();
+ htmlUtils.initInterface(webView);
return webView;
}
private KiwixWebView restoreTabAtIndex(String url, int index) {
KiwixWebView webView = new KiwixWebView(KiwixMobileActivity.this);
- webView.setWebViewClient(new KiwixWebViewClient(KiwixMobileActivity.this, mDrawerAdapter));
+ webView.setWebViewClient(new KiwixWebViewClient(KiwixMobileActivity.this, mLeftArrayAdapter));
webView.setWebChromeClient(new KiwixWebChromeClient());
webView.loadUrl(url);
webView.loadPrefs();
- mWebViews.add(index, webView);
- mDrawerAdapter.notifyDataSetChanged();
+ mWebViews.add(index,webView);
+ mLeftArrayAdapter.notifyDataSetChanged();
+ selectTab(mWebViews.size() - 1);
setUpWebView();
+ htmlUtils.initInterface(webView);
return webView;
}
@@ -474,7 +562,7 @@ public class KiwixMobileActivity extends AppCompatActivity {
if (index < mCurrentWebViewIndex) {
mCurrentWebViewIndex--;
}
- mDrawerList.setItemChecked(mCurrentWebViewIndex, true);
+ mLeftDrawerList.setItemChecked(mCurrentWebViewIndex, true);
}
} else {
tempForUndo = mWebViews.get(index);
@@ -483,7 +571,7 @@ public class KiwixMobileActivity extends AppCompatActivity {
mCurrentWebViewIndex = 0;
undoSnackbar(index);
}
- mDrawerAdapter.notifyDataSetChanged();
+ mLeftArrayAdapter.notifyDataSetChanged();
}
private void undoSnackbar(final int index) {
@@ -496,7 +584,7 @@ public class KiwixMobileActivity extends AppCompatActivity {
restoreTabAtIndex(tempForUndo.getUrl(), index);
selectTab(index);
}
- mDrawerLayout.openDrawer(Gravity.LEFT);
+ mLeftDrawerLayout.openDrawer(Gravity.LEFT);
}
});
undoSnackbar.setActionTextColor(getResources().getColor(R.color.white_undo));
@@ -505,16 +593,18 @@ public class KiwixMobileActivity extends AppCompatActivity {
private void selectTab(int position) {
mCurrentWebViewIndex = position;
- mDrawerList.setItemChecked(position, true);
+ mLeftDrawerList.setItemChecked(position, true);
mContentFrame.removeAllViews();
mContentFrame.addView(mWebViews.get(position));
- mDrawerList.setItemChecked(mCurrentWebViewIndex, true);
+ mLeftDrawerList.setItemChecked(mCurrentWebViewIndex, true);
- if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+ if (mLeftDrawerLayout.isDrawerOpen(GravityCompat.START)) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
- @Override public void run() {
- mDrawerLayout.closeDrawers();
+
+ @Override
+ public void run() {
+ mLeftDrawerLayout.closeDrawers();
}
}, 150);
}
@@ -522,10 +612,11 @@ public class KiwixMobileActivity extends AppCompatActivity {
if (menu != null) {
refreshBookmarkSymbol(menu);
}
+ updateTableOfContents();
}
- private KiwixWebView getCurrentWebView() {
- return mDrawerAdapter.getItem(mCurrentWebViewIndex);
+ public KiwixWebView getCurrentWebView() {
+ return mLeftArrayAdapter.getItem(mCurrentWebViewIndex);
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
@@ -722,8 +813,9 @@ public class KiwixMobileActivity extends AppCompatActivity {
}
} else {
Log.e(TAG_KIWIX, "ZIM file doesn't exist at " + file.getAbsolutePath());
- Toast.makeText(this, getResources().getString(R.string.error_filenotfound), Toast.LENGTH_LONG)
- .show();
+
+ Toast.makeText(this, getResources().getString(R.string.error_filenotfound),
+ Toast.LENGTH_LONG).show();
}
return false;
}
@@ -743,9 +835,11 @@ public class KiwixMobileActivity extends AppCompatActivity {
MenuItem searchItem = menu.findItem(R.id.menu_search);
searchItem.setVisible(true);
+ final String zimFile = ZimContentProvider.getZimFile();
searchItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
@Override public boolean onMenuItemClick(MenuItem item) {
Intent i = new Intent(KiwixMobileActivity.this, SearchActivity.class);
+ i.putExtra("zimFile", zimFile);
startActivityForResult(i, REQUEST_FILE_SEARCH);
overridePendingTransition(0, 0);
return true;
@@ -755,10 +849,23 @@ public class KiwixMobileActivity extends AppCompatActivity {
toolbar.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
Intent i = new Intent(KiwixMobileActivity.this, SearchActivity.class);
+ i.putExtra("zimFile", zimFile);
startActivityForResult(i, REQUEST_FILE_SEARCH);
overridePendingTransition(0, 0);
}
});
+ toolbar.setNavigationOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mRightDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
+ mRightDrawerLayout.closeDrawer(Gravity.RIGHT);
+ } else if (mLeftDrawerLayout.isDrawerOpen(Gravity.LEFT)){
+ mLeftDrawerLayout.closeDrawer(Gravity.LEFT);
+ } else {
+ mLeftDrawerLayout.openDrawer(Gravity.LEFT);
+ }
+ }
+ });
if (tts.isInitialized()) {
menu.findItem(R.id.menu_read_aloud).setVisible(true);
@@ -791,6 +898,7 @@ public class KiwixMobileActivity extends AppCompatActivity {
}
}
return false;
+
}
public void toggleBookmark() {
@@ -1091,6 +1199,7 @@ public class KiwixMobileActivity extends AppCompatActivity {
@Override public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
refreshBookmarkSymbol(menu);
+ refreshNavigationButtons();
return true;
}
@@ -1108,6 +1217,26 @@ public class KiwixMobileActivity extends AppCompatActivity {
}
}
+ public void refreshNavigationButtons() {
+ ImageView back = (ImageView) mLeftDrawerLayout.findViewById(R.id.action_back_button);
+ ImageView forward = (ImageView) mLeftDrawerLayout.findViewById(R.id.action_forward_button);
+ toggleImageViewGrayFilter(back, getCurrentWebView().canGoBack());
+ toggleImageViewGrayFilter(forward, getCurrentWebView().canGoForward());
+ mLeftDrawerLayout.findViewById(R.id.action_back).setEnabled(getCurrentWebView().canGoBack());
+ mLeftDrawerLayout.findViewById(R.id.action_forward).setEnabled(getCurrentWebView().canGoForward());
+ }
+
+ public void toggleImageViewGrayFilter(ImageView image, boolean state) {
+ Drawable originalIcon = image.getDrawable();
+ Drawable res = originalIcon.mutate();
+ if (state) {
+ res.clearColorFilter();
+ } else {
+ res.setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN);
+ }
+ image.setImageDrawable(res);
+ }
+
public void loadPrefs() {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
@@ -1184,7 +1313,9 @@ public class KiwixMobileActivity extends AppCompatActivity {
String zimFile = settings.getString(TAG_CURRENT_FILE, null);
String zimArticles = settings.getString(TAG_CURRENT_ARTICLES, null);
String zimPositions = settings.getString(TAG_CURRENT_POSITIONS, null);
+
int currentTab = settings.getInt(TAG_CURRENT_TAB, 0);
+
openZimFile(new File(zimFile), false);
try {
JSONArray urls = new JSONArray(zimArticles);
@@ -1401,6 +1532,7 @@ public class KiwixMobileActivity extends AppCompatActivity {
view.reload();
}
mAdapter.notifyDataSetChanged();
+ updateTableOfContents();
}
}
@@ -1478,4 +1610,62 @@ public class KiwixMobileActivity extends AppCompatActivity {
ImageView exit;
}
}
+ private class KiwixToCAdapter extends ArrayAdapter {
+
+ private Context mContext;
+
+ private int mLayoutResource;
+
+ private KiwixMobileActivity parentKiwix;
+
+ private List mTextViews;
+
+ public KiwixToCAdapter(Context context, int resource, List textViews, KiwixMobileActivity parent) {
+ super(context, resource, textViews);
+ mContext = context;
+ mLayoutResource = resource;
+ mSections = textViews;
+ parentKiwix = parent;
+ }
+
+ @Override
+ public View getView(final int position, View convertView, final ViewGroup parent) {
+ View row = convertView;
+ ViewHolder holder;
+
+ if (row == null) {
+ LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
+ row = inflater.inflate(mLayoutResource, parent, false);
+
+ holder = new ViewHolder();
+ holder.txtTitle = (TextView) row.findViewById(R.id.textTab);
+ row.setTag(holder);
+ } else {
+ holder = (ViewHolder) row.getTag();
+ }
+
+ if (sectionProperties.isEmpty())
+ return row;
+ SectionProperties section = sectionProperties.get(position);
+ holder.txtTitle.setText(section.sectionTitle);
+ holder.txtTitle.setPadding(section.leftPadding, 0, 0, 0);
+ holder.txtTitle.setTypeface(section.typeface);
+ holder.txtTitle.setTextColor(section.color);
+ return row;
+ }
+
+ class ViewHolder {
+
+ TextView txtTitle;
+
+ }
+ }
+
+ public static class SectionProperties {
+ public Typeface typeface;
+ public int leftPadding;
+ public String sectionTitle;
+ public String sectionId;
+ public int color;
+ }
}
diff --git a/src/org/kiwix/kiwixmobile/SearchActivity.java b/src/org/kiwix/kiwixmobile/SearchActivity.java
index 74144273d..5d5ad8b9a 100644
--- a/src/org/kiwix/kiwixmobile/SearchActivity.java
+++ b/src/org/kiwix/kiwixmobile/SearchActivity.java
@@ -1,5 +1,6 @@
package org.kiwix.kiwixmobile;
+import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
@@ -10,14 +11,26 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
import android.widget.ListView;
+import android.widget.TextView;
+
+import org.kiwix.kiwixmobile.utils.DatabaseHelper;
import org.kiwix.kiwixmobile.views.AutoCompleteAdapter;
+import java.util.ArrayList;
+
public class SearchActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
private ListView mListView;
- private AutoCompleteAdapter mAdapter;
+ private AutoCompleteAdapter mAutoAdapter;
+
+ private ArrayAdapter mDefaultAdapter;
+
+ private SearchActivity context;
+
+ private DatabaseHelper mDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -28,10 +41,17 @@ public class SearchActivity extends AppCompatActivity implements AdapterView.OnI
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
+ String zimFile = getIntent().getStringExtra("zimFile");
mListView = (ListView) findViewById(R.id.search_list);
- mAdapter = new AutoCompleteAdapter(this);
- mListView.setAdapter(mAdapter);
- mListView.setOnItemClickListener(this);
+ mDatabaseHelper = new DatabaseHelper(this, zimFile);
+ ArrayList a = mDatabaseHelper.getRecentSearches();
+ mDefaultAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1);
+ mListView.setAdapter(mDefaultAdapter);
+ mDefaultAdapter.addAll(a);
+ mDefaultAdapter.notifyDataSetChanged();
+ context = this;
+ mAutoAdapter = new AutoCompleteAdapter(context);
+ mListView.setOnItemClickListener(context);
}
@Override
@@ -57,22 +77,28 @@ public class SearchActivity extends AppCompatActivity implements AdapterView.OnI
@Override
public boolean onQueryTextChange(String s) {
- mAdapter.getFilter().filter(s);
+ if (s.equals("")) {
+ mListView.setAdapter(mDefaultAdapter);
+ } else {
+ mListView.setAdapter(mAutoAdapter);
+ mAutoAdapter.getFilter().filter(s);
+ }
+
return true;
}
});
MenuItemCompat.setOnActionExpandListener(searchMenuItem,
- new MenuItemCompat.OnActionExpandListener() {
- @Override
- public boolean onMenuItemActionExpand(MenuItem item) {
- return false;
- }
+ new MenuItemCompat.OnActionExpandListener() {
+ @Override
+ public boolean onMenuItemActionExpand(MenuItem item) {
+ return false;
+ }
- @Override
- public boolean onMenuItemActionCollapse(MenuItem item) {
- finish();
- return true;
+ @Override
+ public boolean onMenuItemActionCollapse(MenuItem item) {
+ finish();
+ return true;
}
});
return true;
@@ -80,7 +106,8 @@ public class SearchActivity extends AppCompatActivity implements AdapterView.OnI
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
- String title = mAdapter.getItemRaw(position);
+ String title = ((TextView) view).getText().toString();
+ mDatabaseHelper.insertSearch(title);
sendMessage(title);
}
diff --git a/src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java b/src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java
index fffcd6eec..4f1c6d336 100644
--- a/src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java
+++ b/src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java
@@ -19,18 +19,23 @@
package org.kiwix.kiwixmobile;
+import android.Manifest;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
+import android.support.v4.app.ActivityCompat;
import android.support.v4.app.LoaderManager;
+import android.support.v4.content.ContextCompat;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
+import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
@@ -83,22 +88,10 @@ public class ZimFileSelectActivity extends AppCompatActivity
setContentView(R.layout.zim_list);
setUpToolbar();
-
- mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
- mProgressBarMessage = (TextView) findViewById(R.id.progressbar_message);
- mZimFileList = (ListView) findViewById(R.id.zimfilelist);
mFiles = new ArrayList();
- mZimFileList.setOnItemClickListener(this);
+ checkPermissions();
- mProgressBar.setVisibility(View.VISIBLE);
- setAlpha(true);
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
- startQuery();
- } else {
- new RescanFileSystem().execute();
- }
}
private void setUpToolbar() {
@@ -116,6 +109,52 @@ public class ZimFileSelectActivity extends AppCompatActivity
});
}
+
+ public void checkPermissions(){
+ if (ContextCompat.checkSelfPermission(this,
+ Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+
+ ActivityCompat.requestPermissions(this,
+ new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
+ KiwixMobileActivity.REQUEST_STORAGE_PERMISSION);
+
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case KiwixMobileActivity.REQUEST_STORAGE_PERMISSION: {
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+
+ mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
+ mProgressBarMessage = (TextView) findViewById(R.id.progressbar_message);
+ mZimFileList = (ListView) findViewById(R.id.zimfilelist);
+
+ mZimFileList.setOnItemClickListener(this);
+
+ mProgressBar.setVisibility(View.VISIBLE);
+ setAlpha(true);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ startQuery();
+ } else {
+ new RescanFileSystem().execute();
+ }
+
+ } else {
+ finish();
+ }
+ return;
+ }
+
+ }
+ }
+
@Override
public Loader onCreateLoader(int i, Bundle bundle) {
diff --git a/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java b/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java
new file mode 100644
index 000000000..f13ba18c3
--- /dev/null
+++ b/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java
@@ -0,0 +1,92 @@
+package org.kiwix.kiwixmobile.utils;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.database.DatabaseUtils;
+import android.util.Log;
+
+import org.kiwix.kiwixmobile.KiwixMobileActivity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+
+public class DatabaseHelper extends SQLiteOpenHelper {
+
+ public static final String DATABASE_NAME = "Kiwix.db";
+ public static final String CONTACTS_TABLE_NAME = "recentsearches";
+ public static final String CONTACTS_COLUMN_ID = "id";
+ public static final String CONTACTS_COLUMN_SEARCH = "search";
+ public static final String CONTACTS_COLUMN_ZIM = "zim";
+ public static String zimFile;
+
+ public DatabaseHelper(Context context , String zimFile) {
+
+ super(context, DATABASE_NAME, null, 2);
+ this.zimFile = zimFile;
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ // TODO Auto-generated method stub
+ db.execSQL(
+ "create table " + CONTACTS_TABLE_NAME +
+ " (id integer primary key, search text, zim text)"
+ );
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ // TODO Auto-generated method stub
+ db.execSQL("DROP TABLE IF EXISTS " + CONTACTS_TABLE_NAME);
+ onCreate(db);
+ }
+
+ public boolean insertSearch(String search) {
+ SQLiteDatabase db = this.getWritableDatabase();
+ ContentValues contentValues = new ContentValues();
+ contentValues.put(CONTACTS_COLUMN_SEARCH, search);
+ contentValues.put(CONTACTS_COLUMN_ZIM, zimFile);
+ db.insert(CONTACTS_TABLE_NAME, null, contentValues);
+ return true;
+ }
+
+ public Cursor getData(int id) {
+ SQLiteDatabase db = this.getReadableDatabase();
+ Cursor res = db.rawQuery("select * from " + CONTACTS_TABLE_NAME + " where id=" + id + "", null);
+ return res;
+ }
+
+ public int numberOfRows() {
+ SQLiteDatabase db = this.getReadableDatabase();
+ int numRows = (int) DatabaseUtils.queryNumEntries(db, CONTACTS_TABLE_NAME);
+ return numRows;
+ }
+
+ public Integer deleteSearches(Integer id) {
+ SQLiteDatabase db = this.getWritableDatabase();
+ return db.delete(CONTACTS_TABLE_NAME,
+ "id = ? ",
+ new String[]{Integer.toString(id)});
+ }
+
+ public ArrayList getRecentSearches() {
+ ArrayList array_list = new ArrayList();
+
+ //hp = new HashMap();
+ SQLiteDatabase db = this.getReadableDatabase();
+ Log.d(KiwixMobileActivity.TAG_KIWIX, zimFile);
+ Cursor res = db.rawQuery("select * from " + CONTACTS_TABLE_NAME + " where " + CONTACTS_COLUMN_ZIM +" = '" + zimFile + "'", null);
+ res.moveToLast();
+
+ while (res.isBeforeFirst() == false) {
+ array_list.add(res.getString(res.getColumnIndex(CONTACTS_COLUMN_SEARCH)));
+ res.moveToPrevious();
+ }
+ return array_list;
+ }
+}
+
diff --git a/src/org/kiwix/kiwixmobile/utils/HTMLUtils.java b/src/org/kiwix/kiwixmobile/utils/HTMLUtils.java
new file mode 100644
index 000000000..5a4cad369
--- /dev/null
+++ b/src/org/kiwix/kiwixmobile/utils/HTMLUtils.java
@@ -0,0 +1,128 @@
+package org.kiwix.kiwixmobile.utils;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.os.Handler;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.webkit.JavascriptInterface;
+import android.webkit.WebView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import org.kiwix.kiwixmobile.KiwixMobileActivity;
+import org.kiwix.kiwixmobile.R;
+
+import java.util.List;
+
+public class HTMLUtils {
+
+ private List sectionProperties;
+ private List textViews;
+ private ArrayAdapter arrayAdapter;
+ private KiwixMobileActivity context;
+ private Handler mHandler;
+ private ListView mRightListView;
+ private TextView headerView;
+
+ public HTMLUtils(List sectionProperties, List textViews, ListView listView, KiwixMobileActivity context, Handler handler) {
+ this.sectionProperties = sectionProperties;
+ this.textViews = textViews;
+ this.mRightListView = listView;
+ this.arrayAdapter = (ArrayAdapter) listView.getAdapter();
+ this.context = context;
+ this.mHandler = handler;
+ }
+
+ public void initInterface(WebView webView) {
+ webView.addJavascriptInterface(new HTMLinterface(), "HTMLUtils");
+ }
+
+
+ class HTMLinterface {
+ int i = 0;
+
+ @JavascriptInterface
+ @SuppressWarnings("unused")
+ public void parse(final String sectionTitle, final String element, final String id) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (element.equals("H1")) {
+ mRightListView.removeHeaderView(headerView);
+ LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.section_list, null);
+ headerView = (TextView) view.findViewById(R.id.textTab);
+ headerView.setText(sectionTitle);
+ headerView.setPadding((int) (26 * context.getResources().getDisplayMetrics().density), 0, 0, 0);
+ headerView.setBackgroundColor(Color.LTGRAY);
+ headerView.setTypeface(Typeface.DEFAULT_BOLD);
+ headerView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ context.getCurrentWebView().setScrollY(0);
+ context.mRightDrawerLayout.closeDrawer(Gravity.RIGHT);
+ }
+ });
+ mRightListView.addHeaderView(headerView);
+ } else {
+ textViews.add(i, new TextView(context));
+ sectionProperties.add(i, new KiwixMobileActivity.SectionProperties());
+ KiwixMobileActivity.SectionProperties section = sectionProperties.get(i);
+ section.sectionTitle = sectionTitle;
+ section.sectionId = id;
+ switch (element) {
+ case "H2":
+ section.leftPadding = (int) (30 * context.getResources().getDisplayMetrics().density);
+ section.typeface = Typeface.DEFAULT;
+ section.color = Color.BLACK;
+ break;
+ case "H3":
+ section.leftPadding = (int) (50 * context.getResources().getDisplayMetrics().density);
+ section.typeface = Typeface.DEFAULT;
+ section.color = Color.GRAY;
+ break;
+ default:
+ section.leftPadding = (int) (30 * context.getResources().getDisplayMetrics().density);
+ section.typeface = Typeface.DEFAULT;
+ section.color = Color.BLACK;
+ break;
+ }
+ i++;
+ }
+ }
+ });
+ }
+
+ @JavascriptInterface
+ @SuppressWarnings("unused")
+ public void start() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ i = 0;
+ textViews.clear();
+ sectionProperties.clear();
+ arrayAdapter.clear();
+ arrayAdapter.notifyDataSetChanged();
+ }
+ });
+ }
+
+ @JavascriptInterface
+ @SuppressWarnings("unused")
+ public void stop() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ arrayAdapter.notifyDataSetChanged();
+ }
+ });
+ }
+ }
+}
+
+
diff --git a/src/org/kiwix/kiwixmobile/utils/files/FileReader.java b/src/org/kiwix/kiwixmobile/utils/files/FileReader.java
new file mode 100644
index 000000000..29d96865e
--- /dev/null
+++ b/src/org/kiwix/kiwixmobile/utils/files/FileReader.java
@@ -0,0 +1,31 @@
+package org.kiwix.kiwixmobile.utils.files;
+
+import android.content.Context;
+
+import org.kiwix.kiwixmobile.KiwixMobileActivity;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+public class FileReader {
+
+ public String readFile(String filePath , Context context){
+ try {
+ StringBuilder buf = new StringBuilder();
+ InputStream json = context.getAssets().open(filePath);
+ BufferedReader in =
+ new BufferedReader(new InputStreamReader(json, "UTF-8"));
+ String str;
+
+ while ((str = in.readLine()) != null) {
+ buf.append(str);
+ }
+
+ in.close();
+ return buf.toString();
+ } catch (Exception e){
+ return "";
+ }
+ }
+}