From c4c5d30256babc8c8d2abce5358c18899a55f59c Mon Sep 17 00:00:00 2001 From: Elad Keyshawn Date: Mon, 23 May 2016 22:33:43 +0300 Subject: [PATCH 01/10] Minor strings enhancements --- res/values/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index f35079404..76d85a147 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -51,7 +51,7 @@ Choose a language The language of this page is not supported, or appropriate language data was not installed. The article may not be properly read. 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. + 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 Bookmarks Bookmarks @@ -59,7 +59,7 @@ To access zim files we need access to your storage Are you sure you want to delete your search history? Are you sure you want to delete your search history and reset all active tabs? - Delete this item? + Delete this item? Clear History Clear recent searches and tabs history All History Cleared @@ -71,7 +71,7 @@ Did you know? Undo Tab closed - Deleted + deleted Bookmarks restored Please Rate Us If you enjoy using From c9c1da2726741a387c19524d1211a4b4bd963911 Mon Sep 17 00:00:00 2001 From: Elad Keyshawn Date: Tue, 24 May 2016 11:50:15 +0300 Subject: [PATCH 02/10] * Sqlite db - bug fixed * Creating ShortcutsHelper class for useful functions --- .../kiwixmobile/KiwixMobileActivity.java | 37 +++++++++---------- src/org/kiwix/kiwixmobile/SearchActivity.java | 20 ++-------- .../kiwixmobile/utils/DatabaseHelper.java | 2 +- .../kiwixmobile/utils/ShortcutUtils.java | 29 +++++++++++++++ .../kiwixmobile/views/BookmarksActivity.java | 12 +++--- 5 files changed, 55 insertions(+), 45 deletions(-) create mode 100644 src/org/kiwix/kiwixmobile/utils/ShortcutUtils.java diff --git a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java index 91279cd1c..d1b3a524e 100644 --- a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java +++ b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java @@ -85,6 +85,7 @@ 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.ShortcutUtils; import org.kiwix.kiwixmobile.utils.files.FileReader; import org.kiwix.kiwixmobile.utils.files.FileUtils; import org.kiwix.kiwixmobile.utils.files.RateAppCounter; @@ -449,13 +450,13 @@ public class KiwixMobileActivity extends AppCompatActivity { public void showRateDialog(final Context mContext, final SharedPreferences.Editor editor) { AlertDialog alertDialog = new AlertDialog.Builder(mContext).create(); - alertDialog.setTitle(stringsGetter(R.string.rate_dialog_title)); + alertDialog.setTitle(ShortcutUtils.stringsGetter(R.string.rate_dialog_title, this)); - alertDialog.setMessage(stringsGetter(R.string.rate_dialog_msg_1) + " " + alertDialog.setMessage(ShortcutUtils.stringsGetter(R.string.rate_dialog_msg_1, this) + " " + getString(R.string.app_name) - + stringsGetter(R.string.rate_dialog_msg_2)); + + ShortcutUtils.stringsGetter(R.string.rate_dialog_msg_2, this)); - alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, stringsGetter(R.string.rate_dialog_positive), + alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, ShortcutUtils.stringsGetter(R.string.rate_dialog_positive, this), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -464,7 +465,7 @@ public class KiwixMobileActivity extends AppCompatActivity { } }); - alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, stringsGetter(R.string.rate_dialog_negative), + alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, ShortcutUtils.stringsGetter(R.string.rate_dialog_negative, this), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -473,7 +474,7 @@ public class KiwixMobileActivity extends AppCompatActivity { } }); - alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, stringsGetter(R.string.rate_dialog_neutral), + alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, ShortcutUtils.stringsGetter(R.string.rate_dialog_neutral, this), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { @@ -488,10 +489,6 @@ public class KiwixMobileActivity extends AppCompatActivity { alertDialog.show(); } - private String stringsGetter(int strId) { - return getResources().getString(strId); - } - private void goToRateApp() { Intent goToMarket = new Intent(Intent.ACTION_VIEW, KIWIX_LOCAL_MARKET_URI); @@ -677,8 +674,8 @@ public class KiwixMobileActivity extends AppCompatActivity { } private void undoSnackbar(final int index) { - Snackbar undoSnackbar = Snackbar.make(snackbarLayout, stringsGetter(R.string.tab_closed), Snackbar.LENGTH_LONG) - .setAction(stringsGetter(R.string.undo), new View.OnClickListener() { + Snackbar undoSnackbar = Snackbar.make(snackbarLayout, ShortcutUtils.stringsGetter(R.string.tab_closed, this), Snackbar.LENGTH_LONG) + .setAction(ShortcutUtils.stringsGetter(R.string.undo, this), new View.OnClickListener() { @Override public void onClick(View v) { @@ -1078,8 +1075,8 @@ public class KiwixMobileActivity extends AppCompatActivity { private void popBookmarkSnackbar(boolean isBookmark) { if (isBookmark) { Snackbar bookmarkSnackbar = - Snackbar.make(snackbarLayout, stringsGetter(R.string.bookmark_added), Snackbar.LENGTH_LONG) - .setAction(stringsGetter(R.string.open), new View.OnClickListener() { + Snackbar.make(snackbarLayout, ShortcutUtils.stringsGetter(R.string.bookmark_added, this), Snackbar.LENGTH_LONG) + .setAction(ShortcutUtils.stringsGetter(R.string.open, this), new View.OnClickListener() { @Override public void onClick(View v) { goToBookmarks(); @@ -1089,7 +1086,7 @@ public class KiwixMobileActivity extends AppCompatActivity { bookmarkSnackbar.show(); } else { Snackbar bookmarkSnackbar = - Snackbar.make(snackbarLayout, stringsGetter(R.string.bookmark_removed), Snackbar.LENGTH_LONG); + Snackbar.make(snackbarLayout, ShortcutUtils.stringsGetter(R.string.bookmark_removed, this), Snackbar.LENGTH_LONG); bookmarkSnackbar.show(); } } @@ -1154,12 +1151,12 @@ public class KiwixMobileActivity extends AppCompatActivity { }, 500); AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(stringsGetter(R.string.hint_contents_drawer_message)) - .setPositiveButton(stringsGetter(R.string.got_it), new DialogInterface.OnClickListener() { + builder.setMessage(ShortcutUtils.stringsGetter(R.string.hint_contents_drawer_message, this)) + .setPositiveButton(ShortcutUtils.stringsGetter(R.string.got_it, this), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { } }) - .setTitle(stringsGetter(R.string.did_you_know)) + .setTitle(ShortcutUtils.stringsGetter(R.string.did_you_know, this)) .setIcon(R.drawable.icon_question); AlertDialog alert = builder.create(); alert.show();//showing the dialog @@ -1261,8 +1258,8 @@ public class KiwixMobileActivity extends AppCompatActivity { public void onClick(DialogInterface dialog, int id) { if (isOpenNewTabInBackground) { newTabInBackground(url); - Snackbar snackbar = Snackbar.make(snackbarLayout, stringsGetter(R.string.new_tab_snackbar), Snackbar.LENGTH_LONG) - .setAction(stringsGetter(R.string.open), new View.OnClickListener() { + Snackbar snackbar = Snackbar.make(snackbarLayout, ShortcutUtils.stringsGetter(R.string.new_tab_snackbar, getBaseContext()), Snackbar.LENGTH_LONG) + .setAction(ShortcutUtils.stringsGetter(R.string.open, getBaseContext()), new View.OnClickListener() { @Override public void onClick(View v) { if (mWebViews.size() > 1) diff --git a/src/org/kiwix/kiwixmobile/SearchActivity.java b/src/org/kiwix/kiwixmobile/SearchActivity.java index d3f874830..a539e2977 100644 --- a/src/org/kiwix/kiwixmobile/SearchActivity.java +++ b/src/org/kiwix/kiwixmobile/SearchActivity.java @@ -19,6 +19,7 @@ import android.widget.TextView; import android.widget.Toast; import org.kiwix.kiwixmobile.utils.DatabaseHelper; +import org.kiwix.kiwixmobile.utils.ShortcutUtils; import org.kiwix.kiwixmobile.views.AutoCompleteAdapter; import java.util.ArrayList; @@ -45,7 +46,6 @@ public class SearchActivity extends AppCompatActivity implements AdapterView.OnI getSupportActionBar().setHomeButtonEnabled(true); String zimFile = getIntent().getStringExtra("zimFile"); - zimFile = escapeSqlSyntax(zimFile); mListView = (ListView) findViewById(R.id.search_list); mDatabaseHelper = new DatabaseHelper(this, zimFile); SQLiteDatabase db = mDatabaseHelper.getWritableDatabase(); @@ -114,7 +114,6 @@ public class SearchActivity extends AppCompatActivity implements AdapterView.OnI @Override public void onItemClick(AdapterView parent, View view, int position, long id) { String title = ((TextView) view).getText().toString(); - title = escapeSqlSyntax(title); mDatabaseHelper.insertSearch(title); sendMessage(title); } @@ -137,7 +136,7 @@ public class SearchActivity extends AppCompatActivity implements AdapterView.OnI private void deleteSpecificSearchDialog(final String search) { new AlertDialog.Builder(this) - .setMessage(getResources().getString(R.string.deleteRecentSearchItem)) + .setMessage(ShortcutUtils.stringsGetter(R.string.delete_recent_search_item,this)) .setPositiveButton(getResources().getString(R.string.delete), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { deleteSpecificSearchItem(search); @@ -154,22 +153,10 @@ public class SearchActivity extends AppCompatActivity implements AdapterView.OnI private void deleteSpecificSearchItem(String search) { SQLiteDatabase db = mDatabaseHelper.getWritableDatabase(); - mDatabaseHelper.deleteSpecificSearch(db, escapeSqlSyntax(search)); + mDatabaseHelper.deleteSpecificSearch(db, ShortcutUtils.escapeSqlSyntax(search)); resetAdapter(); } - private String escapeSqlSyntax(String search) { //Escapes sql ' if exists - String tempStr = ""; - char[] charArray = search.toCharArray(); - for (char a : charArray) { - if (a != '\'') - tempStr += a; - else - tempStr += "''"; - } - return tempStr; - } - private void resetAdapter() { ArrayList a = mDatabaseHelper.getRecentSearches(); mDefaultAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1); @@ -178,5 +165,4 @@ public class SearchActivity extends AppCompatActivity implements AdapterView.OnI mDefaultAdapter.notifyDataSetChanged(); } - } diff --git a/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java b/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java index 42e90d8ca..28cb9af93 100644 --- a/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java +++ b/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java @@ -86,7 +86,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { //hp = new HashMap(); Log.d(KiwixMobileActivity.TAG_KIWIX, zimFile); Cursor res = db.rawQuery("select * from " + CONTACTS_TABLE_NAME - + " where " + CONTACTS_COLUMN_ZIM + " = '" + zimFile + "'", null); + + " where " + CONTACTS_COLUMN_ZIM + " = '" + ShortcutUtils.escapeSqlSyntax(zimFile) + "'", null); res.moveToLast(); while (!res.isBeforeFirst()) { diff --git a/src/org/kiwix/kiwixmobile/utils/ShortcutUtils.java b/src/org/kiwix/kiwixmobile/utils/ShortcutUtils.java new file mode 100644 index 000000000..00fdf3993 --- /dev/null +++ b/src/org/kiwix/kiwixmobile/utils/ShortcutUtils.java @@ -0,0 +1,29 @@ +package org.kiwix.kiwixmobile.utils; + +import android.content.Context; + + +/* +Helper class containing basic useful functions +that are meant to make shortcuts and beautifying code. +*/ + +public class ShortcutUtils { + + public static String stringsGetter(int strId, Context context) { + return context.getResources().getString(strId); + } + + public static String escapeSqlSyntax(String search) { //Escapes sql ' if exists + String tempStr = ""; + char[] charArray = search.toCharArray(); + for (char a : charArray) { + if (a != '\'') + tempStr += a; + else + tempStr += "''"; + } + return tempStr; + } + +} diff --git a/src/org/kiwix/kiwixmobile/views/BookmarksActivity.java b/src/org/kiwix/kiwixmobile/views/BookmarksActivity.java index b4595350b..6924165b5 100644 --- a/src/org/kiwix/kiwixmobile/views/BookmarksActivity.java +++ b/src/org/kiwix/kiwixmobile/views/BookmarksActivity.java @@ -20,6 +20,7 @@ import android.widget.TextView; import android.widget.Toast; import org.kiwix.kiwixmobile.R; +import org.kiwix.kiwixmobile.utils.ShortcutUtils; import java.util.ArrayList; @@ -117,15 +118,15 @@ public class BookmarksActivity extends AppCompatActivity private void popDeleteBookmarksSnackbar() { Snackbar bookmarkDeleteSnackbar = - Snackbar.make(snackbarLayout, numOfSelected + " " + stringsGetter(R.string.deleted_message), Snackbar.LENGTH_LONG) - .setAction(stringsGetter(R.string.undo), new View.OnClickListener() { + Snackbar.make(snackbarLayout, numOfSelected + " " + ShortcutUtils.stringsGetter(R.string.deleted_message,this), Snackbar.LENGTH_LONG) + .setAction(ShortcutUtils.stringsGetter(R.string.undo,this), new View.OnClickListener() { @Override public void onClick(View v) { contents.clear(); contents.addAll(tempContents); adapter.notifyDataSetChanged(); setNoBookmarksState(); - Toast.makeText(getApplicationContext(), stringsGetter(R.string.bookmarks_restored), Toast.LENGTH_SHORT) + Toast.makeText(getApplicationContext(), ShortcutUtils.stringsGetter(R.string.bookmarks_restored,getBaseContext()), Toast.LENGTH_SHORT) .show(); } }); @@ -145,7 +146,7 @@ public class BookmarksActivity extends AppCompatActivity private void setUpToolbar() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - toolbar.setTitle(stringsGetter(R.string.menu_bookmarks_list)); + toolbar.setTitle(ShortcutUtils.stringsGetter(R.string.menu_bookmarks_list,this)); setSupportActionBar(toolbar); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -181,7 +182,4 @@ public class BookmarksActivity extends AppCompatActivity super.onBackPressed(); } - public String stringsGetter(int strId) { - return getResources().getString(strId); - } } From fd7cdcf4461a5aebd7a384b65622ec17f0d04e47 Mon Sep 17 00:00:00 2001 From: Elad Keyshawn Date: Mon, 30 May 2016 00:18:45 +0300 Subject: [PATCH 03/10] Initial search widget TODO: different actions on widget --- AndroidManifest.xml | 7 +++ res/layout/kiwix_search_widget.xml | 40 ++++++++++++++ res/values/dimens.xml | 1 + res/xml/kiwix_widget_provider_info.xml | 14 +++++ .../kiwixmobile/KiwixMobileActivity.java | 14 ++++- src/org/kiwix/kiwixmobile/SearchActivity.java | 3 +- .../kiwixmobile/utils/KiwixSearchWidget.java | 54 +++++++++++++++++++ .../kiwixmobile/utils/ShortcutUtils.java | 22 ++++---- .../kiwixmobile/views/BookmarksActivity.java | 16 +++--- 9 files changed, 153 insertions(+), 18 deletions(-) create mode 100644 res/layout/kiwix_search_widget.xml create mode 100644 res/xml/kiwix_widget_provider_info.xml create mode 100644 src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f7033f727..7dfa45e08 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -107,6 +107,13 @@ android:authorities="org.kiwix.zim.base" android:exported="true" /> + + + + + + diff --git a/res/layout/kiwix_search_widget.xml b/res/layout/kiwix_search_widget.xml new file mode 100644 index 000000000..884aff7fd --- /dev/null +++ b/res/layout/kiwix_search_widget.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 6d191e608..e44402d7f 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -6,5 +6,6 @@ 4dp 8dp 260dp + 0dp diff --git a/res/xml/kiwix_widget_provider_info.xml b/res/xml/kiwix_widget_provider_info.xml new file mode 100644 index 000000000..01514b0c1 --- /dev/null +++ b/res/xml/kiwix_widget_provider_info.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java index d1b3a524e..96685e243 100644 --- a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java +++ b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java @@ -138,6 +138,8 @@ public class KiwixMobileActivity extends AppCompatActivity { private static final String PREF_NEWTAB_BACKGROUND = "pref_newtab_background"; + private static boolean IS_WIDGET_INTENT = false; + private static final int REQUEST_FILE_SELECT = 1234; private static final int REQUEST_PREFERENCES = 1235; @@ -306,7 +308,10 @@ 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); - + IS_WIDGET_INTENT = getIntent().getBooleanExtra("isWidget", false); + if (IS_WIDGET_INTENT){ + goToSearch(); + } tempForUndo = new KiwixWebView(getApplicationContext()); /** initializing temporary tab value **/ snackbarLayout = @@ -447,6 +452,13 @@ public class KiwixMobileActivity extends AppCompatActivity { updateTitle(ZimContentProvider.getZimFileTitle()); } + private void goToSearch() { + final String zimFile = ZimContentProvider.getZimFile(); + Intent i = new Intent(KiwixMobileActivity.this, SearchActivity.class); + i.putExtra("zimFile", zimFile); + startActivityForResult(i, REQUEST_FILE_SEARCH); + } + public void showRateDialog(final Context mContext, final SharedPreferences.Editor editor) { AlertDialog alertDialog = new AlertDialog.Builder(mContext).create(); diff --git a/src/org/kiwix/kiwixmobile/SearchActivity.java b/src/org/kiwix/kiwixmobile/SearchActivity.java index a539e2977..a9c7df2a0 100644 --- a/src/org/kiwix/kiwixmobile/SearchActivity.java +++ b/src/org/kiwix/kiwixmobile/SearchActivity.java @@ -24,7 +24,8 @@ import org.kiwix.kiwixmobile.views.AutoCompleteAdapter; import java.util.ArrayList; -public class SearchActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { +public class SearchActivity extends AppCompatActivity + implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { private ListView mListView; diff --git a/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java b/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java new file mode 100644 index 000000000..e5a9b7531 --- /dev/null +++ b/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java @@ -0,0 +1,54 @@ +package org.kiwix.kiwixmobile.utils; + +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.widget.RemoteViews; + +import org.kiwix.kiwixmobile.KiwixMobileActivity; +import org.kiwix.kiwixmobile.R; + +public class KiwixSearchWidget extends AppWidgetProvider { + + private static final String TEXT_CLICKED = "SearchKiwixActionClicked"; + private static final String MIC_CLICKED = "MicSearchActionClicked"; + + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + + final int N = appWidgetIds.length; + + for (int i=0; i(); - bookmarksList = (ListView) findViewById(R.id.bookmarks_list); - noBookmarksTextView = (TextView) findViewById(R.id.bookmarks_list_nobookmarks); - adapter = new ArrayAdapter(getApplicationContext(), R.layout.bookmarks_row, R.id.bookmark_title, - contents); - bookmarksList.setAdapter(adapter); + selected = new ArrayList<>(); + bookmarksList = (ListView) findViewById(R.id.bookmarks_list); + noBookmarksTextView = (TextView) findViewById(R.id.bookmarks_list_nobookmarks); + if(getIntent().getStringArrayListExtra("bookmark_contents") != null) { + contents = getIntent().getStringArrayListExtra("bookmark_contents"); + adapter = new ArrayAdapter(getApplicationContext(), R.layout.bookmarks_row, R.id.bookmark_title, + contents); + bookmarksList.setAdapter(adapter); + } setNoBookmarksState(); bookmarksList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL); From 3648f2f952ebc41a58a893b7d92f3dd62df77001 Mon Sep 17 00:00:00 2001 From: Elad Keyshawn Date: Mon, 30 May 2016 01:59:21 +0300 Subject: [PATCH 04/10] Search Widget - implemented: - Kiwix icon for opening main app - Star icon for opening bookmarks - Mic icon for voice search (Still not functional) --- AndroidManifest.xml | 5 ++ res/layout/kiwix_search_widget.xml | 19 +++++--- res/values/colors.xml | 3 +- res/values/strings.xml | 1 + .../kiwixmobile/KiwixMobileActivity.java | 29 ++++++++---- src/org/kiwix/kiwixmobile/SearchActivity.java | 2 +- .../kiwixmobile/utils/DatabaseHelper.java | 5 +- .../kiwixmobile/utils/KiwixSearchWidget.java | 46 +++++++++++++------ .../kiwixmobile/views/BookmarksActivity.java | 2 +- 9 files changed, 75 insertions(+), 37 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7dfa45e08..286d9fe75 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -110,6 +110,11 @@ + + + + + diff --git a/res/layout/kiwix_search_widget.xml b/res/layout/kiwix_search_widget.xml index 884aff7fd..7328190ba 100644 --- a/res/layout/kiwix_search_widget.xml +++ b/res/layout/kiwix_search_widget.xml @@ -3,9 +3,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" - android:layout_height="46dp" + android:layout_height="50dp" android:id="@+id/kiwix_search_widget_layout_id" - android:background="@color/white_undo" + android:background="@color/white" android:padding="@dimen/widget_margin" android:gravity="center_vertical"> @@ -19,17 +19,24 @@ + android:layout_weight="0.7"/> + + + android:layout_weight="0.1"/> diff --git a/res/values/colors.xml b/res/values/colors.xml index 87691a16e..112dcbe1e 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -9,11 +9,12 @@ #727272 #212121 #B6B6B6 - #FAFAFA + #FAFAFA #0d000000 #ffffff #0F000000 #1E000000 #BDBDBD #212121 + #808080 \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 76d85a147..f6379f7b6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -86,4 +86,5 @@ When opening a new tab it will open in background Extras Link opened in new tab + Search Kiwix \ No newline at end of file diff --git a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java index 96685e243..3f9b2e9f0 100644 --- a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java +++ b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java @@ -138,8 +138,6 @@ public class KiwixMobileActivity extends AppCompatActivity { private static final String PREF_NEWTAB_BACKGROUND = "pref_newtab_background"; - private static boolean IS_WIDGET_INTENT = false; - private static final int REQUEST_FILE_SELECT = 1234; private static final int REQUEST_PREFERENCES = 1235; @@ -308,10 +306,16 @@ 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); - IS_WIDGET_INTENT = getIntent().getBooleanExtra("isWidget", false); - if (IS_WIDGET_INTENT){ - goToSearch(); - } + + boolean IS_WIDGET_SEARCH_INTENT; + boolean IS_WIDGET_VOICE_SEARCH; + boolean IS_WIDGET_STAR; + IS_WIDGET_SEARCH_INTENT = getIntent().getBooleanExtra("isWidgetSearch", false); + IS_WIDGET_VOICE_SEARCH = getIntent().getBooleanExtra("isWidgetVoice", false); + IS_WIDGET_STAR = getIntent().getBooleanExtra("isWidgetStar", false); + + + tempForUndo = new KiwixWebView(getApplicationContext()); /** initializing temporary tab value **/ snackbarLayout = @@ -450,6 +454,13 @@ public class KiwixMobileActivity extends AppCompatActivity { setUpExitFullscreenButton(); loadPrefs(); updateTitle(ZimContentProvider.getZimFileTitle()); + if(IS_WIDGET_STAR){ + goToBookmarks(); + } else if (IS_WIDGET_SEARCH_INTENT) { + goToSearch(); + } else if (IS_WIDGET_VOICE_SEARCH) { + + } } private void goToSearch() { @@ -700,7 +711,7 @@ public class KiwixMobileActivity extends AppCompatActivity { mLeftDrawerLayout.openDrawer(Gravity.LEFT); } }); - undoSnackbar.setActionTextColor(getResources().getColor(R.color.white_undo)); + undoSnackbar.setActionTextColor(getResources().getColor(R.color.white)); undoSnackbar.show(); } @@ -1094,7 +1105,7 @@ public class KiwixMobileActivity extends AppCompatActivity { goToBookmarks(); } }); - bookmarkSnackbar.setActionTextColor(getResources().getColor(R.color.white_undo)); + bookmarkSnackbar.setActionTextColor(getResources().getColor(R.color.white)); bookmarkSnackbar.show(); } else { Snackbar bookmarkSnackbar = @@ -1278,7 +1289,7 @@ public class KiwixMobileActivity extends AppCompatActivity { selectTab(mWebViews.size() - 1); } }); - snackbar.setActionTextColor(getResources().getColor(R.color.white_undo)); + snackbar.setActionTextColor(getResources().getColor(R.color.white)); snackbar.show(); } else { newTab(url); diff --git a/src/org/kiwix/kiwixmobile/SearchActivity.java b/src/org/kiwix/kiwixmobile/SearchActivity.java index a9c7df2a0..b10ccc83e 100644 --- a/src/org/kiwix/kiwixmobile/SearchActivity.java +++ b/src/org/kiwix/kiwixmobile/SearchActivity.java @@ -137,7 +137,7 @@ public class SearchActivity extends AppCompatActivity private void deleteSpecificSearchDialog(final String search) { new AlertDialog.Builder(this) - .setMessage(ShortcutUtils.stringsGetter(R.string.delete_recent_search_item,this)) + .setMessage(ShortcutUtils.stringsGetter(R.string.delete_recent_search_item, this)) .setPositiveButton(getResources().getString(R.string.delete), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { deleteSpecificSearchItem(search); diff --git a/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java b/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java index 28cb9af93..d8f570baf 100644 --- a/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java +++ b/src/org/kiwix/kiwixmobile/utils/DatabaseHelper.java @@ -6,9 +6,6 @@ import android.database.Cursor; import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; -import android.util.Log; - -import org.kiwix.kiwixmobile.KiwixMobileActivity; import java.util.ArrayList; @@ -84,7 +81,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { ArrayList array_list = new ArrayList(); SQLiteDatabase db = this.getReadableDatabase(); //hp = new HashMap(); - Log.d(KiwixMobileActivity.TAG_KIWIX, zimFile); +// Log.d(KiwixMobileActivity.TAG_KIWIX, zimFile); Cursor res = db.rawQuery("select * from " + CONTACTS_TABLE_NAME + " where " + CONTACTS_COLUMN_ZIM + " = '" + ShortcutUtils.escapeSqlSyntax(zimFile) + "'", null); res.moveToLast(); diff --git a/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java b/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java index e5a9b7531..6df372459 100644 --- a/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java +++ b/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java @@ -13,7 +13,9 @@ import org.kiwix.kiwixmobile.R; public class KiwixSearchWidget extends AppWidgetProvider { private static final String TEXT_CLICKED = "SearchKiwixActionClicked"; + private static final String ICON_CLICKED = "KiwixIconActionClicked"; private static final String MIC_CLICKED = "MicSearchActionClicked"; + private static final String STAR_CLICKED = "StarActionClicked"; @Override @@ -21,19 +23,34 @@ public class KiwixSearchWidget extends AppWidgetProvider { final int N = appWidgetIds.length; - for (int i=0; i Date: Mon, 30 May 2016 12:22:41 +0300 Subject: [PATCH 05/10] Search Widget - - Added widget preview - rounded corner --- res/drawable/search_widget_background.xml | 6 ++++++ res/layout/kiwix_search_widget.xml | 2 +- res/xml/kiwix_widget_provider_info.xml | 5 +++-- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 res/drawable/search_widget_background.xml diff --git a/res/drawable/search_widget_background.xml b/res/drawable/search_widget_background.xml new file mode 100644 index 000000000..50b760315 --- /dev/null +++ b/res/drawable/search_widget_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/res/layout/kiwix_search_widget.xml b/res/layout/kiwix_search_widget.xml index 7328190ba..13ed19c61 100644 --- a/res/layout/kiwix_search_widget.xml +++ b/res/layout/kiwix_search_widget.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="50dp" android:id="@+id/kiwix_search_widget_layout_id" - android:background="@color/white" + android:background="@drawable/search_widget_background" android:padding="@dimen/widget_margin" android:gravity="center_vertical"> diff --git a/res/xml/kiwix_widget_provider_info.xml b/res/xml/kiwix_widget_provider_info.xml index 01514b0c1..e8fa55b3a 100644 --- a/res/xml/kiwix_widget_provider_info.xml +++ b/res/xml/kiwix_widget_provider_info.xml @@ -3,10 +3,11 @@ android:minWidth="250dp" android:minHeight="40dp" android:minResizeWidth="250dp" + android:minResizeHeight="40dp" android:updatePeriodMillis="86400000" - android:previewImage="@mipmap/kiwix_icon" + android:previewImage="@drawable/search_widget_preview" android:initialLayout="@layout/kiwix_search_widget" - android:resizeMode="horizontal"> + android:resizeMode="horizontal|vertical"> From 9a1628d91d63d653b7ace1a6bb3787d225910b2d Mon Sep 17 00:00:00 2001 From: Elad Keyshawn Date: Mon, 30 May 2016 13:05:36 +0300 Subject: [PATCH 06/10] Search Widget - added drawables --- res/drawable-hdpi/ic_mic_black_24dp.png | Bin 0 -> 344 bytes res/drawable-hdpi/ic_stars_black_24dp.png | Bin 0 -> 509 bytes res/drawable-hdpi/ic_widget_kiwix.png | Bin 0 -> 2051 bytes res/drawable-mdpi/ic_mic_black_24dp.png | Bin 0 -> 232 bytes res/drawable-mdpi/ic_stars_black_24dp.png | Bin 0 -> 340 bytes res/drawable-mdpi/ic_widget_kiwix.png | Bin 0 -> 1216 bytes res/drawable-xhdpi/ic_mic_black_24dp.png | Bin 0 -> 418 bytes res/drawable-xhdpi/ic_stars_black_24dp.png | Bin 0 -> 659 bytes res/drawable-xhdpi/ic_widget_kiwix.png | Bin 0 -> 3050 bytes res/drawable-xxhdpi/ic_mic_black_24dp.png | Bin 0 -> 581 bytes res/drawable-xxhdpi/ic_stars_black_24dp.png | Bin 0 -> 951 bytes res/drawable-xxhdpi/ic_widget_kiwix.png | Bin 0 -> 5303 bytes res/drawable-xxxhdpi/ic_mic_black_24dp.png | Bin 0 -> 773 bytes res/drawable-xxxhdpi/ic_stars_black_24dp.png | Bin 0 -> 1257 bytes res/drawable-xxxhdpi/ic_widget_kiwix.png | Bin 0 -> 7770 bytes res/drawable/search_widget_preview.png | Bin 0 -> 15417 bytes 16 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/drawable-hdpi/ic_mic_black_24dp.png create mode 100644 res/drawable-hdpi/ic_stars_black_24dp.png create mode 100644 res/drawable-hdpi/ic_widget_kiwix.png create mode 100644 res/drawable-mdpi/ic_mic_black_24dp.png create mode 100644 res/drawable-mdpi/ic_stars_black_24dp.png create mode 100644 res/drawable-mdpi/ic_widget_kiwix.png create mode 100644 res/drawable-xhdpi/ic_mic_black_24dp.png create mode 100644 res/drawable-xhdpi/ic_stars_black_24dp.png create mode 100644 res/drawable-xhdpi/ic_widget_kiwix.png create mode 100644 res/drawable-xxhdpi/ic_mic_black_24dp.png create mode 100644 res/drawable-xxhdpi/ic_stars_black_24dp.png create mode 100644 res/drawable-xxhdpi/ic_widget_kiwix.png create mode 100644 res/drawable-xxxhdpi/ic_mic_black_24dp.png create mode 100644 res/drawable-xxxhdpi/ic_stars_black_24dp.png create mode 100644 res/drawable-xxxhdpi/ic_widget_kiwix.png create mode 100644 res/drawable/search_widget_preview.png diff --git a/res/drawable-hdpi/ic_mic_black_24dp.png b/res/drawable-hdpi/ic_mic_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..74218e1a654239fed6b687d62cd6af594c5cf71d GIT binary patch literal 344 zcmV-e0jK_nP)El6=!u!2@xw3|4KiT_1kLfjMw!ATHt%!^dxF41^} z8gpD6E*DJ9ji6}0-+sp9|Fz|{PbzPmHHXVa@}rSGEv*`SBTTIoomj#i2^ zy8pX|y8rG_=dT;O_Xmcy6~z+hN~61ASy618=#GeWa6=kh1*b*aHqiwU7r{v%rPc>0 zz!ed@COWPXF93V>8*vHnQVcDd;;|UptR36X&?}pOb0Qv@YF#DXIt7~6yceIXG2MZP zLuWK?>5I7O7d;g5%`@jMfn#<(Hx}{03=Vt|5nsL2Hxdz*TV}N3i6g0X_6vd8(xqSzZwB?CPi)9u70000`j^ literal 0 HcmV?d00001 diff --git a/res/drawable-hdpi/ic_stars_black_24dp.png b/res/drawable-hdpi/ic_stars_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..fba38967bc04a9e537ffad2f1ee0a9f05d98aaa3 GIT binary patch literal 509 zcmV8Vh{X;lSO%?gRXTZY7!MWdbw8K+DO8E43IIh$`guHUwh zaVURN>)Ch?e2_o(J_%z&)&cOpko9)Dem}C|XBANKHNRKUiWa`{CV*l2;*6M`d)e~E zlDD22cf%z$05um}Gv={b^HyvLTACzgac9s~Ww`FIprr+3;v0LQLlG5|QC%lyQ;2+_ z2YGtE7PrlGQ0#((avZWO6b(w3am8Wn9LX#}Jvr>ee(jt{n&hw_W>zhw!>^>9Am(fm zypiKw(w!!zJNZ`}2JCacWiQ}XTeYrJ8>4N>NpRkGLGaBW_^+)RkRnO2pQ`})RYHZ22A;=u4%)Xc@s|QwDkbnP)Be+(@g}UK_L??!rR83Tjb(d0GM_Y|crT*a>WmH^J zq^27FsIhTLTuR-_7}KD(YAV&yjt-)N3ZssIm-(9K^Ds3C_j18bW6GP{1oC~~Ip=wo z=Y8H|c+1Va<>#jn!2ddejS*;!Km$GS|CvIL;{*XsfbRnD0>RdimB3Tr2~ci~`MQA) z_WOB25pWzw2W<)Tx4&rnzsK(61s(wZ0R95}6}WGV5wQP?)d_&(IC?Jv7z#`S1^~^i z=c}*b06Op^AP@LGZ~}M;IK~(~e`DqsfIa*Nz;t`~c2y};Qc}XDOP44pC?F^(h{(uD zx^?SDvu4ez4yY7TMD_!J6ae5$pa3W~##A&ENnHRaWqtwt1ZV-6)2C0fYu7H09zDv# zhjQ$HtYyoVj2txaku!&Mntvq47h2dasc?eAt~k)fa5sd0pd^*qL@sO01#Kw&q-N;lkMM6MM0c(Lz>kFb*05)}Efn7kf*XuRY zr%z|ko;?9Yy;G-7Y~H+?TeoiU`0-<+qodsjg@=c09eLqXAQiY=AJ*~(Kszi4eg=fD zTeptIix=ZK4X?qTJ$tfk+cx_3>n9MZgDhZ~F-G+gkof`-1<2if^7HdepFVwf@hr_KCRNy(pbJ+!KlA=?%bKY zygaw4Q&Ur25|}t~BK!93t4gKyz^{!l<$>(t3xHT>qxgUP`0?!DFD9(Nb?@Gt0|ySc z`TzX+bC-JCw{Oq&>(}vkJfhod)q*jmIFMa@0hnO{ygPjOaB^~T0$KO9cjfuPg9mf! zl!)i03Ba{$*9Z*_RbdqZn-q0pOi5igs}q2+W5;s%@Zq|y8PIzZCQM-W?%jlig_Qxf zft|o^V~jevU-Jdv$G|r6|AGYz*tAK`d2=>y+&J2`Ye#l=w$jSkxpQZESXh`2t%6oz zWEx{i{q5)rKyRyKqK+In!k95*{H^5{XmIdLVe0it*S&6Hq51RYvvA=;d7az0Z!>e| zOmEw^ZJ%dkWR!Y59vxag^`C5Gj3QI3`2z4BkPb|!sHg~19h^OTw#J3@Z1(KgL`6l> zym@mfD=R52Ep=tag9i^#2bWfA)20o*d-r}-E4k~Hm6cVdrlx)s5fM?mcJ10{K|w*P z32Bty04IGlI9~wd%JIM_lFSz_TtEj^H?3}x3raI9)?R)5+WG=@?AS4G-n>afL<9o| z4s=0PR8)|hoLt(!fB%A%l$5GD;xh0nW6bBZg}|Q{k_z1nBmthSTep&ulJZSAmfn%6 zM=V>mOn<7=owMCl@>{<)!23XuQgQCwxo+B2nby#nt5>gfBQ<*T==YWmhM05`E6N2w%A{mAR}2KVaK%cVeRnzFJow|Lbjx_0ea6@?<; zs-2tT3knKMhYlSmFZZnyR;^m)rsCzxmrDu@3%?M(0=IyVjWPdh2mlT6>ddQwrYl#j zWXFyj-%Mf&2?;K`0?Ye_v7Q^xq9^~J$m#&QaLs@);nv~EDbE8taf+q+%X+H zc66D>m&q|JRwz^5d0LkO*KIHQdu>!&Cjd5$-m$zq4+s(csUX*^S>qP;q)C&ITyD~& ziK5|6NJw}#Y}hb$)ei%yf!J8hP$=Iuhx`pF@-?jm0zj;?2>2xst_Tzr6}f3NWXKRy zgk8FHVZ(+EPH}N@`I$3kN|Tb3l(#C3W+zXcBr!43t(lrEIXRik%uEr1TKFGS{Kgp7 zl1~c+fH+NLKjq%Nd+#q@y40*+zup}&&!0b!1fPcZ$jC_Li6pUZ9`1`mH593j?A^PU zMT-`3_pSo-(j+~mO`GOMQbUd{+Mff5Etoe3K+Wi5U|4Q$ZpYHn(svRQ6V=I#yqcAj z<&BGrdma-LBUyaKHZ|2izNKMRad2^Qu}h~nZrngTuZHzXflEGY0Ja!o>NNfZ5&>Og z%>;Tsdi1DOL_|b*NJxmT6$MP|h;ejy9YTZppX@c`J$n(R1}6|o#pI8KPIg-O7VfbUx%(mY}u6|25c zrz;6$F0L~G%S1Z3y!Zp_LS0a4b2U2M*s1YI=zLaP2HR^IfouhQ&jOa`Rj8_$FY9wR z6c7LlLMfmNFWEDREPFVurQg?qc+elq_YDw h10C4l&)@n8{2Olq^iPfTC+7eF002ovPDHLkV1nCF+&lmP literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/ic_mic_black_24dp.png b/res/drawable-mdpi/ic_mic_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..19a16138fe6e7d8b474b947b28c73307a8fce199 GIT binary patch literal 232 zcmVP)H;?C}1_!@?CvWq1VFURB+Cu!3L>r6hhJe(6cYNa-_(uOK*Esp1o;#M%cChi;;79dv7rTA>Pp zP9{r)iyRJzkTJirgzvlel0)T|=`rGkjErZ7MEH~lc_%mXN}EC+r{u-M01wL?zvJFq zF+%fZm!3)5C;@YHxxgpj!|dWC>}&e~9GEmhj9l==BV%F))Bvc{=ZqUBe7gP;k+|TR z6^g7fcKr;Ik-M4Dz*^_&zfH{rH*=b38!V(t(Z3{fi}s+JDdI}SM`$Oii4k2DZv)Vx z1wf>l5E1Yuaf3P+?(3WyYmz7UC>>dPj~_Yo&8{rHg>g(?GJUYTk}HRJ6zU+m$Ruo1 mA|PVOjFexd#O$y{#r^<1d-KI5d(`g$0000GE2&s@YYQ4PeW2n4m%6o0eIjZsv0zWs7|}RX7N#SvjbO^~!NMsP zq)kN!78q+yjWLw1-2?kGkihG7jpn2d^|F6Do!l=zzkX|*yYqAnwg>ydaX;?&z3=z+ zd4E6O_va(r<01EWe;xqb{|Xp}u?BbsNB|zQawY(b0uv%~?f>LaSOpBj(04BYZvn4Z z5Yg6Vy6G>#Dd0oECnCW+0SO6U7)BJ34SWE+==b}h`uqDC8yhqC*t~f&IXOA3Ter>t z^v8B!#(Mq^m=+Oz7jc9G$N)Nn!Qk^pjvS%3ww9S0UH`^#I2@Fhm*aN3vDs|bqn`)9 z0o=gXD}lHTz%UHEZVnXG)YM3Qef_dg$7A2Rbt}Q(%8qv9#*Iu)PO^XhepN-~*C5^$k*mu=gaUXUc(1IiOxoJoA_ZW+ zcRHP1xNw2Gx;mPgn#|{pc?pCL>9s=6iR`kKzUYH7U$2OUlG94Nf{X#^!D}!9S(=8a0qAMANKq8b|;R|Sxmn27#obaa$6XU;6PwzdZBcDq98v7QR$6`=rL0=^s`9*$2-OJi~I z26#$J3RP8AY}l~DlsXUyn2EQruwdpvZf-8Iv9Tuf(9qDeuCA`h`uh5S&1Rbh-WHMX zmqru{;1S>x;PuMNN;!H|PvqZGQc{AIn3I5BkB0%BA2TvCVkY6mix*9!Qhyj9A74Cu z`t+sR+S=>>P$43J-3$@Vh|+;i=jP^~+qrWmUayz-_I6I3I6-S`tNy>)`lRT$&*yt| z+qP}^{r>;fUcY`l=gyr|;6L*7^Dn2RrKx?Fi^wgB6%ODbpj3UnrKM#}XJ;pagM;kZ zvxkO;2G*`!tM>c3wOf_T<&x%RWx91#S68bN!IqYmANTFsrvQgUDuV znwr|QWy=-{@3Gjq)8bZ+u^Jh9o?*<8JP!*%20 z;y8QuEUBrfe*(FBF+vrmNc}(s@b0l=$DS-KER^o0)fEq@$vCLS0KIyB*8LA#40n75E2)Ji;)bGy_5a0000tSV literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_mic_black_24dp.png b/res/drawable-xhdpi/ic_mic_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..cac51c37a38c0ae7800b2f93c2d567508b417c52 GIT binary patch literal 418 zcmV;T0bTxyP)_%aKH zx>y7uq*Z&n1RjKgB=rdx$o1RL4QKfqBNGiPI(mBAZfU6586QN|drdWJsGhGTrqpId z3f)wjjudLCO-~AS)h6XeJ+MFa1HVQ+@N?`3evEoxZ|nzlM?KK{j|cWdTm#UPLOTGK zhyAi`5qAN!q|h?}_e5+N*i#XY0o;&6ivZR{tQpuH5naatQ{ENM%^|?7T@kAWc1}dx z1~BKXsA@Y6U{yq%HH38$-^>A+vTRdV*M=pB0nGa@;)$VLurK1JX@4_gQ^daWhV(#0 ztUHOaS$rWEjxowx#;HV{U#GiFsH?2lZ3({{v(@3NrCIgd!8cj_626bPT(G584*Z=?k M07*qoM6N<$f)`D-EC2ui literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_stars_black_24dp.png b/res/drawable-xhdpi/ic_stars_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ee380e48ba2f64ba80dffbfddaedf5d6275aca81 GIT binary patch literal 659 zcmV;E0&M+>P)$oDe$sg$h^&+NsJG?xCuz95Djg!7EgV zdPYs4w>OTT;;r!!F|5po(?O@@pe#-q+ZWl&HkOQ;b_^OUH|G)n{l-k5dPJkf);}Zw zXkx{fyNw`eS*vl@Oc--TX}hnZjMc`Pqn2bp=p23+n?B+;XUu*hf~FN^tTVWsv!qjK zdObJc11}h3fGl04X(5S&Ta+X%r0F8d0Asvlnu2RWH!k`Q_nCcEYd>FH6CMI!IMqBy zs74#hp8gp$-hkpaCkZM;QCl~Sz5^Aq1kp=H{|pHa&}x_{CNW|AOVSbP^_-nZYQ?|y zJQ{g*?jw01_RPrFRIiIj`t-DXO?$-fF(hfR=RBIjLUe^%Bz07Tu7hYCzWYX}@unQy zW_^3U5&_*c-|!IsrFhRf&)ePc?dii;6J^6UHqPk316gH+dH|rq_k+`jMt+|J5aBEZ zy!ZSx5nwNR#~`BJ+PcjH%}k-t>kS7$`%Epd3xf>a_$0%uqQo0^i`OVmoxoxQMfe)R zD#m2!@lT0@-S&`=ctQ;U#X=m^AW^E4p%8fZBF70KPL7gwc#)gb5!xQEvLFth=Q53~ tn?s5o9x+RS5=HXNFiw_cB5VMg{sN|I&k{<%9YO#A002ovPDHLkV1iG+C%ymx literal 0 HcmV?d00001 diff --git a/res/drawable-xhdpi/ic_widget_kiwix.png b/res/drawable-xhdpi/ic_widget_kiwix.png new file mode 100644 index 0000000000000000000000000000000000000000..1b05a0faf169a7729c2acac3fc94a10245413d4f GIT binary patch literal 3050 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 Z{R=Q^kyNaPu$2G+002ovPDHLkV1kG6%wYfk literal 0 HcmV?d00001 diff --git a/res/drawable-xxhdpi/ic_widget_kiwix.png b/res/drawable-xxhdpi/ic_widget_kiwix.png new file mode 100644 index 0000000000000000000000000000000000000000..70bd56a5adb11944a9532973900aa45aacce2e05 GIT binary patch literal 5303 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 literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/ic_mic_black_24dp.png b/res/drawable-xxxhdpi/ic_mic_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..cf70b63bebaf755b4c6697fb7959f07a7484c8e0 GIT binary patch literal 773 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 Date: Mon, 30 May 2016 13:20:11 +0300 Subject: [PATCH 07/10] Added my licence credentials --- .../kiwixmobile/utils/KiwixSearchWidget.java | 20 +++++++++++++++++++ .../kiwixmobile/utils/ShortcutUtils.java | 20 +++++++++++++++++++ .../utils/files/RateAppCounter.java | 20 +++++++++++++++++++ .../kiwixmobile/views/BookmarksActivity.java | 20 +++++++++++++++++++ 4 files changed, 80 insertions(+) diff --git a/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java b/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java index 6df372459..ed28eb65b 100644 --- a/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java +++ b/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java @@ -1,3 +1,23 @@ +/* + * Copyright 2013 Elad Keyshawn + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + + package org.kiwix.kiwixmobile.utils; import android.app.PendingIntent; diff --git a/src/org/kiwix/kiwixmobile/utils/ShortcutUtils.java b/src/org/kiwix/kiwixmobile/utils/ShortcutUtils.java index 1aa0b8b63..0dc894ebe 100644 --- a/src/org/kiwix/kiwixmobile/utils/ShortcutUtils.java +++ b/src/org/kiwix/kiwixmobile/utils/ShortcutUtils.java @@ -1,3 +1,23 @@ +/* + * Copyright 2013 Elad Keyshawn + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + + package org.kiwix.kiwixmobile.utils; import android.content.Context; diff --git a/src/org/kiwix/kiwixmobile/utils/files/RateAppCounter.java b/src/org/kiwix/kiwixmobile/utils/files/RateAppCounter.java index 26217d4d7..842484c42 100644 --- a/src/org/kiwix/kiwixmobile/utils/files/RateAppCounter.java +++ b/src/org/kiwix/kiwixmobile/utils/files/RateAppCounter.java @@ -1,3 +1,23 @@ +/* + * Copyright 2013 Elad Keyshawn + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + + package org.kiwix.kiwixmobile.utils.files; import android.content.Context; diff --git a/src/org/kiwix/kiwixmobile/views/BookmarksActivity.java b/src/org/kiwix/kiwixmobile/views/BookmarksActivity.java index c95639983..79d1a8146 100644 --- a/src/org/kiwix/kiwixmobile/views/BookmarksActivity.java +++ b/src/org/kiwix/kiwixmobile/views/BookmarksActivity.java @@ -1,3 +1,23 @@ +/* + * Copyright 2013 Elad Keyshawn + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + */ + + package org.kiwix.kiwixmobile.views; import android.content.Intent; From de185c54754cbe585df98200cd8d297a29144fd7 Mon Sep 17 00:00:00 2001 From: Elad Keyshawn Date: Mon, 30 May 2016 13:26:00 +0300 Subject: [PATCH 08/10] Organizing - moved RateAppCounter to utils --- src/org/kiwix/kiwixmobile/KiwixMobileActivity.java | 2 +- src/org/kiwix/kiwixmobile/utils/{files => }/RateAppCounter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/org/kiwix/kiwixmobile/utils/{files => }/RateAppCounter.java (97%) diff --git a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java index 3f9b2e9f0..80b9d7808 100644 --- a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java +++ b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java @@ -88,7 +88,7 @@ import org.kiwix.kiwixmobile.utils.LanguageUtils; import org.kiwix.kiwixmobile.utils.ShortcutUtils; 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.utils.RateAppCounter; import org.kiwix.kiwixmobile.views.AnimatedProgressBar; import org.kiwix.kiwixmobile.views.BookmarksActivity; import org.kiwix.kiwixmobile.views.CompatFindActionModeCallback; diff --git a/src/org/kiwix/kiwixmobile/utils/files/RateAppCounter.java b/src/org/kiwix/kiwixmobile/utils/RateAppCounter.java similarity index 97% rename from src/org/kiwix/kiwixmobile/utils/files/RateAppCounter.java rename to src/org/kiwix/kiwixmobile/utils/RateAppCounter.java index 842484c42..df7646441 100644 --- a/src/org/kiwix/kiwixmobile/utils/files/RateAppCounter.java +++ b/src/org/kiwix/kiwixmobile/utils/RateAppCounter.java @@ -18,7 +18,7 @@ */ -package org.kiwix.kiwixmobile.utils.files; +package org.kiwix.kiwixmobile.utils; import android.content.Context; import android.content.SharedPreferences; From de6bdd0dd1e21dc5ce6f20ac730687a93a855713 Mon Sep 17 00:00:00 2001 From: Elad Keyshawn Date: Mon, 30 May 2016 13:33:19 +0300 Subject: [PATCH 09/10] Organizing - moved all utilClasses/HelperClasses into HelperClasses package --- AndroidManifest.xml | 2 +- .../kiwix/kiwixmobile/{views => }/BookmarksActivity.java | 4 ++-- src/org/kiwix/kiwixmobile/KiwixMobileActivity.java | 7 +++---- src/org/kiwix/kiwixmobile/SearchActivity.java | 4 ++-- src/org/kiwix/kiwixmobile/ZimFileSelectActivity.java | 2 +- .../kiwix/kiwixmobile/settings/KiwixSettingsActivity.java | 4 ++-- .../utils/{ => HelperClasses}/DatabaseHelper.java | 4 +++- .../kiwixmobile/utils/{ => HelperClasses}/HTMLUtils.java | 2 +- .../utils/{ => HelperClasses}/LanguageUtils.java | 2 +- .../utils/{ => HelperClasses}/NetworkUtils.java | 2 +- .../utils/{ => HelperClasses}/ShortcutUtils.java | 2 +- .../utils/{ => HelperClasses}/StorageUtils.java | 2 +- src/org/kiwix/kiwixmobile/utils/KiwixTextToSpeech.java | 1 + 13 files changed, 20 insertions(+), 18 deletions(-) rename src/org/kiwix/kiwixmobile/{views => }/BookmarksActivity.java (98%) rename src/org/kiwix/kiwixmobile/utils/{ => HelperClasses}/DatabaseHelper.java (96%) rename src/org/kiwix/kiwixmobile/utils/{ => HelperClasses}/HTMLUtils.java (98%) rename src/org/kiwix/kiwixmobile/utils/{ => HelperClasses}/LanguageUtils.java (99%) rename src/org/kiwix/kiwixmobile/utils/{ => HelperClasses}/NetworkUtils.java (95%) mode change 100755 => 100644 rename src/org/kiwix/kiwixmobile/utils/{ => HelperClasses}/ShortcutUtils.java (96%) rename src/org/kiwix/kiwixmobile/utils/{ => HelperClasses}/StorageUtils.java (97%) mode change 100755 => 100644 diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 286d9fe75..8d65a9591 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -99,7 +99,7 @@ - + Date: Wed, 1 Jun 2016 11:12:15 +0300 Subject: [PATCH 10/10] Kiwix search widget complete - fixed onResume of widget buttons - Edited some strings --- res/values/strings.xml | 4 +- .../kiwixmobile/KiwixMobileActivity.java | 30 ++++++--- src/org/kiwix/kiwixmobile/SearchActivity.java | 61 +++++++++++++++++-- .../kiwixmobile/utils/KiwixSearchWidget.java | 6 ++ 4 files changed, 89 insertions(+), 12 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index f6379f7b6..9702178dc 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -85,6 +85,8 @@ Open new tab in background When opening a new tab it will open in background Extras - Link opened in new tab + Article opened in new tab Search Kiwix + Speak to search Kiwix + Sorry! Your device doesn\\\'t support speech input \ No newline at end of file diff --git a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java index 23ee0594c..f1ab040a6 100644 --- a/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java +++ b/src/org/kiwix/kiwixmobile/KiwixMobileActivity.java @@ -83,12 +83,12 @@ import org.json.JSONArray; import org.kiwix.kiwixmobile.settings.Constants; import org.kiwix.kiwixmobile.settings.KiwixSettingsActivity; import org.kiwix.kiwixmobile.utils.HelperClasses.HTMLUtils; -import org.kiwix.kiwixmobile.utils.KiwixTextToSpeech; import org.kiwix.kiwixmobile.utils.HelperClasses.LanguageUtils; import org.kiwix.kiwixmobile.utils.HelperClasses.ShortcutUtils; +import org.kiwix.kiwixmobile.utils.KiwixTextToSpeech; +import org.kiwix.kiwixmobile.utils.RateAppCounter; import org.kiwix.kiwixmobile.utils.files.FileReader; import org.kiwix.kiwixmobile.utils.files.FileUtils; -import org.kiwix.kiwixmobile.utils.RateAppCounter; import org.kiwix.kiwixmobile.views.AnimatedProgressBar; import org.kiwix.kiwixmobile.views.CompatFindActionModeCallback; import org.kiwix.kiwixmobile.views.KiwixWebView; @@ -314,7 +314,6 @@ public class KiwixMobileActivity extends AppCompatActivity { IS_WIDGET_STAR = getIntent().getBooleanExtra("isWidgetStar", false); - tempForUndo = new KiwixWebView(getApplicationContext()); /** initializing temporary tab value **/ snackbarLayout = @@ -453,19 +452,22 @@ public class KiwixMobileActivity extends AppCompatActivity { setUpExitFullscreenButton(); loadPrefs(); updateTitle(ZimContentProvider.getZimFileTitle()); - if(IS_WIDGET_STAR){ + if (IS_WIDGET_STAR) { goToBookmarks(); } else if (IS_WIDGET_SEARCH_INTENT) { - goToSearch(); + goToSearch(false); } else if (IS_WIDGET_VOICE_SEARCH) { - + goToSearch(true); } } - private void goToSearch() { + private void goToSearch(boolean isVoice) { final String zimFile = ZimContentProvider.getZimFile(); Intent i = new Intent(KiwixMobileActivity.this, SearchActivity.class); i.putExtra("zimFile", zimFile); + if (isVoice) { + i.putExtra("isWidgetVoice", true); + } startActivityForResult(i, REQUEST_FILE_SEARCH); } @@ -1121,6 +1123,20 @@ public class KiwixMobileActivity extends AppCompatActivity { } } + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + boolean IS_WIDGET_STAR = getIntent().getBooleanExtra("isWidgetStar", false); + boolean IS_WIDGET_SEARCH_INTENT = getIntent().getBooleanExtra("isWidgetSearch", false); + + if (IS_WIDGET_STAR) { + goToBookmarks(); + } else if (IS_WIDGET_SEARCH_INTENT) { + goToSearch(false); + } + + } + private void refreshBookmarks() { bookmarks.clear(); if (ZimContentProvider.getId() != null) { diff --git a/src/org/kiwix/kiwixmobile/SearchActivity.java b/src/org/kiwix/kiwixmobile/SearchActivity.java index ee2a0c89b..9f261e552 100644 --- a/src/org/kiwix/kiwixmobile/SearchActivity.java +++ b/src/org/kiwix/kiwixmobile/SearchActivity.java @@ -1,9 +1,11 @@ package org.kiwix.kiwixmobile; +import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; +import android.speech.RecognizerIntent; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; @@ -23,18 +25,16 @@ import org.kiwix.kiwixmobile.utils.HelperClasses.ShortcutUtils; import org.kiwix.kiwixmobile.views.AutoCompleteAdapter; import java.util.ArrayList; +import java.util.Locale; public class SearchActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { + private final int REQ_CODE_SPEECH_INPUT = 100; private ListView mListView; - private AutoCompleteAdapter mAutoAdapter; - private ArrayAdapter mDefaultAdapter; - private SearchActivity context; - private DatabaseHelper mDatabaseHelper; @Override @@ -60,6 +60,11 @@ public class SearchActivity extends AppCompatActivity mAutoAdapter = new AutoCompleteAdapter(context); mListView.setOnItemClickListener(context); mListView.setOnItemLongClickListener(context); + + boolean IS_VOICE_SEARCH_INTENT = getIntent().getBooleanExtra("isWidgetVoice", false); + if (IS_VOICE_SEARCH_INTENT) { + promptSpeechInput(); + } } @Override @@ -166,4 +171,52 @@ public class SearchActivity extends AppCompatActivity mDefaultAdapter.notifyDataSetChanged(); } + + private void promptSpeechInput() { + Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); + intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, + RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); + intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); // TODO: choose selected lang on kiwix + intent.putExtra(RecognizerIntent.EXTRA_PROMPT, + getString(R.string.speech_prompt_text)); + try { + startActivityForResult(intent, REQ_CODE_SPEECH_INPUT); + } catch (ActivityNotFoundException a) { + Toast.makeText(getApplicationContext(), + getString(R.string.speech_not_supported), + Toast.LENGTH_SHORT).show(); + } + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + switch (requestCode) { + + case REQ_CODE_SPEECH_INPUT: { + if (resultCode == RESULT_OK && data != null) { + ArrayList result = data + .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); + searchViaVoice(result.get(0)); + } + break; + } + + + } + } + + + private void searchViaVoice(String search) { + search = capitalizeSearch(search); + mDatabaseHelper.insertSearch(search); + sendMessage(search); + } + + private String capitalizeSearch(String search) { + search = search.substring(0, 1).toUpperCase() + search.substring(1).toLowerCase(); + return search; + } } diff --git a/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java b/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java index ed28eb65b..06450201d 100644 --- a/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java +++ b/src/org/kiwix/kiwixmobile/utils/KiwixSearchWidget.java @@ -67,10 +67,16 @@ public class KiwixSearchWidget extends AppWidgetProvider { /** Microphone icon intent for voice search **/ + Intent voiceIntent = new Intent(context, KiwixMobileActivity.class); + voiceIntent.putExtra("isWidgetVoice", true); + voiceIntent.setAction(MIC_CLICKED); + PendingIntent voicePendingIntent = PendingIntent.getActivity(context, 0, voiceIntent, 0); views.setOnClickPendingIntent(R.id.search_widget_text, searchPendingIntent); views.setOnClickPendingIntent(R.id.search_widget_icon, mainAppPendingIntent); views.setOnClickPendingIntent(R.id.search_widget_star, starPendingIntent); + views.setOnClickPendingIntent(R.id.search_widget_mic, voicePendingIntent); + appWidgetManager.updateAppWidget(appWidgetId, views); } }