diff --git a/.travis.yml b/.travis.yml index 01962bc7a..675ec9572 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,8 +6,8 @@ before_install: android: components: - - build-tools-26.0.2 - - android-26 + - build-tools-27.0.3 + - android-27 - android-19 - extra-android-m2repository diff --git a/README.md b/README.md index a68bf96f0..b81dc0c93 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ FolioReader-Android is an ePub reader written in Java. ### Gradle Add following dependency to your app build.gradle ``` java -compile 'com.folioreader:folioreader:0.3.8' +compile 'com.folioreader:folioreader:0.3.9' ``` Add maven repository to your top level build.gradle diff --git a/build.gradle b/build.gradle index 6e82884da..334072821 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,10 @@ buildscript { + ext.KOTLIN_VERSION= '1.2.41' + + ext.ANDROID_LIB_VERSION = '27.1.1' + ext.R2_STREAMER_VERSION = '0.1.5' + def KOTLIN_VERSION = ext.KOTLIN_VERSION + repositories { jcenter() maven { @@ -10,9 +16,11 @@ buildscript { } } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:3.1.2' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$KOTLIN_VERSION" + classpath "org.jetbrains.kotlin:kotlin-android-extensions:$KOTLIN_VERSION" } } diff --git a/folioreader/build.gradle b/folioreader/build.gradle index b33e4108e..9f55be22d 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'com.android.library' apply from: '../config/quality/quality.gradle' apply plugin: 'com.github.dcendents.android-maven' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' ext { bintrayRepo = 'maven' @@ -15,7 +17,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.8' + libraryVersion = '0.3.9' developerId = 'mobisystech' developerName = 'Folio Reader' @@ -28,14 +30,14 @@ ext { android { useLibrary 'org.apache.http.legacy' - compileSdkVersion 26 - buildToolsVersion "26.0.2" + compileSdkVersion 27 + buildToolsVersion "27.0.3" defaultConfig { versionCode 1 versionName "1.0" minSdkVersion 14 - targetSdkVersion 26 + targetSdkVersion 27 } sourceSets { @@ -78,28 +80,28 @@ android { } } -dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - compile project(':webViewMarker') - final ANDROID_LIB_VERSION = '26.0.2' +apply from: '../folioreader/bintray/installv1.gradle' +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation project(':webViewMarker') //noinspection GradleDependency - compile "com.android.support:appcompat-v7:$ANDROID_LIB_VERSION" - compile "com.android.support:recyclerview-v7:$ANDROID_LIB_VERSION" - compile "com.android.support:support-v4:$ANDROID_LIB_VERSION" - compile "com.android.support:design:$ANDROID_LIB_VERSION" + implementation "com.android.support:appcompat-v7:$ANDROID_LIB_VERSION" + implementation "com.android.support:recyclerview-v7:$ANDROID_LIB_VERSION" + implementation "com.android.support:support-v4:$ANDROID_LIB_VERSION" + implementation "com.android.support:design:$ANDROID_LIB_VERSION" - compile 'com.daimajia.swipelayout:library:1.2.0@aar' - // r2-streamer - final R2_STREAMER_VERSION = '0.1.4' + implementation 'com.daimajia.swipelayout:library:1.2.0@aar' - compile "org.readium:r2-fetcher:$R2_STREAMER_VERSION" - compile "org.readium:r2-parser:$R2_STREAMER_VERSION" - compile "org.readium:r2-server:$R2_STREAMER_VERSION" + //Kotlin + implementation "org.jetbrains.kotlin:kotlin-stdlib:$KOTLIN_VERSION" - compile 'org.greenrobot:eventbus:3.1.1' -} + // r2-streamer + api "org.readium:r2-fetcher:$R2_STREAMER_VERSION" + api "org.readium:r2-parser:$R2_STREAMER_VERSION" + api "org.readium:r2-server:$R2_STREAMER_VERSION" -apply from: '../folioreader/bintray/installv1.gradle' + implementation 'org.greenrobot:eventbus:3.1.1' +} apply from: '../folioreader/bintray/bintrayv1.gradle' diff --git a/folioreader/res/layout/folio_activity.xml b/folioreader/res/layout/folio_activity.xml index 1b04b270e..d601eed67 100644 --- a/folioreader/res/layout/folio_activity.xml +++ b/folioreader/res/layout/folio_activity.xml @@ -101,13 +101,9 @@ - + android:layout_height="match_parent" /> - - \ No newline at end of file diff --git a/folioreader/res/layout/view_audio_player.xml b/folioreader/res/layout/view_audio_player.xml index b52968016..39a44caf1 100644 --- a/folioreader/res/layout/view_audio_player.xml +++ b/folioreader/res/layout/view_audio_player.xml @@ -1,175 +1,175 @@ + android:layout_height="match_parent" + android:background="#99000000" + android:visibility="gone"> - + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:background="@color/white" + android:visibility="invisible"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:id="@+id/top_buttons" + android:layout_width="match_parent" + android:layout_height="50dp" + android:orientation="horizontal"> + + + + + + + + + + + + - + android:orientation="horizontal" + android:weightSum="4.0"> + + + + + + + + + - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/folioreader/src/main/assets/css/Style.css b/folioreader/src/main/assets/css/Style.css index b830b751c..652c51aa6 100755 --- a/folioreader/src/main/assets/css/Style.css +++ b/folioreader/src/main/assets/css/Style.css @@ -246,17 +246,17 @@ html.nightMode .highlight_underline {border-bottom: 2px solid rgba(240, 40, 20, src: url('file:///android_asset/fonts/raleway/Raleway-Regular.ttf'); } -.andada, .andada p, .andada span, .andada div { - font-family: "andada", sans-serif !important; +.andada { + font-family: "andada", sans-serif; } -.lato, .lato p, .lato span, .lato div { - font-family: "lato", serif !important; +.lato { + font-family: "lato", serif; } -.lora, .lora p, .lora span, .lora div { - font-family: "lora", serif !important; +.lora { + font-family: "lora", serif; } -.raleway, .raleway p, .raleway span, .raleway div { - font-family: "raleway", sans-serif !important; +.raleway { + font-family: "raleway", sans-serif; } html.textSizeOne { font-size: 13px !important; } diff --git a/folioreader/src/main/java/com/folioreader/FolioReader.java b/folioreader/src/main/java/com/folioreader/FolioReader.java index 9dcb1d81c..54c27a9d3 100644 --- a/folioreader/src/main/java/com/folioreader/FolioReader.java +++ b/folioreader/src/main/java/com/folioreader/FolioReader.java @@ -159,7 +159,7 @@ private Intent getIntentFromUrl(String assetOrSdcardPath, int rawId) { Intent intent = new Intent(context, FolioActivity.class); if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(FolioActivity.EXTRA_READ_POSITION, (Parcelable) readPosition); if (rawId != 0) { diff --git a/folioreader/src/main/java/com/folioreader/model/sqlite/DbAdapter.java b/folioreader/src/main/java/com/folioreader/model/sqlite/DbAdapter.java index 4c3b76b11..869541dd9 100644 --- a/folioreader/src/main/java/com/folioreader/model/sqlite/DbAdapter.java +++ b/folioreader/src/main/java/com/folioreader/model/sqlite/DbAdapter.java @@ -30,7 +30,7 @@ public static boolean update(String table, String key, String value, ContentValu } public static Cursor getHighLightsForBookId(String bookId) { - return mDatabase.rawQuery("SELECT * FROM " + HighLightTable.TABLE_NAME + " WHERE " + HighLightTable.COL_BOOK_ID + " = '" + bookId + "'", null); + return mDatabase.rawQuery("SELECT * FROM " + HighLightTable.TABLE_NAME + " WHERE " + HighLightTable.COL_BOOK_ID + " = \"" + bookId + "\"", null); } public boolean deleteAll(String table) { @@ -96,6 +96,6 @@ public static int getIdForQuery(String query) { } public static Cursor getHighlightsForId(int id) { - return mDatabase.rawQuery("SELECT * FROM " + HighLightTable.TABLE_NAME + " WHERE " + HighLightTable.ID + " = '" + id + "'", null); + return mDatabase.rawQuery("SELECT * FROM " + HighLightTable.TABLE_NAME + " WHERE " + HighLightTable.ID + " = \"" + id + "\"", null); } } diff --git a/folioreader/src/main/java/com/folioreader/model/sqlite/DictionaryTable.java b/folioreader/src/main/java/com/folioreader/model/sqlite/DictionaryTable.java index 952c34d80..3e1884e46 100644 --- a/folioreader/src/main/java/com/folioreader/model/sqlite/DictionaryTable.java +++ b/folioreader/src/main/java/com/folioreader/model/sqlite/DictionaryTable.java @@ -53,7 +53,7 @@ public void insert(Map map) { public String getMeaningForWord(String word) { Cursor c = database.rawQuery("SELECT * FROM " + TABLE_NAME + - " WHERE " + WORD + " = '" + word.trim() + "'", null); + " WHERE " + WORD + " = \"" + word.trim() + "\"", null); if (c.moveToFirst()) { String toRetuen = c.getString(2); c.close(); diff --git a/folioreader/src/main/java/com/folioreader/model/sqlite/HighLightTable.java b/folioreader/src/main/java/com/folioreader/model/sqlite/HighLightTable.java index 7f6a2d244..fc8645876 100644 --- a/folioreader/src/main/java/com/folioreader/model/sqlite/HighLightTable.java +++ b/folioreader/src/main/java/com/folioreader/model/sqlite/HighLightTable.java @@ -106,7 +106,7 @@ public static long insertHighlight(HighlightImpl highlightImpl) { } public static boolean deleteHighlight(String rangy) { - String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'"; + String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = \"" + rangy + "\""; int id = DbAdapter.getIdForQuery(query); return id != -1 && deleteHighlight(id); } @@ -116,7 +116,7 @@ public static boolean deleteHighlight(int highlightId) { } public static List getHighlightsForPageId(String pageId) { - String query = "SELECT " + COL_RANGY + " FROM " + TABLE_NAME + " WHERE " + COL_PAGE_ID + " = '" + pageId + "'"; + String query = "SELECT " + COL_RANGY + " FROM " + TABLE_NAME + " WHERE " + COL_PAGE_ID + " = \"" + pageId + "\""; Cursor c = DbAdapter.getHighlightsForPageId(query, pageId); List rangyList = new ArrayList<>(); while (c.moveToNext()) { @@ -149,7 +149,7 @@ public static Date getDateTime(String date) { } public static HighlightImpl updateHighlightStyle(String rangy, String style) { - String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'"; + String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = \"" + rangy + "\""; int id = DbAdapter.getIdForQuery(query); if (id != -1 && update(id, updateRangy(rangy, style), style.replace("highlight_", ""))) { return getHighlightId(id); @@ -158,7 +158,7 @@ public static HighlightImpl updateHighlightStyle(String rangy, String style) { } public static HighlightImpl getHighlightForRangy(String rangy) { - String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = '" + rangy + "'"; + String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_RANGY + " = \"" + rangy + "\""; return getHighlightId(DbAdapter.getIdForQuery(query)); } @@ -188,7 +188,7 @@ private static boolean update(int id, String s, String color) { } public static void saveHighlightIfNotExists(HighLight highLight) { - String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_UUID + " = '" + highLight.getUUID() + "'"; + String query = "SELECT " + ID + " FROM " + TABLE_NAME + " WHERE " + COL_UUID + " = \"" + highLight.getUUID() + "\""; int id = DbAdapter.getIdForQuery(query); if (id == -1) { DbAdapter.saveHighLight(getHighlightContentValues(highLight)); diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java b/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java index 652578fed..12badb4a8 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/activity/FolioActivity.java @@ -17,7 +17,6 @@ import android.Manifest; import android.annotation.TargetApi; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; @@ -27,17 +26,12 @@ import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import android.text.Html; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.animation.AccelerateInterpolator; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; import android.view.animation.DecelerateInterpolator; -import android.widget.ImageButton; import android.widget.ImageView; -import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -48,9 +42,7 @@ import com.folioreader.model.HighlightImpl; import com.folioreader.model.ReadPosition; import com.folioreader.model.event.AnchorIdEvent; -import com.folioreader.model.event.MediaOverlayHighlightStyleEvent; import com.folioreader.model.event.MediaOverlayPlayPauseEvent; -import com.folioreader.model.event.MediaOverlaySpeedEvent; import com.folioreader.model.event.WebViewPosition; import com.folioreader.ui.folio.adapter.FolioPageFragmentAdapter; import com.folioreader.ui.folio.fragment.FolioPageFragment; @@ -61,8 +53,9 @@ import com.folioreader.util.UiUtil; import com.folioreader.view.ConfigBottomSheetDialogFragment; import com.folioreader.view.DirectionalViewpager; +import com.folioreader.view.MediaControllerCallback; +import com.folioreader.view.MediaControllerView; import com.folioreader.view.ObservableWebView; -import com.folioreader.view.StyleableTextView; import org.greenrobot.eventbus.EventBus; import org.readium.r2_streamer.model.container.Container; @@ -86,7 +79,8 @@ public class FolioActivity implements FolioPageFragment.FolioPageFragmentCallback, ObservableWebView.ToolBarListener, ConfigBottomSheetDialogFragment.ConfigDialogCallback, - MainMvpView { + MainMvpView, + MediaControllerCallback{ private static final String TAG = "FolioActivity"; @@ -101,8 +95,6 @@ public enum EpubSourceType { SD_CARD } - private boolean isOpen = true; - public static final int ACTION_CONTENT_HIGHLIGHT = 77; private String bookFileName; private static final String HIGHLIGHT_ITEM = "highlight_item"; @@ -120,14 +112,13 @@ public enum EpubSourceType { private List mSpineReferenceList = new ArrayList<>(); private EpubServer mEpubServer; - private Animation slide_down; - private Animation slide_up; private boolean mIsNightMode; private Config mConfig; private String mBookId; private String mEpubFilePath; private EpubSourceType mEpubSourceType; int mEpubRawId = 0; + private MediaControllerView mediaControllerView; @Override protected void onCreate(Bundle savedInstanceState) { @@ -143,18 +134,16 @@ protected void onCreate(Bundle savedInstanceState) { mEpubFilePath = getIntent().getExtras() .getString(FolioActivity.INTENT_EPUB_SOURCE_PATH); } - setConfig(); + mediaControllerView = findViewById(R.id.media_controller_view); + mediaControllerView.onInit(); + mediaControllerView.setListeners(this); if (!mConfig.isShowTts()) { findViewById(R.id.btn_speaker).setVisibility(View.GONE); } title = (TextView) findViewById(R.id.lbl_center); - slide_down = AnimationUtils.loadAnimation(getApplicationContext(), - R.anim.slide_down); - slide_up = AnimationUtils.loadAnimation(getApplicationContext(), - R.anim.slide_up); initColors(); @@ -164,7 +153,6 @@ protected void onCreate(Bundle savedInstanceState) { setupBook(); } - initAudioView(); mToolbar = (Toolbar) findViewById(R.id.toolbar); findViewById(R.id.btn_drawer).setOnClickListener(new View.OnClickListener() { @@ -179,20 +167,10 @@ public void onClick(View v) { } }); - // speaker = (ImageView) findViewById(R.id.btn_speaker); findViewById(R.id.btn_speaker).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (isOpen) { - audioContainer.startAnimation(slide_up); - audioContainer.setVisibility(View.VISIBLE); - shade.setVisibility(View.VISIBLE); - } else { - audioContainer.startAnimation(slide_down); - audioContainer.setVisibility(View.INVISIBLE); - shade.setVisibility(View.GONE); - } - isOpen = !isOpen; + mediaControllerView.show(); } }); @@ -200,7 +178,7 @@ public void onClick(View v) { if (mIsNightMode) { mToolbar.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.black)); title.setTextColor(ContextCompat.getColor(FolioActivity.this, R.color.white)); - audioContainer.setBackgroundColor(ContextCompat.getColor(FolioActivity.this, R.color.night)); + mediaControllerView.setNightMode(); } } @@ -267,7 +245,7 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse @Override public void onPageSelected(int position) { EventBus.getDefault().post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, false, true)); - mPlayPauseBtn.setImageDrawable(ContextCompat.getDrawable(FolioActivity.this, R.drawable.play_icon)); + mediaControllerView.setPlayButtonDrawable(); mChapterPosition = position; } @@ -486,166 +464,14 @@ private void setConfig() { } } - - //*************************************************************************// - // AUDIO PLAYER // - //*************************************************************************// - private StyleableTextView mHalfSpeed, mOneSpeed, mTwoSpeed, mOneAndHalfSpeed; - private StyleableTextView mBackgroundColorStyle, mUnderlineStyle, mTextColorStyle; - private RelativeLayout audioContainer; - private boolean mIsSpeaking; - private ImageButton mPlayPauseBtn, mPreviousButton, mNextButton; - private RelativeLayout shade; - - private void initAudioView() { - mHalfSpeed = findViewById(R.id.btn_half_speed); - mOneSpeed = findViewById(R.id.btn_one_x_speed); - mTwoSpeed = findViewById(R.id.btn_twox_speed); - audioContainer = findViewById(R.id.container); - shade = findViewById(R.id.shade); - mOneAndHalfSpeed = findViewById(R.id.btn_one_and_half_speed); - mPlayPauseBtn = findViewById(R.id.play_button); - mPreviousButton = findViewById(R.id.prev_button); - mNextButton = findViewById(R.id.next_button); - mBackgroundColorStyle = findViewById(R.id.btn_backcolor_style); - mUnderlineStyle = findViewById(R.id.btn_text_undeline_style); - mTextColorStyle = findViewById(R.id.btn_text_color_style); - mIsSpeaking = false; - - final Context mContext = mHalfSpeed.getContext(); - mOneAndHalfSpeed.setText(Html.fromHtml(mContext.getString(R.string.one_and_half_speed))); - mHalfSpeed.setText(Html.fromHtml(mContext.getString(R.string.half_speed_text))); - String styleUnderline = - mHalfSpeed.getContext().getResources().getString(R.string.style_underline); - mUnderlineStyle.setText(Html.fromHtml(styleUnderline)); - - setupColors(mContext); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - findViewById(R.id.playback_speed_Layout).setVisibility(View.GONE); - } - - shade.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (isOpen) { - audioContainer.startAnimation(slide_up); - audioContainer.setVisibility(View.VISIBLE); - shade.setVisibility(View.VISIBLE); - } else { - audioContainer.startAnimation(slide_down); - audioContainer.setVisibility(View.INVISIBLE); - shade.setVisibility(View.GONE); - } - isOpen = !isOpen; - } - }); - - mPlayPauseBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mIsSpeaking) { - EventBus.getDefault().post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, false, false)); - mPlayPauseBtn.setImageDrawable(ContextCompat.getDrawable(FolioActivity.this, R.drawable.play_icon)); - UiUtil.setColorToImage(mContext, mConfig.getThemeColor(), mPlayPauseBtn.getDrawable()); - } else { - EventBus.getDefault().post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, true, false)); - mPlayPauseBtn.setImageDrawable(ContextCompat.getDrawable(FolioActivity.this, R.drawable.pause_btn)); - UiUtil.setColorToImage(mContext, mConfig.getThemeColor(), mPlayPauseBtn.getDrawable()); - } - mIsSpeaking = !mIsSpeaking; - } - }); - - mHalfSpeed.setOnClickListener(new View.OnClickListener() { - @TargetApi(Build.VERSION_CODES.M) - @Override - public void onClick(View v) { - mHalfSpeed.setSelected(true); - mOneSpeed.setSelected(false); - mOneAndHalfSpeed.setSelected(false); - mTwoSpeed.setSelected(false); - EventBus.getDefault().post(new MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.HALF)); - } - }); - - mOneSpeed.setOnClickListener(new View.OnClickListener() { - @TargetApi(Build.VERSION_CODES.M) - @Override - public void onClick(View v) { - mHalfSpeed.setSelected(false); - mOneSpeed.setSelected(true); - mOneAndHalfSpeed.setSelected(false); - mTwoSpeed.setSelected(false); - EventBus.getDefault().post(new MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.ONE)); - } - }); - mOneAndHalfSpeed.setOnClickListener(new View.OnClickListener() { - @TargetApi(Build.VERSION_CODES.M) - @Override - public void onClick(View v) { - mHalfSpeed.setSelected(false); - mOneSpeed.setSelected(false); - mOneAndHalfSpeed.setSelected(true); - mTwoSpeed.setSelected(false); - EventBus.getDefault().post(new MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.ONE_HALF)); - } - }); - mTwoSpeed.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mHalfSpeed.setSelected(false); - mOneSpeed.setSelected(false); - mOneAndHalfSpeed.setSelected(false); - mTwoSpeed.setSelected(true); - EventBus.getDefault().post(new MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.TWO)); - } - }); - - mBackgroundColorStyle.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mBackgroundColorStyle.setSelected(true); - mUnderlineStyle.setSelected(false); - mTextColorStyle.setSelected(false); - EventBus.getDefault().post(new MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.DEFAULT)); - } - }); - - mUnderlineStyle.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mBackgroundColorStyle.setSelected(false); - mUnderlineStyle.setSelected(true); - mTextColorStyle.setSelected(false); - EventBus.getDefault().post(new MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.UNDERLINE)); - - } - }); - - mTextColorStyle.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mBackgroundColorStyle.setSelected(false); - mUnderlineStyle.setSelected(false); - mTextColorStyle.setSelected(true); - EventBus.getDefault().post(new MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.BACKGROUND)); - } - }); - + @Override + public void play() { + EventBus.getDefault().post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, true, false)); } - private void setupColors(Context context) { - mHalfSpeed.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color)); - mOneAndHalfSpeed.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color)); - mTwoSpeed.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color)); - mOneSpeed.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color)); - mUnderlineStyle.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color)); - mBackgroundColorStyle.setTextColor(UiUtil.getColorList(context, R.color.white, R.color.grey_color)); - mBackgroundColorStyle.setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(this, mConfig.getThemeColor(), android.R.color.transparent)); - mTextColorStyle.setTextColor(UiUtil.getColorList(context, mConfig.getThemeColor(), R.color.grey_color)); - UiUtil.setColorToImage(context, mConfig.getThemeColor(), mPlayPauseBtn.getDrawable()); - UiUtil.setColorToImage(context, mConfig.getThemeColor(), mNextButton.getDrawable()); - UiUtil.setColorToImage(context, mConfig.getThemeColor(), mPreviousButton.getDrawable()); + @Override + public void pause() { + EventBus.getDefault().post(new MediaOverlayPlayPauseEvent(mSpineReferenceList.get(mChapterPosition).href, false, false)); } @Override @@ -678,4 +504,4 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis break; } } -} +} \ No newline at end of file diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/adapter/DictionaryAdapter.java b/folioreader/src/main/java/com/folioreader/ui/folio/adapter/DictionaryAdapter.java index 1ad8e11aa..d75249bae 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/adapter/DictionaryAdapter.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/adapter/DictionaryAdapter.java @@ -44,6 +44,7 @@ public DictionaryHolder onCreateViewHolder(ViewGroup parent, int viewType) { } @Override + @SuppressWarnings("PMD.InefficientEmptyStringCheck") public void onBindViewHolder(DictionaryHolder holder, int position) { final DictionaryResults res = results.get(position); if (res.getPartOfSpeech() != null) { diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/DictionaryFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/DictionaryFragment.java index 4d4b42a0d..ea6dc543c 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/DictionaryFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/DictionaryFragment.java @@ -178,6 +178,7 @@ public void onDictionaryDataReceived(Dictionary dictionary) { } @Override + @SuppressWarnings("PMD.InefficientEmptyStringCheck") public void onWikipediaDataReceived(Wikipedia wikipedia) { wikiWord.setText(wikipedia.getWord()); if (wikipedia.getDefinition().trim().isEmpty()) { diff --git a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index bf52b7561..a02fe77ae 100644 --- a/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java +++ b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java @@ -60,6 +60,7 @@ import com.folioreader.util.HighlightUtil; import com.folioreader.util.SMILParser; import com.folioreader.util.UiUtil; +import com.folioreader.view.MediaControllerView; import com.folioreader.view.ObservableWebView; import com.folioreader.view.VerticalSeekbar; @@ -242,7 +243,7 @@ public void pauseButtonClicked(MediaOverlayPlayPauseEvent event) { /** * [EVENT BUS FUNCTION] - * Function triggered from {@link FolioActivity#initAudioView()} when speed + * Function triggered from {@link MediaControllerView#initListeners()} when speed * change buttons are clicked * * @param event of type {@link MediaOverlaySpeedEvent} contains selected speed @@ -256,7 +257,7 @@ public void speedChanged(MediaOverlaySpeedEvent event) { /** * [EVENT BUS FUNCTION] - * Function triggered from {@link FolioActivity#initAudioView()} when new + * Function triggered from {@link MediaControllerView#initListeners()} when new * style is selected on button click. * * @param event of type {@link MediaOverlaySpeedEvent} contains selected style @@ -561,7 +562,11 @@ public boolean onJsAlert(WebView view, String url, String message, JsResult resu } } } else if (TextUtils.isDigitsOnly(message)) { - mTotalMinutes = Integer.parseInt(message); + try { + mTotalMinutes = Integer.parseInt(message); + } catch (NumberFormatException e) { + mTotalMinutes = 0; + } } else { pattern = Pattern.compile(getString(R.string.pattern)); matcher = pattern.matcher(message); diff --git a/folioreader/src/main/java/com/folioreader/view/MediaControllerCallback.kt b/folioreader/src/main/java/com/folioreader/view/MediaControllerCallback.kt new file mode 100644 index 000000000..e2d0d9902 --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/view/MediaControllerCallback.kt @@ -0,0 +1,9 @@ +package com.folioreader.view + +/** + * Created by gautam on 9/5/18. + */ +interface MediaControllerCallback { + fun play() + fun pause() +} \ No newline at end of file diff --git a/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt b/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt new file mode 100644 index 000000000..4e528135b --- /dev/null +++ b/folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt @@ -0,0 +1,155 @@ +package com.folioreader.view + +import android.content.Context +import android.os.Build +import android.support.v4.content.ContextCompat +import android.text.Html +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.animation.AnimationUtils +import android.widget.RelativeLayout +import com.folioreader.Config +import com.folioreader.R +import com.folioreader.model.event.MediaOverlayHighlightStyleEvent +import com.folioreader.model.event.MediaOverlaySpeedEvent +import com.folioreader.util.AppUtil +import com.folioreader.util.UiUtil +import kotlinx.android.synthetic.main.view_audio_player.view.* +import org.greenrobot.eventbus.EventBus + +/** + * Created by gautam on 9/5/18. + */ +class MediaControllerView : RelativeLayout { + private lateinit var config: Config + private var visible: Boolean = true + lateinit var callback: MediaControllerCallback + private var isPlaying: Boolean = false + + constructor(context: Context) : this(context, null, 0) + constructor(context: Context, attributes: AttributeSet?) : this(context, attributes, 0) + constructor(context: Context, attributes: AttributeSet?, defStyle: Int) : super(context, attributes, defStyle) { + LayoutInflater.from(context).inflate(R.layout.view_audio_player, this) + } + + fun onInit() { + config = AppUtil.getSavedConfig(context) + btn_one_and_half_speed.text = Html.fromHtml(context.getString(R.string.one_and_half_speed)) + btn_half_speed.text = Html.fromHtml(context.getString(R.string.half_speed_text)) + btn_text_undeline_style.text = Html.fromHtml(context.getString(R.string.style_underline)) + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + playback_speed_Layout.visibility = View.GONE + } + initColors() + initListeners() + } + + fun setListeners(callback: MediaControllerCallback) { + this.callback = callback + } + + private fun initColors() { + btn_half_speed.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) + btn_one_and_half_speed.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) + btn_twox_speed.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) + btn_one_x_speed.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) + btn_text_undeline_style.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) + btn_backcolor_style.setTextColor(UiUtil.getColorList(context, R.color.white, R.color.grey_color)) + btn_backcolor_style.setBackgroundDrawable(UiUtil.convertColorIntoStateDrawable(context, config.themeColor, android.R.color.transparent)) + btn_text_color_style.setTextColor(UiUtil.getColorList(context, config.themeColor, R.color.grey_color)) + UiUtil.setColorToImage(context, config.themeColor, play_button.drawable) + UiUtil.setColorToImage(context, config.themeColor, next_button.drawable) + UiUtil.setColorToImage(context, config.themeColor, prev_button.drawable) + } + + private fun initListeners() { + shade.setOnClickListener { show() } + play_button.setOnClickListener { + callback.let { + if (isPlaying) { + callback.pause() + play_button.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.play_icon)) + UiUtil.setColorToImage(context, config.themeColor, play_button.drawable) + } else { + callback.play() + play_button.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.pause_btn)) + UiUtil.setColorToImage(context, config.themeColor, play_button.drawable) + } + isPlaying = !isPlaying + } + } + btn_half_speed.setOnClickListener { + toggleSpeedControlButtons(true, false, false, false) + EventBus.getDefault().post(MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.HALF)) + } + + btn_one_x_speed.setOnClickListener { + toggleSpeedControlButtons(false, true, false, false) + EventBus.getDefault().post(MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.ONE)) + } + btn_one_and_half_speed.setOnClickListener { + toggleSpeedControlButtons(false, false, true, false) + EventBus.getDefault().post(MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.ONE_HALF)) + } + btn_twox_speed.setOnClickListener { + toggleSpeedControlButtons(false, false, false, true) + EventBus.getDefault().post(MediaOverlaySpeedEvent(MediaOverlaySpeedEvent.Speed.TWO)) + } + + btn_backcolor_style.setOnClickListener { + toggleTextStyle(true, false, false) + EventBus.getDefault().post(MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.DEFAULT)) + } + + btn_text_undeline_style.setOnClickListener { + toggleTextStyle(false, true, false) + EventBus.getDefault().post(MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.UNDERLINE)) + + } + + btn_text_color_style.setOnClickListener { + toggleTextStyle(false, false, true) + EventBus.getDefault().post(MediaOverlayHighlightStyleEvent(MediaOverlayHighlightStyleEvent.Style.BACKGROUND)) + } + } + + private fun toggleTextStyle(backcolor: Boolean, underline: Boolean, textColor: Boolean) { + btn_backcolor_style.isSelected = backcolor + btn_text_undeline_style.isSelected = underline + btn_text_color_style.isSelected = textColor + } + + private fun toggleSpeedControlButtons(half: Boolean, one: Boolean, oneHalf: Boolean, two: Boolean) { + btn_half_speed.isSelected = half + btn_one_x_speed.isSelected = one + btn_one_and_half_speed.isSelected = oneHalf + btn_twox_speed.isSelected = two + } + + fun setPlayButtonDrawable() { + play_button.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.play_icon)) + } + + fun setNightMode() { + container.setBackgroundColor(ContextCompat.getColor(context, R.color.night)) + } + + private fun open() { + container.startAnimation(AnimationUtils.loadAnimation(context, R.anim.slide_up)) + container.visibility = View.VISIBLE + shade.visibility = View.VISIBLE + } + + fun show() { + if (visible) open() else close() + visible = !visible + } + + private fun close() { + container.startAnimation(AnimationUtils.loadAnimation(context, R.anim.slide_down)) + container.visibility = View.GONE + shade.visibility = View.GONE + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 279429476..868b7fb98 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Jun 10 11:42:12 IST 2017 +#Wed May 09 16:00:44 IST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/sample/build.gradle b/sample/build.gradle index 2637e3b94..3819aebd4 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -8,8 +8,8 @@ android { javaMaxHeapSize "4G" } - compileSdkVersion 26 - buildToolsVersion "26.0.2" + compileSdkVersion 27 + buildToolsVersion "27.0.3" defaultConfig { applicationId "com.folioreader.android.sample" @@ -56,6 +56,6 @@ android { } dependencies { - compile project(':folioreader') - compile 'com.android.support:appcompat-v7:26.0.2' + implementation project(':folioreader') + implementation 'com.android.support:appcompat-v7:27.1.1' } diff --git a/webViewMarker/build.gradle b/webViewMarker/build.gradle index 3d006221b..ca9032116 100644 --- a/webViewMarker/build.gradle +++ b/webViewMarker/build.gradle @@ -13,7 +13,7 @@ ext { siteUrl = 'https://github.com/FolioReader/FolioReader-Android' gitUrl = 'https://github.com/FolioReader/FolioReader-Android.git' - libraryVersion = '0.3.8' + libraryVersion = '0.3.9' developerId = 'mobisystech' developerName = 'Folio Reader' @@ -25,8 +25,8 @@ ext { } android { - compileSdkVersion 19 - buildToolsVersion '26.0.2' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { versionCode Integer.parseInt(project.VERSION_CODE)