mirror of
https://github.com/FossifyOrg/Gallery.git
synced 2024-11-30 08:18:00 +01:00
adding an initial widget implementation
This commit is contained in:
parent
18cd305caf
commit
69b77a296a
8 changed files with 260 additions and 2 deletions
|
@ -215,6 +215,15 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".activities.WidgetConfigureActivity"
|
||||||
|
android:screenOrientation="portrait"
|
||||||
|
android:theme="@style/MyWidgetConfigTheme">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.provider"
|
android:authorities="${applicationId}.provider"
|
||||||
|
@ -233,6 +242,18 @@
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
|
<receiver
|
||||||
|
android:name=".helpers.MyWidgetProvider"
|
||||||
|
android:icon="@mipmap/ic_launcher">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="android.appwidget.provider"
|
||||||
|
android:resource="@xml/widget_info"/>
|
||||||
|
</receiver>
|
||||||
|
|
||||||
<activity-alias
|
<activity-alias
|
||||||
android:name=".activities.SplashActivity.Red"
|
android:name=".activities.SplashActivity.Red"
|
||||||
android:enabled="false"
|
android:enabled="false"
|
||||||
|
|
|
@ -697,8 +697,7 @@ class MediaActivity : SimpleActivity(), MediaOperationsListener {
|
||||||
val pathToCheck = if (mPath.isEmpty()) SHOW_ALL else mPath
|
val pathToCheck = if (mPath.isEmpty()) SHOW_ALL else mPath
|
||||||
val hasSections = config.getFolderGrouping(pathToCheck) and GROUP_BY_NONE == 0 && !config.scrollHorizontally
|
val hasSections = config.getFolderGrouping(pathToCheck) and GROUP_BY_NONE == 0 && !config.scrollHorizontally
|
||||||
val sectionTitleHeight = if (hasSections) layoutManager.getChildAt(0)?.height ?: 0 else 0
|
val sectionTitleHeight = if (hasSections) layoutManager.getChildAt(0)?.height ?: 0 else 0
|
||||||
val thumbnailHeight = if (hasSections) layoutManager.getChildAt(1)?.height ?: 0 else layoutManager.getChildAt(0)?.height
|
val thumbnailHeight = if (hasSections) layoutManager.getChildAt(1)?.height ?: 0 else layoutManager.getChildAt(0)?.height ?: 0
|
||||||
?: 0
|
|
||||||
|
|
||||||
var fullHeight = 0
|
var fullHeight = 0
|
||||||
var curSectionItems = 0
|
var curSectionItems = 0
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
package com.simplemobiletools.gallery.pro.activities
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.appwidget.AppWidgetManager
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.widget.RemoteViews
|
||||||
|
import com.simplemobiletools.commons.dialogs.ColorPickerDialog
|
||||||
|
import com.simplemobiletools.commons.extensions.adjustAlpha
|
||||||
|
import com.simplemobiletools.commons.extensions.onSeekBarChangeListener
|
||||||
|
import com.simplemobiletools.commons.extensions.setBackgroundColor
|
||||||
|
import com.simplemobiletools.commons.extensions.setFillWithStroke
|
||||||
|
import com.simplemobiletools.gallery.pro.R
|
||||||
|
import com.simplemobiletools.gallery.pro.extensions.config
|
||||||
|
import com.simplemobiletools.gallery.pro.extensions.widgetsDB
|
||||||
|
import com.simplemobiletools.gallery.pro.helpers.MyWidgetProvider
|
||||||
|
import com.simplemobiletools.gallery.pro.models.Widget
|
||||||
|
import kotlinx.android.synthetic.main.widget_config.*
|
||||||
|
|
||||||
|
class WidgetConfigureActivity : SimpleActivity() {
|
||||||
|
private var mBgAlpha = 0f
|
||||||
|
private var mWidgetId = 0
|
||||||
|
private var mBgColor = 0
|
||||||
|
private var mBgColorWithoutTransparency = 0
|
||||||
|
|
||||||
|
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
useDynamicTheme = false
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setResult(RESULT_CANCELED)
|
||||||
|
setContentView(R.layout.widget_config)
|
||||||
|
initVariables()
|
||||||
|
|
||||||
|
mWidgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: AppWidgetManager.INVALID_APPWIDGET_ID
|
||||||
|
|
||||||
|
if (mWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
config_save.setOnClickListener { saveConfig() }
|
||||||
|
config_bg_color.setOnClickListener { pickBackgroundColor() }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initVariables() {
|
||||||
|
mBgColor = config.widgetBgColor
|
||||||
|
if (mBgColor == 1) {
|
||||||
|
mBgColor = Color.BLACK
|
||||||
|
mBgAlpha = .2f
|
||||||
|
} else {
|
||||||
|
mBgAlpha = Color.alpha(mBgColor) / 255f
|
||||||
|
}
|
||||||
|
|
||||||
|
mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor))
|
||||||
|
config_bg_seekbar.apply {
|
||||||
|
progress = (mBgAlpha * 100).toInt()
|
||||||
|
|
||||||
|
onSeekBarChangeListener {
|
||||||
|
mBgAlpha = it / 100f
|
||||||
|
updateBackgroundColor()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
updateBackgroundColor()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun saveConfig() {
|
||||||
|
val views = RemoteViews(packageName, R.layout.widget)
|
||||||
|
views.setBackgroundColor(R.id.widget_holder, mBgColor)
|
||||||
|
AppWidgetManager.getInstance(this).updateAppWidget(mWidgetId, views)
|
||||||
|
val widget = Widget(null, mWidgetId, "/storage/emulated/0")
|
||||||
|
Thread {
|
||||||
|
widgetsDB.insertOrUpdate(widget)
|
||||||
|
}.start()
|
||||||
|
|
||||||
|
storeWidgetBackground()
|
||||||
|
requestWidgetUpdate()
|
||||||
|
|
||||||
|
Intent().apply {
|
||||||
|
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId)
|
||||||
|
setResult(Activity.RESULT_OK, this)
|
||||||
|
}
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun storeWidgetBackground() {
|
||||||
|
config.apply {
|
||||||
|
widgetBgColor = mBgColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun requestWidgetUpdate() {
|
||||||
|
Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetProvider::class.java).apply {
|
||||||
|
putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId))
|
||||||
|
sendBroadcast(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateBackgroundColor() {
|
||||||
|
mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha)
|
||||||
|
config_save.setBackgroundColor(mBgColor)
|
||||||
|
config_image_holder.setBackgroundColor(mBgColor)
|
||||||
|
config_bg_color.setFillWithStroke(mBgColor, Color.BLACK)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun pickBackgroundColor() {
|
||||||
|
ColorPickerDialog(this, mBgColorWithoutTransparency) { wasPositivePressed, color ->
|
||||||
|
if (wasPositivePressed) {
|
||||||
|
mBgColorWithoutTransparency = color
|
||||||
|
updateBackgroundColor()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,6 +25,7 @@ import com.simplemobiletools.gallery.pro.databases.GalleryDatabase
|
||||||
import com.simplemobiletools.gallery.pro.helpers.*
|
import com.simplemobiletools.gallery.pro.helpers.*
|
||||||
import com.simplemobiletools.gallery.pro.interfaces.DirectoryDao
|
import com.simplemobiletools.gallery.pro.interfaces.DirectoryDao
|
||||||
import com.simplemobiletools.gallery.pro.interfaces.MediumDao
|
import com.simplemobiletools.gallery.pro.interfaces.MediumDao
|
||||||
|
import com.simplemobiletools.gallery.pro.interfaces.WidgetsDao
|
||||||
import com.simplemobiletools.gallery.pro.models.Directory
|
import com.simplemobiletools.gallery.pro.models.Directory
|
||||||
import com.simplemobiletools.gallery.pro.models.Medium
|
import com.simplemobiletools.gallery.pro.models.Medium
|
||||||
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
|
import com.simplemobiletools.gallery.pro.models.ThumbnailItem
|
||||||
|
@ -104,6 +105,8 @@ val Context.config: Config get() = Config.newInstance(applicationContext)
|
||||||
|
|
||||||
val Context.galleryDB: GalleryDatabase get() = GalleryDatabase.getInstance(applicationContext)
|
val Context.galleryDB: GalleryDatabase get() = GalleryDatabase.getInstance(applicationContext)
|
||||||
|
|
||||||
|
val Context.widgetsDB: WidgetsDao get() = GalleryDatabase.getInstance(applicationContext).WidgetsDao()
|
||||||
|
|
||||||
val Context.recycleBin: File get() = filesDir
|
val Context.recycleBin: File get() = filesDir
|
||||||
|
|
||||||
val Context.recycleBinPath: String get() = filesDir.absolutePath
|
val Context.recycleBinPath: String get() = filesDir.absolutePath
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.simplemobiletools.gallery.pro.helpers
|
||||||
|
|
||||||
|
import android.app.PendingIntent
|
||||||
|
import android.appwidget.AppWidgetManager
|
||||||
|
import android.appwidget.AppWidgetProvider
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.widget.RemoteViews
|
||||||
|
import com.simplemobiletools.commons.extensions.setBackgroundColor
|
||||||
|
import com.simplemobiletools.gallery.pro.R
|
||||||
|
import com.simplemobiletools.gallery.pro.activities.MediaActivity
|
||||||
|
import com.simplemobiletools.gallery.pro.extensions.config
|
||||||
|
import com.simplemobiletools.gallery.pro.extensions.widgetsDB
|
||||||
|
import com.simplemobiletools.gallery.pro.models.Widget
|
||||||
|
|
||||||
|
class MyWidgetProvider : AppWidgetProvider() {
|
||||||
|
private fun setupAppOpenIntent(context: Context, views: RemoteViews, id: Int, widget: Widget) {
|
||||||
|
val intent = Intent(context, MediaActivity::class.java).apply {
|
||||||
|
putExtra(DIRECTORY, widget.folderPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
val pendingIntent = PendingIntent.getActivity(context, widget.widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT)
|
||||||
|
views.setOnClickPendingIntent(id, pendingIntent)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
|
||||||
|
super.onUpdate(context, appWidgetManager, appWidgetIds)
|
||||||
|
Thread {
|
||||||
|
context.widgetsDB.getWidgets().forEach {
|
||||||
|
val views = RemoteViews(context.packageName, R.layout.widget)
|
||||||
|
views.setBackgroundColor(R.id.widget_holder, context.config.widgetBgColor)
|
||||||
|
setupAppOpenIntent(context, views, R.id.widget_holder, it)
|
||||||
|
appWidgetManager.updateAppWidget(it.widgetId, views)
|
||||||
|
}
|
||||||
|
}.start()
|
||||||
|
}
|
||||||
|
}
|
14
app/src/main/res/layout/widget.xml
Normal file
14
app/src/main/res/layout/widget.xml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/widget_holder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/widget_imageview"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:src="@mipmap/ic_launcher"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
62
app/src/main/res/layout/widget_config.xml
Normal file
62
app/src/main/res/layout/widget_config.xml
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/config_holder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_margin="@dimen/activity_margin">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/config_image_holder"
|
||||||
|
android:layout_width="110dp"
|
||||||
|
android:layout_height="110dp"
|
||||||
|
android:padding="@dimen/activity_margin">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/config_image"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/config_bg_color"
|
||||||
|
android:layout_width="@dimen/widget_colorpicker_size"
|
||||||
|
android:layout_height="@dimen/widget_colorpicker_size"
|
||||||
|
android:layout_above="@+id/config_save"/>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/config_bg_seekbar_holder"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_alignTop="@+id/config_bg_color"
|
||||||
|
android:layout_alignBottom="@+id/config_bg_color"
|
||||||
|
android:layout_toEndOf="@+id/config_bg_color"
|
||||||
|
android:layout_toRightOf="@+id/config_bg_color"
|
||||||
|
android:background="@android:color/white">
|
||||||
|
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/config_bg_seekbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:paddingLeft="@dimen/activity_margin"
|
||||||
|
android:paddingRight="@dimen/activity_margin"/>
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/config_save"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="@dimen/widget_colorpicker_size"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:fontFamily="sans-serif-light"
|
||||||
|
android:paddingLeft="@dimen/activity_margin"
|
||||||
|
android:paddingRight="@dimen/activity_margin"
|
||||||
|
android:text="@string/ok"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="@dimen/big_text_size"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
10
app/src/main/res/xml/widget_info.xml
Normal file
10
app/src/main/res/xml/widget_info.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<appwidget-provider
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:configure="com.simplemobiletools.gallery.pro.activities.WidgetConfigureActivity"
|
||||||
|
android:initialLayout="@layout/widget"
|
||||||
|
android:minWidth="40dp"
|
||||||
|
android:minHeight="40dp"
|
||||||
|
android:minResizeWidth="40dp"
|
||||||
|
android:minResizeHeight="40dp"
|
||||||
|
android:resizeMode="horizontal|vertical"/>
|
Loading…
Reference in a new issue