diff --git a/UIViews/build.gradle b/UIViews/build.gradle index 228c05f10..1124650e5 100644 --- a/UIViews/build.gradle +++ b/UIViews/build.gradle @@ -61,6 +61,8 @@ dependencies { implementation 'me.zhanghai.android.fastscroll:library:1.1.5' + implementation 'com.github.pwittchen:reactivenetwork-rx2:3.0.8' + implementation project(':Models') implementation project(':favoritesdatabase') diff --git a/UIViews/src/main/AndroidManifest.xml b/UIViews/src/main/AndroidManifest.xml index 408a46fba..c263d1b0e 100644 --- a/UIViews/src/main/AndroidManifest.xml +++ b/UIViews/src/main/AndroidManifest.xml @@ -2,4 +2,5 @@ + \ No newline at end of file diff --git a/UIViews/src/main/java/com/programmersbox/uiviews/AllFragment.kt b/UIViews/src/main/java/com/programmersbox/uiviews/AllFragment.kt index e0fdffe12..58bc53771 100644 --- a/UIViews/src/main/java/com/programmersbox/uiviews/AllFragment.kt +++ b/UIViews/src/main/java/com/programmersbox/uiviews/AllFragment.kt @@ -2,10 +2,12 @@ package com.programmersbox.uiviews import android.os.Bundle import android.view.View +import android.widget.RelativeLayout import androidx.fragment.app.Fragment import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout @@ -77,6 +79,15 @@ class AllFragment : BaseListFragment() { }) } + ReactiveNetwork.observeInternetConnectivity() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + view.findViewById(R.id.offline_view).visibility = if (it) View.GONE else View.VISIBLE + refresh.visibility = if (it) View.VISIBLE else View.GONE + } + .addTo(disposable) + sourcePublish .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) diff --git a/UIViews/src/main/java/com/programmersbox/uiviews/BaseMainActivity.kt b/UIViews/src/main/java/com/programmersbox/uiviews/BaseMainActivity.kt index 71414fda2..1b72792c3 100644 --- a/UIViews/src/main/java/com/programmersbox/uiviews/BaseMainActivity.kt +++ b/UIViews/src/main/java/com/programmersbox/uiviews/BaseMainActivity.kt @@ -49,16 +49,19 @@ abstract class BaseMainActivity : AppCompatActivity(), GenericInfo { val controller = findViewById(R.id.navLayout2) .also { GlobalScope.launch { - val request = Request.Builder() - .url("https://github.com/jakepurple13/OtakuWorld/releases/latest") - .get() - .build() - @Suppress("BlockingMethodInNonBlockingContext") val response = OkHttpClient().newCall(request).execute() - val f = response.request().url().path.split("/").lastOrNull()?.toDoubleOrNull() - runOnUIThread { - if (packageManager?.getPackageInfo(packageName, 0)?.versionName?.toDoubleOrNull() ?: 0.0 < f ?: 0.0) { - it.getOrCreateBadge(R.id.setting_nav).number = 1 + try { + val request = Request.Builder() + .url("https://github.com/jakepurple13/OtakuWorld/releases/latest") + .get() + .build() + @Suppress("BlockingMethodInNonBlockingContext") val response = OkHttpClient().newCall(request).execute() + val f = response.request().url().path.split("/").lastOrNull()?.toDoubleOrNull() + runOnUIThread { + if (packageManager?.getPackageInfo(packageName, 0)?.versionName?.toDoubleOrNull() ?: 0.0 < f ?: 0.0) { + it.getOrCreateBadge(R.id.setting_nav).number = 1 + } } + } catch (e: Exception) { } } } diff --git a/UIViews/src/main/java/com/programmersbox/uiviews/RecentFragment.kt b/UIViews/src/main/java/com/programmersbox/uiviews/RecentFragment.kt index 42f8a6039..da52c7f2e 100644 --- a/UIViews/src/main/java/com/programmersbox/uiviews/RecentFragment.kt +++ b/UIViews/src/main/java/com/programmersbox/uiviews/RecentFragment.kt @@ -2,9 +2,11 @@ package com.programmersbox.uiviews import android.os.Bundle import android.view.View +import android.widget.RelativeLayout import androidx.fragment.app.Fragment import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.github.pwittchen.reactivenetwork.library.rx2.ReactiveNetwork import com.programmersbox.favoritesdatabase.DbModel import com.programmersbox.favoritesdatabase.ItemDatabase import com.programmersbox.models.ApiService @@ -63,6 +65,15 @@ class RecentFragment : BaseListFragment() { }) } + ReactiveNetwork.observeInternetConnectivity() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + view.findViewById(R.id.offline_view).visibility = if (it) View.GONE else View.VISIBLE + refresh.visibility = if (it) View.VISIBLE else View.GONE + } + .addTo(disposable) + refresh.setOnRefreshListener { sourceLoad(sourcePublish.value!!) } sourcePublish diff --git a/UIViews/src/main/java/com/programmersbox/uiviews/SettingsFragment.kt b/UIViews/src/main/java/com/programmersbox/uiviews/SettingsFragment.kt index 6f91469b7..42a06faa3 100644 --- a/UIViews/src/main/java/com/programmersbox/uiviews/SettingsFragment.kt +++ b/UIViews/src/main/java/com/programmersbox/uiviews/SettingsFragment.kt @@ -194,24 +194,29 @@ class SettingsFragment : PreferenceFragmentCompat() { fun updateSetter() { if (!checker.get()) { GlobalScope.launch { - checker.set(true) - val request = Request.Builder() - .url("https://github.com/jakepurple13/OtakuWorld/releases/latest") - .get() - .build() - @Suppress("BlockingMethodInNonBlockingContext") val response = OkHttpClient().newCall(request).execute() - val f = response.request().url().path.split("/").lastOrNull()?.toDoubleOrNull() - runOnUIThread { - findPreference("updateAvailable")?.let { p1 -> - p1.summary = "Version: $f" - p1.isVisible = - context?.packageManager?.getPackageInfo( - requireContext().packageName, - 0 - )?.versionName?.toDoubleOrNull() ?: 0.0 < f ?: 0.0 + try { + checker.set(true) + val request = Request.Builder() + .url("https://github.com/jakepurple13/OtakuWorld/releases/latest") + .get() + .build() + @Suppress("BlockingMethodInNonBlockingContext") val response = OkHttpClient().newCall(request).execute() + val f = response.request().url().path.split("/").lastOrNull()?.toDoubleOrNull() + runOnUIThread { + findPreference("updateAvailable")?.let { p1 -> + p1.summary = "Version: $f" + p1.isVisible = + context?.packageManager?.getPackageInfo( + requireContext().packageName, + 0 + )?.versionName?.toDoubleOrNull() ?: 0.0 < f ?: 0.0 + } } + } catch (e: Exception) { + + } finally { + checker.set(false) } - checker.set(false) } } } @@ -323,12 +328,12 @@ class SettingsDsl { } } -abstract class CoroutineTask : CoroutineScope { +abstract class CoroutineTask : CoroutineScope { protected open val job: Job = Job() override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job protected suspend fun publishProgress(vararg values: Progress) = withContext(Dispatchers.Main) { onProgressUpdate(*values) } open fun onProgressUpdate(vararg values: Progress) {} - abstract suspend fun doInBackground(vararg params: Params): Result + abstract suspend fun doInBackground(): Result open fun onPreExecute() {} open fun onPostExecute(result: Result) {} fun cancel() = job.cancel() diff --git a/UIViews/src/main/java/com/programmersbox/uiviews/utils/ContextUtils.kt b/UIViews/src/main/java/com/programmersbox/uiviews/utils/ContextUtils.kt index 8c2f5601e..05e0348dc 100644 --- a/UIViews/src/main/java/com/programmersbox/uiviews/utils/ContextUtils.kt +++ b/UIViews/src/main/java/com/programmersbox/uiviews/utils/ContextUtils.kt @@ -1,6 +1,10 @@ package com.programmersbox.uiviews.utils import android.content.Context +import android.graphics.Bitmap +import android.graphics.BlurMaskFilter +import android.graphics.Canvas +import android.graphics.Paint import com.google.gson.* import com.programmersbox.gsonutils.sharedPrefNotNullObjectDelegate import com.programmersbox.gsonutils.sharedPrefObjectDelegate @@ -21,6 +25,23 @@ val updateCheckPublish = BehaviorSubject.create() var Context.batteryAlertPercent: Int by sharedPrefNotNullDelegate(20) +fun Bitmap.glowEffect(glowRadius: Int, glowColor: Int): Bitmap? { + val margin = 24 + val halfMargin = margin / 2f + val alpha = extractAlpha() + val out = Bitmap.createBitmap(width + margin, height + margin, Bitmap.Config.ARGB_8888) + val canvas = Canvas(out) + val paint = Paint() + paint.color = glowColor + + // Outer glow, For Inner glow set Blur.INNER + paint.maskFilter = BlurMaskFilter(glowRadius.toFloat(), BlurMaskFilter.Blur.OUTER) + canvas.drawBitmap(alpha, halfMargin, halfMargin, paint) + canvas.drawBitmap(this, halfMargin, halfMargin, null) + alpha.recycle() + return out +} + class ChapterModelSerializer : JsonSerializer { override fun serialize(src: ChapterModel, typeOfSrc: Type, context: JsonSerializationContext): JsonElement { val json = JsonObject() diff --git a/UIViews/src/main/res/drawable/ic_baseline_cloud_off_24.xml b/UIViews/src/main/res/drawable/ic_baseline_cloud_off_24.xml new file mode 100644 index 000000000..a9bfcf91d --- /dev/null +++ b/UIViews/src/main/res/drawable/ic_baseline_cloud_off_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/UIViews/src/main/res/layout/fragment_all.xml b/UIViews/src/main/res/layout/fragment_all.xml index 500f28050..55bc62ba5 100644 --- a/UIViews/src/main/res/layout/fragment_all.xml +++ b/UIViews/src/main/res/layout/fragment_all.xml @@ -85,4 +85,33 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" /> + + + + + + + + \ No newline at end of file diff --git a/UIViews/src/main/res/layout/fragment_recent.xml b/UIViews/src/main/res/layout/fragment_recent.xml index 2166f568d..eea5c3dbc 100644 --- a/UIViews/src/main/res/layout/fragment_recent.xml +++ b/UIViews/src/main/res/layout/fragment_recent.xml @@ -6,6 +6,35 @@ android:layout_height="match_parent" tools:context=".RecentFragment"> + + + + + + + + (context, baseListFragment) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GalleryHolder = @@ -35,6 +36,7 @@ class MangaGalleryAdapter(context: Context, baseListFragment: BaseListFragment) //.error(R.drawable.manga_world_round_logo) .into { resourceReady { image, _ -> + //cover.setImageBitmap(image.glowEffect(10, title.currentTextColor) ?: image) cover.setImageBitmap(image) /*if (context.usePalette) { swatch = image.getPalette().vibrantSwatch