Merge remote-tracking branch 'remotes/upstream/master'

# Conflicts resolved:
#	android/res/values/strings.xml
#	android/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java
This commit is contained in:
Elad Keyshawn 2016-04-05 10:16:54 +03:00
commit 6373074848
13 changed files with 667 additions and 67 deletions

12
assets/www/js/jsfile.js Normal file
View File

@ -0,0 +1,12 @@
function() {
window.onload = onLoad();
function onLoad() {
window.HTMLUtils.start();
for (i=0; i<document.querySelectorAll('h1, h2, h3, h4, h5, h6').length; i++) {
headerObject = document.querySelectorAll('h1, h2, h3, h4, h5, h6')[i];
window.HTMLUtils.parse(headerObject.textContent, headerObject.tagName, headerObject.id);
}
window.HTMLUtils.stop();
}
}

View File

@ -19,23 +19,29 @@ repositories {
}
dependencies {
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:support-v4:22.2.0'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
compile files("$buildDir/native-libs/native-libs.jar")
compile 'com.yahoo.squidb:squidb:2.0.0'
compile 'com.android.support:design:22.2.0'
compile 'com.android.support:design:23.1.1'
compile 'com.yahoo.squidb:squidb-annotations:2.0.0'
apt 'com.yahoo.squidb:squidb-processor:2.0.0'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile('org.simpleframework:simple-xml:2.7.+') {
exclude module: 'stax'
exclude module: 'stax-api'
exclude module: 'xpp3'
}
// compile fileTree(dir: '.', include: 'content-libs.jar') // DO NOT REMOVE !!
}
android {
compileSdkVersion 22
compileSdkVersion 23
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 14
targetSdkVersion 22
targetSdkVersion 23
}
lintOptions {

View File

@ -55,7 +55,8 @@
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingTop="4dp"
android:src="?attr/arrowBackDrawable"/>
android:src="?attr/arrowBackDrawable"
android:id="@+id/action_back_button" />
</RelativeLayout>
<RelativeLayout
@ -94,7 +95,8 @@
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:paddingTop="4dp"
android:src="?attr/arrowForwardDrawable"/>
android:src="?attr/arrowForwardDrawable"
android:id="@+id/action_forward_button" />
</RelativeLayout>
</LinearLayout>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/right_drawer"
android:layout_width="@dimen/navigation_width"
android:layout_height="match_parent"
android:layout_gravity="end"
android:background="?attr/drawerBackground"
android:clickable="true"
android:fitsSystemWindows="true"
android:orientation="vertical">
<ListView
android:id="@+id/right_drawer_list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:choiceMode="singleChoice"
android:divider="@null"
android:dividerHeight="0dp"
android:listSelector="?attr/listBackground"/>
<TextView
android:id="@+id/empty"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_toLeftOf="@+id/deleteButton"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center_vertical"
android:maxLines="1"
android:text="@string/no_section_info"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
/>
</LinearLayout>

View File

@ -65,7 +65,8 @@
</LinearLayout>
<include layout="@layout/drawer"/>
<include layout="@layout/drawer_left"/>
<include layout="@layout/drawer_right"/>
</android.support.v4.widget.DrawerLayout>
</LinearLayout>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="?attr/selectedBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:clickable="false"
android:focusable="false">
<TextView
android:id="@+id/textTab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_toLeftOf="@+id/deleteButton"
android:ellipsize="end"
android:fontFamily="sans-serif-light"
android:gravity="center_vertical"
android:maxLines="1"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceListItemSmall"/>
</RelativeLayout>

View File

@ -55,4 +55,7 @@
<string name="go_to_play_store">Go to Play Store</string>
<string name="no_bookmarks">No Bookmarks!</string>
<string name="menu_bookmarks_list">Bookmarks</string>
<string name="no_section_info">No Content Headers Found</string>
<string name="request_storage">To search for zim files we need access to your storage</string>
<string name="request_storage_title">Warning</string>
</resources>

View File

@ -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<State> mPrefState;
public static boolean mIsFullscreenOpened;
@ -140,6 +150,10 @@ public class KiwixMobileActivity extends AppCompatActivity {
public ImageButton exitFullscreenButton;
public List<SectionProperties> 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<String> bookmarks;
private List<KiwixWebView> mWebViews = new ArrayList<>();
private List<TextView> mSections = new ArrayList<>();
private KiwixTextToSpeech tts;
private CompatFindActionModeCallback mCompatCallback;
private ArrayAdapter<KiwixWebView> mDrawerAdapter;
private ArrayAdapter<KiwixWebView> mLeftArrayAdapter;
private ArrayAdapter<TextView> 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<SectionProperties>();
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<TextView> {
private Context mContext;
private int mLayoutResource;
private KiwixMobileActivity parentKiwix;
private List<TextView> mTextViews;
public KiwixToCAdapter(Context context, int resource, List<TextView> 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;
}
}

View File

@ -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<String> 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<String> a = mDatabaseHelper.getRecentSearches();
mDefaultAdapter = new ArrayAdapter<String>(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);
}

View File

@ -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<DataModel>();
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<Cursor> onCreateLoader(int i, Bundle bundle) {

View File

@ -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<String> getRecentSearches() {
ArrayList<String> array_list = new ArrayList<String>();
//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;
}
}

View File

@ -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<KiwixMobileActivity.SectionProperties> sectionProperties;
private List<TextView> textViews;
private ArrayAdapter arrayAdapter;
private KiwixMobileActivity context;
private Handler mHandler;
private ListView mRightListView;
private TextView headerView;
public HTMLUtils(List<KiwixMobileActivity.SectionProperties> sectionProperties, List<TextView> 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();
}
});
}
}
}

View File

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