Skip to content

Commit 13b9353

Browse files
committed
Better lingvo integration
1 parent 7953577 commit 13b9353

11 files changed

Lines changed: 203 additions & 22 deletions

File tree

android/app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ android {
139139

140140
dependencies {
141141
implementation fileTree(include: ['*.jar'], dir: 'libs')
142+
implementation files('libs/LingvoIntegration_2.5.2.12.jar')
142143
testImplementation 'junit:junit:4.12'
143144
androidTestImplementation 'com.android.support.test:runner:1.0.2'
144145
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ buildscript {
77
jcenter()
88
}
99
dependencies {
10-
classpath 'com.android.tools.build:gradle:3.1.3'
10+
classpath 'com.android.tools.build:gradle:3.1.4'
1111
// NOTE: Do not place your application dependencies here; they belong
1212
// in the individual module build.gradle files
1313
}

android/res/layout/book_info_edit_dialog.xml

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
<LinearLayout
99
android:orientation="vertical"
1010
android:layout_width="fill_parent"
11-
android:layout_height="wrap_content">
11+
android:layout_height="wrap_content"
12+
android:layout_margin="3dip">
1213

1314
<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
1415
<LinearLayout
@@ -280,6 +281,44 @@
280281
android:singleLine="true"
281282
/>
282283
</TableRow>
284+
<TableRow >
285+
<TextView
286+
android:id="@+id/lbl_lang_translate"
287+
style="@style/TextAppearance.Medium"
288+
android:singleLine="true"
289+
android:text="@string/book_info_book_translation"
290+
android:layout_weight="2"
291+
android:layout_width="fill_parent"
292+
android:layout_height="wrap_content"/>
293+
<EditText
294+
android:id="@+id/book_lang_from"
295+
android:layout_width="fill_parent"
296+
android:layout_height="wrap_content"
297+
android:layout_weight="3"
298+
android:text="en"
299+
style="@style/TextAppearance.Widget.EditText"
300+
android:editable="true"
301+
android:singleLine="true"
302+
/>
303+
<TextView
304+
android:id="@+id/lbl_lang_to"
305+
style="@style/TextAppearance.Medium"
306+
android:singleLine="true"
307+
android:text="->"
308+
android:layout_weight="1"
309+
android:layout_width="fill_parent"
310+
android:layout_height="wrap_content"/>
311+
<EditText
312+
android:id="@+id/book_lang_to"
313+
android:layout_width="fill_parent"
314+
android:layout_height="wrap_content"
315+
android:layout_weight="3"
316+
android:text="ru"
317+
style="@style/TextAppearance.Widget.EditText"
318+
android:editable="true"
319+
android:singleLine="true"
320+
/>
321+
</TableRow>
283322
</TableLayout>
284323
</LinearLayout>
285324
</ScrollView>

android/res/values-ru/strings.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,8 @@
458458
<string name="dlg_goto_current_position">Текущая страница:</string>
459459
<string name="dlg_goto_input_page_number">Введите номер страницы для перехода:</string>
460460
<string name="dlg_goto_input_percent">Введите процент для перехода:</string>
461-
<string name="book_info_book_language">Language</string>
461+
<string name="book_info_book_language">Язык</string>
462+
<string name="book_info_book_translation">Перевод</string>
462463
<string name="book_state_toread">К прочтению</string>
463464
<string name="book_state_reading">Читаю</string>
464465
<string name="book_state_none">Нет пометки</string>

android/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@
423423
<string name="win_title_confirm_history_record_delete">Do you really want to remove this book from recent list?</string>
424424
<string name="win_title_confirm_book_delete">Do you really want to delete this book?</string>
425425
<string name="book_info_book_language">Language</string>
426+
<string name="book_info_book_translation">Translation</string>
426427
<string name="folder_name_books_by_series">Series</string>
427428
<string name="folder_name_books_by_title">Titles</string>
428429
<string name="dlg_about_donation_platinum">$30: buy Cool Reader Platinum Donation</string>

android/src/org/coolreader/Dictionaries.java

Lines changed: 87 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.coolreader;
22

33
import org.coolreader.crengine.BaseActivity;
4+
import org.coolreader.crengine.BookInfo;
45
import org.coolreader.crengine.DeviceInfo;
56
import org.coolreader.crengine.L;
67
import org.coolreader.crengine.Logger;
@@ -11,12 +12,32 @@
1112
import android.content.ComponentName;
1213
import android.content.Intent;
1314
import android.content.pm.PackageManager;
15+
import android.util.DisplayMetrics;
1416

17+
import com.abbyy.mobile.lingvo.api.MinicardContract;
1518
import java.util.ArrayList;
1619
import java.util.List;
1720

1821
public class Dictionaries {
1922

23+
public static class PopupFrameMetric {
24+
public final int Height;
25+
public final int Gravity;
26+
27+
PopupFrameMetric(DisplayMetrics metrics, int selectionTop, int selectionBottom) {
28+
final int screenHeight = metrics.heightPixels;
29+
final int topSpace = selectionTop;
30+
final int bottomSpace = metrics.heightPixels - selectionBottom;
31+
final boolean showAtBottom = bottomSpace >= topSpace;
32+
final int space = (showAtBottom ? bottomSpace : topSpace) - metrics.densityDpi / 12;
33+
final int maxHeight = Math.min(metrics.densityDpi * 20 / 12, screenHeight * 2 / 3);
34+
final int minHeight = Math.min(metrics.densityDpi * 10 / 12, screenHeight * 2 / 3);
35+
36+
Height = Math.max(minHeight, Math.min(maxHeight, space));
37+
Gravity = showAtBottom ? android.view.Gravity.BOTTOM : android.view.Gravity.TOP;
38+
}
39+
}
40+
2041
private Activity mActivity;
2142

2243
public Integer isiDic2IsActive() {
@@ -82,6 +103,7 @@ public DictInfo ( String id, String name, String packageName, String className,
82103
new DictInfo("Dictan", "Dictan Dictionary", "info.softex.dictan", null, Intent.ACTION_VIEW, 2),
83104
new DictInfo("FreeDictionary.org", "Free Dictionary . org", "org.freedictionary", "org.freedictionary.MainActivity", "android.intent.action.VIEW", 0),
84105
new DictInfo("ABBYYLingvo", "ABBYY Lingvo", "com.abbyy.mobile.lingvo.market", null /*com.abbyy.mobile.lingvo.market.MainActivity*/, "com.abbyy.mobile.lingvo.intent.action.TRANSLATE", 0).setDataKey("com.abbyy.mobile.lingvo.intent.extra.TEXT"),
106+
new DictInfo("ABBYYLingvo (minicard)", "ABBYY Lingvo (minicard)", "com.abbyy.mobile.lingvo.market", null, "com.abbyy.mobile.lingvo.intent.action.TRANSLATE", 5).setDataKey("com.abbyy.mobile.lingvo.intent.extra.TEXT"),
85107
//new DictInfo("ABBYYLingvoLive", "ABBYY Lingvo Live", "com.abbyy.mobile.lingvolive", null, "com.abbyy.mobile.lingvo.intent.action.TRANSLATE", 0).setDataKey("com.abbyy.mobile.lingvo.intent.extra.TEXT"),
86108
new DictInfo("LingoQuizLite", "Lingo Quiz Lite", "mnm.lite.lingoquiz", "mnm.lite.lingoquiz.ExchangeActivity", "lingoquiz.intent.action.ADD_WORD", 0).setDataKey("EXTRA_WORD"),
87109
new DictInfo("LingoQuiz", "Lingo Quiz", "mnm.lingoquiz", "mnm.lingoquiz.ExchangeActivity", "lingoquiz.intent.action.ADD_WORD", 0).setDataKey("EXTRA_WORD"),
@@ -266,18 +288,6 @@ public void findInDictionary(String s) throws DictionaryException {
266288
intent4.setType("text/plain");
267289
intent4.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
268290
intent4.putExtra(android.content.Intent.EXTRA_TEXT, s);
269-
//List<ResolveInfo> resInfo = mActivity.getPackageManager().queryIntentActivities(intent4, 0);
270-
//for (resInfo : mActivity.getPackageManager().queryIntentActivities(intent4, 0)) {
271-
// if (resInfo.
272-
//};
273-
//startActivity(Intent.createChooser(intent4, null));
274-
//intent4.setAction(Intent.ACTION_VIEW);
275-
//intent4.putExtra("key_text_input", "What time is it?");
276-
//intent4.putExtra("key_text_output", "");
277-
//intent4.putExtra("key_language_from", "en");
278-
//intent4.putExtra("key_language_to", "es");
279-
//intent4.putExtra("key_suggest_translation", "");
280-
//intent4.putExtra("key_from_floating_window", false);
281291
intent4.setComponent(new ComponentName(curDict.packageName, curDict.className));
282292
try
283293
{
@@ -286,8 +296,72 @@ public void findInDictionary(String s) throws DictionaryException {
286296
throw new DictionaryException("Dictionary \"" + curDict.name + "\" is not installed");
287297
}
288298
break;
299+
case 5:
300+
Intent intent5 = new Intent(curDict.action);
301+
final DisplayMetrics metrics = new DisplayMetrics();
302+
mActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
303+
int selectionTop = 0;
304+
int selectionBottom = 0;
305+
if (mActivity instanceof CoolReader) {
306+
CoolReader cr = (CoolReader) mActivity;
307+
if (cr.getReaderView()!=null) {
308+
if (cr.getReaderView().lastSelection != null) {
309+
selectionTop = cr.getReaderView().lastSelection.startY;
310+
selectionBottom = cr.getReaderView().lastSelection.endY;
311+
}
312+
if (cr.getReaderView().getBookInfo()!=null) {
313+
BookInfo book = cr.getReaderView().getBookInfo();
314+
String lang = book.getFileInfo().lang_to;
315+
if (lang==null) lang = "";
316+
if (lang.equals("")) lang = "ru";
317+
String langf = book.getFileInfo().lang_from;
318+
if (langf==null) langf = "";
319+
if (langf.equals("")) langf = book.getFileInfo().language;
320+
if (langf==null) langf = "";
321+
if (lang.equals("")) lang = "en";
322+
intent5.putExtra(MinicardContract.EXTRA_LANGUAGE_TO, lang);
323+
intent5.putExtra(MinicardContract.EXTRA_LANGUAGE_FROM, langf);
324+
}
325+
}
326+
}
327+
if (selectionBottom<selectionTop) {
328+
int dummy = selectionBottom;
329+
selectionBottom = selectionTop;
330+
selectionTop = dummy;
331+
}
332+
final PopupFrameMetric frameMetrics =
333+
new PopupFrameMetric(metrics, selectionTop, selectionBottom);
334+
intent5.putExtra(MinicardContract.EXTRA_GRAVITY, frameMetrics.Gravity);
335+
intent5.putExtra(MinicardContract.EXTRA_HEIGHT, frameMetrics.Height);
336+
intent5.putExtra(MinicardContract.EXTRA_FORCE_LEMMATIZATION, true);
337+
intent5.putExtra(MinicardContract.EXTRA_TRANSLATE_VARIANTS, true);
338+
intent5.putExtra(MinicardContract.EXTRA_ENABLE_SUGGESTIONS, true);
339+
//intent5.putExtra(MinicardContract.EXTRA_LIGHT_THEME, true);
340+
intent5.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
341+
intent5.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
342+
if (curDict.className != null || DeviceInfo.getSDKLevel() == 3) {
343+
intent5.setComponent(new ComponentName(
344+
curDict.packageName, curDict.className));
345+
} else {
346+
intent5.setPackage(curDict.packageName);
347+
}
348+
intent5.addFlags(DeviceInfo.getSDKLevel() >= 7 ? Intent.FLAG_ACTIVITY_CLEAR_TASK : Intent.FLAG_ACTIVITY_NEW_TASK);
349+
if (s!=null)
350+
intent5.putExtra(curDict.dataKey, s);
351+
try {
352+
mActivity.startActivity( intent5 );
353+
} catch ( ActivityNotFoundException e ) {
354+
throw new DictionaryException("Dictionary \"" + curDict.name + "\" is not installed");
355+
} catch ( Exception e ) {
356+
throw new DictionaryException("Can't open dictionary \"" + curDict.name + "\"");
357+
}
358+
break;
359+
//final String targetLanguage = DictionaryUtil.TargetLanguageOption.getValue();
360+
//if (!Language.ANY_CODE.equals(targetLanguage)) {
361+
// intent.putExtra(MinicardContract.EXTRA_LANGUAGE_TO, targetLanguage);
362+
//}
363+
//InternalUtil.startDictionaryActivity(fbreader, intent, this);
289364
}
290-
291365
}
292366

293367
public void onActivityResult(int requestCode, int resultCode, Intent intent) throws DictionaryException {

android/src/org/coolreader/crengine/BookInfoDialog.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ private void fillMap() {
4242
mLabelMap.put("book.title", R.string.book_info_book_title);
4343
mLabelMap.put("book.series", R.string.book_info_book_series_name);
4444
mLabelMap.put("book.language", R.string.book_info_book_language);
45+
mLabelMap.put("book.translation", R.string.book_info_book_translation);
4546
}
4647

4748
private void addItem(TableLayout table, String item) {

android/src/org/coolreader/crengine/BookInfoEditDialog.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ public void setColorFilter(ColorFilter cf) {
235235
AuthorList authors;
236236
RatingBar rbBookRating;
237237
RadioGroup rgState;
238+
EditText edLangFrom;
239+
EditText edLangTo;
238240
@Override
239241
protected void onCreate(Bundle savedInstanceState) {
240242
super.onCreate(savedInstanceState);
@@ -290,7 +292,9 @@ public void onClick(View v) {
290292
edSeriesNumber = (EditText)view.findViewById(R.id.book_series_number);
291293
rbBookRating = (RatingBar)view.findViewById(R.id.book_rating);
292294
rgState = (RadioGroup)view.findViewById(R.id.book_state);
293-
int state = file.getReadingState();
295+
edLangFrom = (EditText)view.findViewById(R.id.book_lang_from);
296+
edLangTo = (EditText)view.findViewById(R.id.book_lang_to);
297+
int state = file.getReadingState();
294298
int[] stateButtons = new int[] {R.id.book_state_new, R.id.book_state_toread, R.id.book_state_reading, R.id.book_state_finished};
295299
rgState.check(state >= 0 && state < stateButtons.length ? stateButtons[state] : R.id.book_state_new);
296300

@@ -340,6 +344,8 @@ public void onCoverpageReady(CoverpageManager.ImageItem file, Bitmap bitmap) {
340344
edSeriesName.setText(file.series);
341345
if (file.series != null && file.series.trim().length() > 0 && file.seriesNumber > 0)
342346
edSeriesNumber.setText(String.valueOf(file.seriesNumber));
347+
edLangFrom.setText(file.lang_from);
348+
edLangTo.setText(file.lang_to);
343349
LinearLayout llBookAuthorsList = (LinearLayout)view.findViewById(R.id.book_authors_list);
344350
authors = new AuthorList(llBookAuthorsList, file.authors);
345351
rbBookRating.setRating(file.getRate());
@@ -378,7 +384,16 @@ private void save() {
378384
modified = file.setTitle(edTitle.getText().toString().trim()) || modified;
379385
modified = file.setAuthors(authors.getAuthorsList()) || modified;
380386
modified = file.setSeriesName(edSeriesName.getText().toString().trim()) || modified;
381-
int number = 0;
387+
modified = file.setLangFrom(edLangFrom.getText().toString().trim()) || modified;
388+
modified = file.setLangTo(edLangTo.getText().toString().trim()) || modified;
389+
if (mActivity.getReaderView()!=null) {
390+
if (mActivity.getReaderView().getBookInfo()!=null) {
391+
BookInfo book = mActivity.getReaderView().getBookInfo();
392+
book.getFileInfo().lang_from = edLangFrom.getText().toString().trim();
393+
book.getFileInfo().lang_to = edLangTo.getText().toString().trim();
394+
}
395+
}
396+
int number = 0;
382397
if (file.series != null && file.series.length() > 0) {
383398
String numberString = edSeriesNumber.getText().toString().trim();
384399
try {
@@ -403,7 +418,7 @@ else if (currentStateId == R.id.book_state_finished)
403418
state = FileInfo.STATE_FINISHED;
404419
modified = file.setReadingState(state) || modified;
405420
if (modified) {
406-
mActivity.getDB().saveBookInfo(mBookInfo);
421+
mActivity.getDB().saveBookInfo(mBookInfo);
407422
mActivity.getDB().flush();
408423
BookInfo bi = Services.getHistory().getBookInfo(file);
409424
if (bi != null)

android/src/org/coolreader/crengine/FileInfo.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class FileInfo {
4343
public String pathname; // full path+arcname+filename
4444
public String arcname; // archive file name w/o path
4545
public String language; // document language
46+
public String lang_from; // translate from
47+
public String lang_to; // translate to
4648
public String username; // username for online catalogs
4749
public String password; // password for online catalogs
4850
public DocumentFormat format;
@@ -305,6 +307,8 @@ public void assign(FileInfo v)
305307
createTime = v.createTime;
306308
lastAccessTime = v.lastAccessTime;
307309
language = v.language;
310+
lang_from = v.lang_from;
311+
lang_to = v.lang_to;
308312
username = v.username;
309313
password = v.password;
310314
id = v.id;
@@ -873,6 +877,20 @@ public boolean setSeriesName(String series) {
873877
this.series = series;
874878
return true;
875879
}
880+
881+
public boolean setLangFrom(String lang) {
882+
if (eq(this.lang_from, lang))
883+
return false;
884+
this.lang_from = lang;
885+
return true;
886+
}
887+
888+
public boolean setLangTo(String lang) {
889+
if (eq(this.lang_to, lang))
890+
return false;
891+
this.lang_to = lang;
892+
return true;
893+
}
876894

877895
public boolean setSeriesNumber(int seriesNumber) {
878896
if (this.seriesNumber == seriesNumber)
@@ -889,6 +907,14 @@ public String getLanguage() {
889907
return language;
890908
}
891909

910+
public String getLang_from() {
911+
return lang_from;
912+
}
913+
914+
public String getLang_to() {
915+
return lang_to;
916+
}
917+
892918
public void clear()
893919
{
894920
dirs = null;
@@ -1078,6 +1104,10 @@ public int hashCode() {
10781104
result = prime * result + (isScanned ? 1231 : 1237);
10791105
result = prime * result
10801106
+ ((language == null) ? 0 : language.hashCode());
1107+
result = prime * result
1108+
+ ((lang_from == null) ? 0 : lang_from.hashCode());
1109+
result = prime * result
1110+
+ ((lang_to == null) ? 0 : lang_to.hashCode());
10811111
result = prime * result
10821112
+ (int) (lastAccessTime ^ (lastAccessTime >>> 32));
10831113
result = prime * result + ((parent == null) ? 0 : parent.hashCode());
@@ -1146,6 +1176,16 @@ public boolean equals(Object obj) {
11461176
return false;
11471177
} else if (!language.equals(other.language))
11481178
return false;
1179+
if (lang_from == null) {
1180+
if (other.lang_from != null)
1181+
return false;
1182+
} else if (!lang_from.equals(other.lang_from))
1183+
return false;
1184+
if (lang_to == null) {
1185+
if (other.lang_to != null)
1186+
return false;
1187+
} else if (!lang_to.equals(other.lang_to))
1188+
return false;
11491189
if (lastAccessTime != other.lastAccessTime)
11501190
return false;
11511191
if (parent == null) {

android/src/org/coolreader/crengine/ReaderView.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ public T get()
343343
private final CoolReader mActivity;
344344
private final Engine mEngine;
345345

346-
private Selection lastSelection;
346+
public Selection lastSelection;
347347
private Bookmark hyplinkBookmark;
348348

349349
private BookInfo mBookInfo;
@@ -1854,6 +1854,7 @@ public void done() {
18541854
if ( fi.language != null) {
18551855
items.add("book.language=" + fi.language);
18561856
}
1857+
items.add("book.translation=" + fi.lang_from + " -> " + fi.lang_to);
18571858
BookInfoDialog dlg = new BookInfoDialog(mActivity, items);
18581859
dlg.show();
18591860
}

0 commit comments

Comments
 (0)