From 8aa2b2bc7e47d174a90eaba2b372ee05bde0c9ae Mon Sep 17 00:00:00 2001 From: Abdul Wadood Date: Tue, 20 Oct 2020 22:50:24 +0530 Subject: [PATCH] Covert TabsAdapter.java to Kotlin --- core/detekt_baseline.xml | 4 + .../kiwixmobile/core/main/TabsAdapter.java | 190 ------------------ .../kiwixmobile/core/main/TabsAdapter.kt | 170 ++++++++++++++++ 3 files changed, 174 insertions(+), 190 deletions(-) delete mode 100644 core/src/main/java/org/kiwix/kiwixmobile/core/main/TabsAdapter.java create mode 100644 core/src/main/java/org/kiwix/kiwixmobile/core/main/TabsAdapter.kt diff --git a/core/detekt_baseline.xml b/core/detekt_baseline.xml index 35a856b7c..53b120dd7 100644 --- a/core/detekt_baseline.xml +++ b/core/detekt_baseline.xml @@ -5,6 +5,7 @@ EmptyFunctionBlock:BooksOnDiskViewHolder.kt$BookOnDiskViewHolder.BookViewHolder${ } EmptyFunctionBlock:FetchDownloadMonitor.kt$FetchDownloadMonitor.<no name provided>${} ForbiddenComment:JNIInitialiser.kt$JNIInitialiser$// TODO: Consider surfacing to user + LongMethod:TabsAdapter.kt$TabsAdapter$onCreateViewHolder LongParameterList:KiwixDialog.kt$KiwixDialog$( val title: Int?, val message: Int?, val positiveMessage: Int, val negativeMessage: Int?, val cancelable: Boolean = true, val icon: Int? = null, val neutralMessage: Int? = null, val getView: (() -> View)? = null ) LongParameterList:MainMenu.kt$MainMenu$( private val activity: Activity, zimFileReader: ZimFileReader?, menu: Menu, webViews: MutableList<KiwixWebView>, urlIsValid: Boolean, disableReadAloud: Boolean = false, disableTabs: Boolean = false, private val menuClickListener: MenuClickListener ) LongParameterList:MainMenu.kt$MainMenu.Factory$( menu: Menu, webViews: MutableList<KiwixWebView>, urlIsValid: Boolean, menuClickListener: MenuClickListener, disableReadAloud: Boolean, disableTabs: Boolean ) @@ -23,6 +24,9 @@ MagicNumber:Seconds.kt$Seconds$24 MagicNumber:Seconds.kt$Seconds$60 MagicNumber:Seconds.kt$Seconds$60.0 + MagicNumber:TabsAdapter.kt$TabsAdapter$3 + MagicNumber:TabsAdapter.kt$TabsAdapter$4 + MagicNumber:TabsAdapter.kt$TabsAdapter$8 NestedBlockDepth:FileUtils.kt$FileUtils$deleteZimFile NestedBlockDepth:ImageUtils.kt$ImageUtils$getBitmapFromView NestedBlockDepth:JNIInitialiser.kt$JNIInitialiser$loadICUData diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/TabsAdapter.java b/core/src/main/java/org/kiwix/kiwixmobile/core/main/TabsAdapter.java deleted file mode 100644 index 99973c143..000000000 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/TabsAdapter.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Kiwix Android - * Copyright (c) 2019 Kiwix - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -package org.kiwix.kiwixmobile.core.main; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.text.TextUtils; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.constraintlayout.widget.ConstraintSet; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.card.MaterialCardView; -import java.util.List; -import org.kiwix.kiwixmobile.core.R; -import org.kiwix.kiwixmobile.core.extensions.ContextExtensionsKt; -import org.kiwix.kiwixmobile.core.extensions.ImageViewExtensionsKt; - -import static org.kiwix.kiwixmobile.core.utils.DimenUtils.getToolbarHeight; -import static org.kiwix.kiwixmobile.core.utils.DimenUtils.getWindowHeight; -import static org.kiwix.kiwixmobile.core.utils.DimenUtils.getWindowWidth; -import static org.kiwix.kiwixmobile.core.utils.ImageUtils.getBitmapFromView; -import static org.kiwix.kiwixmobile.core.utils.StyleUtils.fromHtml; - -public class TabsAdapter extends RecyclerView.Adapter { - private final List webViews; - private final AppCompatActivity activity; - private final NightModeViewPainter painter; - private TabClickListener listener; - private int selectedPosition = 0; - - TabsAdapter(AppCompatActivity activity, List webViews, - NightModeViewPainter painter) { - this.webViews = webViews; - this.activity = activity; - this.painter = painter; - setHasStableIds(true); - } - - @SuppressLint("ResourceType") - @NonNull - @Override - public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - Context context = parent.getContext(); - final int margin16 = - context.getResources().getDimensionPixelSize(R.dimen.activity_horizontal_margin); - - ImageView contentImage = new ImageView(context); - contentImage.setId(1); - contentImage.setScaleType(ImageView.ScaleType.FIT_XY); - - ImageView close = new ImageView(context); - close.setId(2); - close.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_clear_white_24dp)); - ImageViewExtensionsKt.tint(close, - ContextExtensionsKt.getAttribute(context, R.attr.colorOnSurface)); - - MaterialCardView cardView = new MaterialCardView(context); - cardView.setId(3); - cardView.setUseCompatPadding(true); - cardView.addView(contentImage, - new MaterialCardView.LayoutParams(MaterialCardView.LayoutParams.MATCH_PARENT, - MaterialCardView.LayoutParams.MATCH_PARENT)); - - ConstraintLayout constraintLayout = new ConstraintLayout(context); - constraintLayout.setFocusableInTouchMode(true); - - constraintLayout.addView(cardView, - new ConstraintLayout.LayoutParams(getWindowWidth(activity) / 2, - -getToolbarHeight(activity) / 2 + getWindowHeight(activity) / 2)); - constraintLayout.addView(close, new ConstraintLayout.LayoutParams(margin16, - margin16)); - constraintLayout.setLayoutParams( - new RecyclerView.LayoutParams(RecyclerView.LayoutParams.WRAP_CONTENT, - RecyclerView.LayoutParams.MATCH_PARENT)); - - TextView textView = new TextView(context); - textView.setId(4); - textView.setMaxLines(1); - textView.setEllipsize(TextUtils.TruncateAt.END); - constraintLayout.addView(textView, - new ConstraintLayout.LayoutParams(0, ConstraintLayout.LayoutParams.WRAP_CONTENT)); - - ConstraintSet constraintSet = new ConstraintSet(); - constraintSet.clone(constraintLayout); - - constraintSet.connect(cardView.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, - ConstraintSet.TOP); - constraintSet.connect(cardView.getId(), ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, - ConstraintSet.BOTTOM); - constraintSet.connect(cardView.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, - ConstraintSet.START, margin16); - constraintSet.connect(cardView.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, - ConstraintSet.END, margin16); - - constraintSet.connect(close.getId(), ConstraintSet.END, cardView.getId(), ConstraintSet.END); - constraintSet.connect(close.getId(), ConstraintSet.BOTTOM, cardView.getId(), ConstraintSet.TOP); - - constraintSet.connect(textView.getId(), ConstraintSet.BOTTOM, cardView.getId(), - ConstraintSet.TOP); - constraintSet.connect(textView.getId(), ConstraintSet.START, cardView.getId(), - ConstraintSet.START, margin16 / 8); - constraintSet.connect(textView.getId(), ConstraintSet.END, close.getId(), ConstraintSet.START); - - constraintSet.applyTo(constraintLayout); - return new ViewHolder(constraintLayout, contentImage, textView, close); - } - - @Override - public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - KiwixWebView webView = webViews.get(position); - if (webView.getParent() != null) { - ((ViewGroup) webView.getParent()).removeView(webView); - } - String webViewTitle = fromHtml(webView.getTitle()).toString(); - holder.title.setText(webViewTitle); - holder.close.setOnClickListener(v -> listener.onCloseTab(v, holder.getAdapterPosition())); - holder.content.setImageBitmap( - getBitmapFromView(webView, getWindowWidth(activity), getWindowHeight(activity)) - ); - holder.content.setOnClickListener(v -> { - selectedPosition = holder.getAdapterPosition(); - listener.onSelectTab(v, selectedPosition); - notifyDataSetChanged(); - }); - if (!webViewTitle.equals(activity.getString(R.string.menu_home))) { - painter.update(holder.content); - } - } - - @Override - public int getItemCount() { - return webViews.size(); - } - - @Override public long getItemId(int position) { - return webViews.get(position).hashCode(); - } - - int getSelected() { - return selectedPosition; - } - - void setSelected(int position) { - this.selectedPosition = position; - } - - void setTabClickListener(TabClickListener listener) { - this.listener = listener; - } - - public interface TabClickListener { - void onSelectTab(@NonNull View view, int position); - - void onCloseTab(@NonNull View view, int position); - } - - static class ViewHolder extends RecyclerView.ViewHolder { - final ImageView content; - final TextView title; - final ImageView close; - - ViewHolder(View v, ImageView content, TextView title, ImageView close) { - super(v); - this.content = content; - this.title = title; - this.close = close; - } - } -} diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/TabsAdapter.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/TabsAdapter.kt new file mode 100644 index 000000000..862bf8d19 --- /dev/null +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/TabsAdapter.kt @@ -0,0 +1,170 @@ +/* + * Kiwix Android + * Copyright (c) 2019 Kiwix + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package org.kiwix.kiwixmobile.core.main + +import android.annotation.SuppressLint +import android.text.TextUtils +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.ImageView +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.constraintlayout.widget.ConstraintSet +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.card.MaterialCardView +import org.kiwix.kiwixmobile.core.R +import org.kiwix.kiwixmobile.core.extensions.getAttribute +import org.kiwix.kiwixmobile.core.extensions.tint +import org.kiwix.kiwixmobile.core.utils.DimenUtils.getToolbarHeight +import org.kiwix.kiwixmobile.core.utils.DimenUtils.getWindowHeight +import org.kiwix.kiwixmobile.core.utils.DimenUtils.getWindowWidth +import org.kiwix.kiwixmobile.core.utils.ImageUtils.getBitmapFromView +import org.kiwix.kiwixmobile.core.utils.StyleUtils.fromHtml + +class TabsAdapter internal constructor( + private val activity: AppCompatActivity, + private val webViews: List, + private val painter: NightModeViewPainter +) : RecyclerView.Adapter() { + private var listener: TabClickListener? = null + var selected = 0 + @SuppressLint("ResourceType") override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): ViewHolder { + val context = parent.context + val margin16 = context.resources.getDimensionPixelSize(R.dimen.activity_horizontal_margin) + val contentImage = ImageView(context) + contentImage.id = 1 + contentImage.scaleType = ImageView.ScaleType.FIT_XY + val close = ImageView(context) + close.id = 2 + close.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_clear_white_24dp)) + close.tint(context.getAttribute(R.attr.colorOnSurface)) + val cardView = MaterialCardView(context) + cardView.id = 3 + cardView.useCompatPadding = true + cardView.addView( + contentImage, + FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT + ) + ) + val constraintLayout = ConstraintLayout(context) + constraintLayout.isFocusableInTouchMode = true + constraintLayout.addView( + cardView, + ConstraintLayout.LayoutParams( + activity.getWindowWidth() / 2, + -activity.getToolbarHeight() / 2 + activity.getWindowHeight() / 2 + ) + ) + constraintLayout.addView( + close, ConstraintLayout.LayoutParams( + margin16, + margin16 + ) + ) + constraintLayout.layoutParams = RecyclerView.LayoutParams( + RecyclerView.LayoutParams.WRAP_CONTENT, + RecyclerView.LayoutParams.MATCH_PARENT + ) + val textView = TextView(context) + textView.id = 4 + textView.maxLines = 1 + textView.ellipsize = TextUtils.TruncateAt.END + constraintLayout.addView( + textView, + ConstraintLayout.LayoutParams(0, ConstraintLayout.LayoutParams.WRAP_CONTENT) + ) + val constraintSet = ConstraintSet() + constraintSet.clone(constraintLayout) + constraintSet.connect( + cardView.id, ConstraintSet.TOP, ConstraintSet.PARENT_ID, + ConstraintSet.TOP + ) + constraintSet.connect( + cardView.id, ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, + ConstraintSet.BOTTOM + ) + constraintSet.connect( + cardView.id, ConstraintSet.START, ConstraintSet.PARENT_ID, + ConstraintSet.START, margin16 + ) + constraintSet.connect( + cardView.id, ConstraintSet.END, ConstraintSet.PARENT_ID, + ConstraintSet.END, margin16 + ) + constraintSet.connect(close.id, ConstraintSet.END, cardView.id, ConstraintSet.END) + constraintSet.connect(close.id, ConstraintSet.BOTTOM, cardView.id, ConstraintSet.TOP) + constraintSet.connect( + textView.id, ConstraintSet.BOTTOM, cardView.id, + ConstraintSet.TOP + ) + constraintSet.connect( + textView.id, ConstraintSet.START, cardView.id, + ConstraintSet.START, margin16 / 8 + ) + constraintSet.connect(textView.id, ConstraintSet.END, close.id, ConstraintSet.START) + constraintSet.applyTo(constraintLayout) + return ViewHolder(constraintLayout, contentImage, textView, close) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val webView = webViews[position] + webView.parent?.let { (it as ViewGroup).removeView(webView) } + val webViewTitle = webView.title.fromHtml().toString() + holder.title.text = webViewTitle + holder.close.setOnClickListener { v: View -> listener?.onCloseTab(v, holder.adapterPosition) } + holder.content.setImageBitmap( + getBitmapFromView(webView, activity.getWindowWidth(), activity.getWindowHeight()) + ) + holder.content.setOnClickListener { v: View -> + selected = holder.adapterPosition + listener?.onSelectTab(v, selected) + notifyDataSetChanged() + } + if (webViewTitle != activity.getString(R.string.menu_home)) { + painter.update(holder.content) + } + } + + override fun getItemCount(): Int = webViews.size + + override fun getItemId(position: Int): Long = webViews[position].hashCode().toLong() + + fun setTabClickListener(listener: TabClickListener) { + this.listener = listener + } + + interface TabClickListener { + fun onSelectTab(view: View, position: Int) + fun onCloseTab(view: View, position: Int) + } + + class ViewHolder(view: View, val content: ImageView, val title: TextView, val close: ImageView) : + RecyclerView.ViewHolder(view) + + init { + setHasStableIds(true) + } +}