3종류의 위젯에서 사용자 중 한 명을 선택하는 기능을 만들어야 하는 공수가 발생했습니다.
세 위젯에서 필요한 데이터는 동일하기에 하나의 Fragment를 재활용하는 방법을 고민했습니다.
동일한 사용자 풀에서 데이터를 가져오면 되기에,
1개의 Configuratuin Activity(또는 fragment)에서 호출한 위젯을 찾아내 Intent를 전달하는 방식으로 구현하고자 합니다.
val appWidgetId: Int = getIntent().extras?.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID
) ?: AppWidgetManager.INVALID_APPWIDGET_ID
var appWidgetManager: AppWidgetManager? =
AppWidgetManager.getInstance(context).apply {
Log.d(getAppWidgetInfo(appWidgetId).provider.shortClassName)
Log.d(getAppWidgetInfo(appWidgetId).provider.className)
Log.d(DetailWidget::class.java.name)
}
저는 Fragment에서 진행했기에, onViewCreated에서 클래스명을 찾기 위한 작업을 진행했습니다.
위처럼 작성하여 로그를 찍어보면, 아래와 같은 로그를 얻을 수 있습니다.
2022-10-20 15:47:13.317 31716-31716/danggai.app.resinwidget E/myLog: (WidgetConfigFragment.kt:54) onViewCreated: danggai.app.presentation.ui.widget.DetailWidget
2022-10-20 15:47:13.318 31716-31716/danggai.app.resinwidget E/myLog: (WidgetConfigFragment.kt:55) onViewCreated: danggai.app.presentation.ui.widget.DetailWidget
2022-10-20 15:47:13.318 31716-31716/danggai.app.resinwidget E/myLog: (WidgetConfigFragment.kt:57) onViewCreated: danggai.app.presentation.ui.widget.DetailWidget
DetailWidget의 Configurate를 위해 호출한 Activity에서,
getAppWidgetInfo(appWidgetId).provider.shortClassName
와 getAppWidgetInfo(appWidgetId).provider.className
이
DetailWidget의 classname과 같은 값을 반환하는 것을 알 수 있습니다.
획득한 class 값을 Activity에 전역변수로 선언한 widgetClassName
에 보관한 뒤,
해당 className를 통해 자신을 호출한 위젯의 클래스를 찾아, 해당 클래스로 broadcast를 전달하였습니다.
var widgetClassName = ""
...
val widgetClass = Class.forName(widgetClassName)
val updateIntent = Intent(context, widgetClass).apply {
action = Constant.ACTION_RESIN_WIDGET_REFRESH_DATA
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
putExtra("data", data)
}
act.sendBroadcast(updateIntent)
val resultValue = Intent().apply {
putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId)
}
act.setResult(Activity.RESULT_OK, resultValue)
act.finish()