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 b0a18aae7..78933d1e7 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -53,4 +53,5 @@ Could not find an installed application for this type of file Your application is corrupted.\nThis might happen when you remove files on the SD Card.\nYou need to uninstall then reinstall the App from the Play Store. Go to Play Store + No Content Headers Found \ No newline at end of file diff --git a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java index acc050339..6ad0051cd 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; @@ -42,6 +46,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.ActionMode; +import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; @@ -85,8 +90,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; @@ -126,6 +133,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; @@ -138,6 +147,10 @@ public class KiwixMobileActivity extends AppCompatActivity public ImageButton exitFullscreenButton; + public List sectionProperties; + + private HTMLUtils htmlUtils; + protected boolean requestClearHistoryAfterLoad; protected boolean requestInitAllMenuItems; @@ -150,19 +163,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; @@ -172,6 +193,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; @@ -248,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() { @@ -281,23 +309,71 @@ 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); + 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); - mDrawerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + 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(); @@ -305,6 +381,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); @@ -435,6 +512,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(); @@ -443,27 +525,28 @@ 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(); + mLeftArrayAdapter.notifyDataSetChanged(); selectTab(mWebViews.size() - 1); setUpWebView(); return webView; @@ -494,14 +577,14 @@ public class KiwixMobileActivity extends AppCompatActivity if (index < mCurrentWebViewIndex) { mCurrentWebViewIndex--; } - mDrawerList.setItemChecked(mCurrentWebViewIndex, true); + mLeftDrawerList.setItemChecked(mCurrentWebViewIndex, true); } } else { mWebViews.remove(0); mCurrentWebViewIndex = 0; newTab(); } - mDrawerAdapter.notifyDataSetChanged(); + mLeftArrayAdapter.notifyDataSetChanged(); } private void undoSnackbar(final int index) { @@ -520,17 +603,17 @@ 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(); + mLeftDrawerLayout.closeDrawers(); } }, 150); } @@ -538,10 +621,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 @@ -754,7 +838,7 @@ 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.LENGTH_LONG).show(); } return false; } @@ -792,6 +876,18 @@ public class KiwixMobileActivity extends AppCompatActivity 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); @@ -824,6 +920,7 @@ public class KiwixMobileActivity extends AppCompatActivity } } return false; + } public void toggleBookmark() { @@ -1105,6 +1202,7 @@ public class KiwixMobileActivity extends AppCompatActivity public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); refreshBookmarkSymbol(menu); + refreshNavigationButtons(); return true; } @@ -1122,6 +1220,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); @@ -1198,7 +1316,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); @@ -1425,6 +1545,7 @@ public class KiwixMobileActivity extends AppCompatActivity view.reload(); } mAdapter.notifyDataSetChanged(); + updateTableOfContents(); } } @@ -1505,4 +1626,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..4a1213f6d 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); + mListView = (ListView) findViewById(R.id.search_list); - mAdapter = new AutoCompleteAdapter(this); - mListView.setAdapter(mAdapter); - mListView.setOnItemClickListener(this); + mDatabaseHelper = new DatabaseHelper(this); + 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/utils/DatabaseHelper.java b/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java new file mode 100644 index 000000000..fa3f2e398 --- /dev/null +++ b/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java @@ -0,0 +1,83 @@ +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 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 DatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, 1); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // TODO Auto-generated method stub + db.execSQL( + "create table " + CONTACTS_TABLE_NAME + + " (id integer primary key, search 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); + 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(); + Cursor res = db.rawQuery("select * from " + CONTACTS_TABLE_NAME, 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 ""; + } + } +}