Skip to content

Commit e845e52

Browse files
authored
Merge branch 'main' into feat/websocket-impl
2 parents a2767bd + 7eaf8fd commit e845e52

39 files changed

+1060
-627
lines changed

.github/workflows/flutterci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
# - run: flutter format -n --set-exit-if-changed .
3939

4040
# Step 7: Run tests using flutter test
41-
- run: flutter test
41+
# - run: flutter test
4242

4343
# Step 8: Build APK using flutter build apk
4444
- run: flutter build apk

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
.buildlog/
99
.history
1010
.svn/
11+
**/.cxx/
1112

1213
# IntelliJ related
1314
*.iml

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
"editor.tabSize": 4,
1515
"editor.codeActionsOnSave": {
1616
"source.fixAll": "explicit"
17-
}
17+
},
18+
"java.configuration.updateBuildConfiguration": "interactive"
1819
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ This project aims to build an app for Taskwarrior. It is your task management ap
9191
1. Clone the repository from GitHub:
9292

9393
```bash
94-
git clone https://github.com/NishantSinghal19/taskwarrior-flutter.git
94+
git clone https://github.com/CCExtractor/taskwarrior-flutter
9595
```
9696

9797
2. Navigate to the project's root directory:

android/app/build.gradle

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
plugins {
2+
id "com.android.application"
3+
id "kotlin-android"
4+
id "dev.flutter.flutter-gradle-plugin"
5+
}
6+
17
def localProperties = new Properties()
28
def localPropertiesFile = rootProject.file('local.properties')
39
if (localPropertiesFile.exists()) {
@@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) {
612
}
713
}
814

9-
def flutterRoot = localProperties.getProperty('flutter.sdk')
10-
if (flutterRoot == null) {
11-
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12-
}
13-
1415
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
1516
if (flutterVersionCode == null) {
1617
flutterVersionCode = '1'
@@ -21,16 +22,14 @@ if (flutterVersionName == null) {
2122
flutterVersionName = '1.0'
2223
}
2324

24-
apply plugin: 'com.android.application'
25-
apply plugin: 'kotlin-android'
26-
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
2725
def keystoreProperties = new Properties()
2826
def keystorePropertiesFile = rootProject.file('key.properties')
2927
if (keystorePropertiesFile.exists()) {
3028
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
3129
}
3230
android {
33-
compileSdkVersion 34
31+
namespace "com.ccextractor.taskwarriorflutter"
32+
compileSdkVersion 35
3433

3534
// compileSdkVersion flutter.compileSdkVersion
3635

@@ -78,5 +77,5 @@ flutter {
7877
}
7978

8079
dependencies {
81-
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
80+
8281
}

android/app/src/main/AndroidManifest.xml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
<action android:name="es.antonborri.home_widget.action.LAUNCH" />
3737
</intent-filter>
3838
</activity>
39+
3940
<receiver android:name="TaskWarriorWidgetProvider"
4041
android:exported="true">
4142
<intent-filter>
@@ -44,6 +45,22 @@
4445
<meta-data android:name="android.appwidget.provider"
4546
android:resource="@xml/taskwarriorconfig" />
4647
</receiver>
48+
49+
<receiver android:name=".WidgetUpdateReceiver"
50+
android:exported="true">
51+
<intent-filter>
52+
<action android:name="UPDATE_WIDGET" />
53+
</intent-filter>
54+
</receiver>
55+
56+
<receiver android:name=".BurndownChartProvider"
57+
android:exported="true">
58+
<intent-filter>
59+
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
60+
</intent-filter>
61+
<meta-data android:name="android.appwidget.provider"
62+
android:resource="@xml/burndownchartconfig" />
63+
</receiver>
4764

4865
<!-- Used for Background Work -->
4966
<receiver android:name="es.antonborri.home_widget.HomeWidgetBackgroundReceiver"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.ccextractor.taskwarriorflutter
2+
3+
import android.appwidget.AppWidgetManager
4+
import android.content.Context
5+
import android.content.SharedPreferences
6+
import es.antonborri.home_widget.HomeWidgetProvider
7+
8+
class BurndownChartProvider : HomeWidgetProvider() {
9+
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray, widgetData: SharedPreferences) {
10+
// This method is intentionally left blank.
11+
// Widget updates are handled by WidgetUpdateReceiver.
12+
}
13+
}
Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,36 @@
11
package com.ccextractor.taskwarriorflutter
22

3+
import android.content.Intent
4+
import android.os.Bundle
35
import io.flutter.embedding.android.FlutterActivity
6+
import io.flutter.embedding.engine.FlutterEngine
7+
import io.flutter.plugin.common.MethodChannel
8+
import android.content.Context
9+
import android.content.IntentFilter
10+
import android.appwidget.AppWidgetManager
11+
import android.content.ComponentName
412

5-
class MainActivity: FlutterActivity()
13+
class MainActivity: FlutterActivity() {
14+
private val channel = "com.example.taskwarrior/widget"
15+
16+
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
17+
super.configureFlutterEngine(flutterEngine)
18+
19+
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channel).setMethodCallHandler {
20+
call, result ->
21+
if (call.method == "updateWidget") {
22+
updateWidget()
23+
result.success("Widget updated")
24+
} else {
25+
result.notImplemented()
26+
}
27+
}
28+
}
29+
30+
private fun updateWidget() {
31+
val intent = Intent(this, WidgetUpdateReceiver::class.java).apply {
32+
action = "UPDATE_WIDGET"
33+
}
34+
sendBroadcast(intent)
35+
}
36+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.ccextractor.taskwarriorflutter
2+
3+
import android.appwidget.AppWidgetManager
4+
import android.view.View
5+
import android.content.BroadcastReceiver
6+
import android.content.ComponentName
7+
import android.content.Context
8+
import android.content.Intent
9+
import android.graphics.BitmapFactory
10+
import android.util.Log
11+
import android.widget.RemoteViews
12+
import java.io.File
13+
import com.ccextractor.taskwarriorflutter.R
14+
import es.antonborri.home_widget.HomeWidgetPlugin
15+
16+
class WidgetUpdateReceiver : BroadcastReceiver() {
17+
18+
override fun onReceive(context: Context, intent: Intent) {
19+
if (intent.action == "UPDATE_WIDGET") {
20+
Log.d("WidgetUpdateReceiver", "Received UPDATE_WIDGET broadcast")
21+
22+
val appWidgetManager = AppWidgetManager.getInstance(context)
23+
val appWidgetIds = appWidgetManager.getAppWidgetIds(ComponentName(context, BurndownChartProvider::class.java))
24+
25+
for (appWidgetId in appWidgetIds) {
26+
updateAppWidget(context, appWidgetManager, appWidgetId)
27+
}
28+
}
29+
}
30+
31+
private fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int) {
32+
Log.d("WidgetUpdateReceiver", "Updating widget $appWidgetId")
33+
34+
val views = RemoteViews(context.packageName, R.layout.report_layout)
35+
36+
// Retrieve the chart image path from HomeWidget
37+
val chartImage = HomeWidgetPlugin.getData(context).getString("chart_image", null)
38+
39+
if (chartImage != null) {
40+
Log.d("WidgetUpdateReceiver", "Chart image path: $chartImage")
41+
val file = File(chartImage)
42+
if (file.exists()) {
43+
Log.d("WidgetUpdateReceiver", "File exists!")
44+
val b = BitmapFactory.decodeFile(file.absolutePath)
45+
if (b != null) {
46+
Log.d("WidgetUpdateReceiver", "Bitmap decoded successfully!")
47+
views.setImageViewBitmap(R.id.widget_image, b)
48+
views.setViewVisibility(R.id.widget_image, View.VISIBLE)
49+
views.setViewVisibility(R.id.no_image_text, View.GONE)
50+
} else {
51+
Log.e("WidgetUpdateReceiver", "Bitmap decoding failed!")
52+
views.setViewVisibility(R.id.widget_image, View.GONE)
53+
views.setViewVisibility(R.id.no_image_text, View.VISIBLE)
54+
}
55+
} else {
56+
Log.e("WidgetUpdateReceiver", "File does not exist: $chartImage")
57+
views.setViewVisibility(R.id.widget_image, View.GONE)
58+
views.setViewVisibility(R.id.no_image_text, View.VISIBLE)
59+
}
60+
} else {
61+
Log.d("WidgetUpdateReceiver", "No chart image saved yet")
62+
views.setViewVisibility(R.id.widget_image, View.GONE)
63+
views.setViewVisibility(R.id.no_image_text, View.VISIBLE)
64+
}
65+
66+
appWidgetManager.updateAppWidget(appWidgetId, views)
67+
}
68+
}
50.9 KB
Loading

0 commit comments

Comments
 (0)