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 ""; + } + } +}