From 591f4e83521efe87c8e168330b78891cd257dcc8 Mon Sep 17 00:00:00 2001 From: Gautam Chibde Date: Wed, 9 May 2018 19:32:04 +0530 Subject: [PATCH 01/11] update gradle and android sdk version --- build.gradle | 12 +++++-- folioreader/build.gradle | 42 +++++++++++++----------- gradle/wrapper/gradle-wrapper.properties | 4 +-- sample/build.gradle | 8 ++--- webViewMarker/build.gradle | 4 +-- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/build.gradle b/build.gradle index 6e82884da..dbb49c8e8 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.4' + 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..955bbc5f2 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' @@ -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/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..2ef699d06 100644 --- a/webViewMarker/build.gradle +++ b/webViewMarker/build.gradle @@ -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) From ad4b823cd0099bccde4264a90781375bbe090361 Mon Sep 17 00:00:00 2001 From: Gautam Chibde Date: Thu, 10 May 2018 13:10:19 +0530 Subject: [PATCH 02/11] added custom view for media controller --- folioreader/res/layout/folio_activity.xml | 10 +- folioreader/res/layout/view_audio_player.xml | 314 +++++++++--------- .../ui/folio/activity/FolioActivity.java | 210 +----------- .../ui/folio/fragment/FolioPageFragment.java | 5 +- .../view/MediaControllerCallback.kt | 9 + .../folioreader/view/MediaControllerView.kt | 155 +++++++++ 6 files changed, 345 insertions(+), 358 deletions(-) create mode 100644 folioreader/src/main/java/com/folioreader/view/MediaControllerCallback.kt create mode 100644 folioreader/src/main/java/com/folioreader/view/MediaControllerView.kt 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/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/fragment/FolioPageFragment.java b/folioreader/src/main/java/com/folioreader/ui/folio/fragment/FolioPageFragment.java index bf52b7561..e1581c89a 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 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 From 705e92ce73412919e6f43359b7b90bedc8fb11fd Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Tue, 15 May 2018 15:37:45 +0530 Subject: [PATCH 03/11] Fix bug - apostrophe character in epub file name https://github.com/FolioReader/FolioReader-Android/issues/204 Regex used for finding possible breakpoints - \'\"\s\+\s\w+\s\+\s\"\'\" \'\"\s\+\s\w+.\w+\(\)\s\+\s\"\'\" \'\"\s+\+\s+\w+.\w+\(\)\s+\+\s+\"\' --- .../java/com/folioreader/model/sqlite/DbAdapter.java | 4 ++-- .../com/folioreader/model/sqlite/DictionaryTable.java | 2 +- .../com/folioreader/model/sqlite/HighLightTable.java | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) 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)); From 633c26ecd058d48318cc8783937ca554df6814bc Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Tue, 15 May 2018 15:43:44 +0530 Subject: [PATCH 04/11] Fix bug - Unable to move back to previous activity https://github.com/FolioReader/FolioReader-Android/issues/205 Now code navigate back to prevoius activity even if app was minimised. --- folioreader/src/main/java/com/folioreader/FolioReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) { From c9b6528e5408ea682236960eb3a83051d11b7a6e Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Tue, 15 May 2018 20:03:22 +0530 Subject: [PATCH 05/11] Fix bug - Font precedence corrected Previously no other font specified in epub webpages were given preference because CSS injection had !important and fonts were also specified to p, span, div tags. Test Files - [hindi1.epub] (https://www.dropbox.com/s/0f98gq5cnrw31ga/hindi1.epub?dl=0) --- folioreader/src/main/assets/css/Style.css | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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; } From e4050b4a45907e88bb9421c530f8eec4a9208ce1 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 16 May 2018 13:31:51 +0530 Subject: [PATCH 06/11] Fix PMD build failing --- .../java/com/folioreader/ui/folio/adapter/DictionaryAdapter.java | 1 + .../com/folioreader/ui/folio/fragment/DictionaryFragment.java | 1 + 2 files changed, 2 insertions(+) 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()) { From 45bf5874597848b62d61966c14c325d1581ba5f9 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 16 May 2018 15:13:18 +0530 Subject: [PATCH 07/11] Update android versions in .travis.yml --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 From c5b5df254f05fb48c96636b6958e40cc2e7d0c8f Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 16 May 2018 15:29:34 +0530 Subject: [PATCH 08/11] Update r2-streamer-java to v0.1.5 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index dbb49c8e8..334072821 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext.KOTLIN_VERSION= '1.2.41' ext.ANDROID_LIB_VERSION = '27.1.1' - ext.R2_STREAMER_VERSION = '0.1.4' + ext.R2_STREAMER_VERSION = '0.1.5' def KOTLIN_VERSION = ext.KOTLIN_VERSION repositories { From 34e03c5a0b07345d256ad683d0ef6a68828ddf1e Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 16 May 2018 18:45:13 +0530 Subject: [PATCH 09/11] Fix #174 Unable to reproduce the bug on adventures.epub and TheSilverChair.epub, but still exception catched and handled. --- .../folioreader/ui/folio/fragment/FolioPageFragment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 e1581c89a..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 @@ -562,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); From 96f83565afa7bdd2e95c3234bd81ea7bedb7191d Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 16 May 2018 18:54:20 +0530 Subject: [PATCH 10/11] v0.3.9 Fixes FolioReader/FolioReader-Android#174 Fixes FolioReader/FolioReader-Android#181 Fixes FolioReader/FolioReader-Android#204 Fixes FolioReader/FolioReader-Android#205 --- folioreader/build.gradle | 2 +- webViewMarker/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/folioreader/build.gradle b/folioreader/build.gradle index 955bbc5f2..9f55be22d 100644 --- a/folioreader/build.gradle +++ b/folioreader/build.gradle @@ -17,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' diff --git a/webViewMarker/build.gradle b/webViewMarker/build.gradle index 2ef699d06..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' From e41fe70e26b0630b49a121b2aaec247ed2c1d844 Mon Sep 17 00:00:00 2001 From: Hrishikesh Kadam Date: Wed, 16 May 2018 19:10:04 +0530 Subject: [PATCH 11/11] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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