Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,20 @@
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<receiver
android:name=".WeeklyWidgetProvider"
android:exported="true">
<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>
</application>


<!-- Required to query activities that can process text, see:
https://developer.android.com/training/package-visibility and
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
Expand Down
33 changes: 33 additions & 0 deletions android/app/src/main/kotlin/com/example/WeeklyWidegtProvider.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.example.vector

import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.widget.RemoteViews
import es.antonborri.home_widget.HomeWidgetPlugin

class WeeklyWidgetProvider : AppWidgetProvider() {

override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {

val widgetData = HomeWidgetPlugin.getData(context)

val steps = widgetData.getString("steps", "0")
val rank = widgetData.getString("rank", "0")
val distance = widgetData.getString("distance", "0")

val views = RemoteViews(context.packageName, R.layout.home_widget)

views.setTextViewText(R.id.steps, "Steps: $steps")
views.setTextViewText(R.id.rank, "Rank: #$rank")
views.setTextViewText(R.id.distance, "Distance: $distance km")

appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
}
9 changes: 9 additions & 0 deletions android/app/src/main/res/drawable-v21/widget_bg.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">

<solid android:color="#FFFFFF"/>

<corners android:radius="12dp"/>

</shape>
36 changes: 36 additions & 0 deletions android/app/src/main/res/layout/home_widget.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:padding="16dp"
android:background="@drawable/widget_bg"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:id="@+id/title"
android:text="🏆 Weekly Progress"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="@android:color/white" />

<TextView
android:id="@+id/steps"
android:text="Steps: 2000"
android:textSize="22sp"
android:textStyle="bold"
android:textColor="@android:color/white"
android:paddingTop="12dp"/>

<TextView
android:id="@+id/rank"
android:text="Rank: #12"
android:textColor="@android:color/white"
android:paddingTop="6dp"/>

<TextView
android:id="@+id/distance"
android:text="Distance: 18 km"
android:textColor="@android:color/white"
android:paddingTop="6dp"/>

</LinearLayout>
8 changes: 8 additions & 0 deletions android/app/src/main/res/xml/widget_info.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="250dp"
android:minHeight="120dp"
android:updatePeriodMillis="1800000"
android:initialLayout="@layout/home_widget"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen"/>
1 change: 1 addition & 0 deletions android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
org.gradle.java.home=C:/Program Files/Android/Android Studio/jbr
3 changes: 3 additions & 0 deletions assets/icons/Page_1.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/icons/SVGRepo_iconCarrier.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/icons/Vector.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions assets/icons/primary.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions devtools_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:
8 changes: 6 additions & 2 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'package:vector/shourya';

import 'package:firebase_core/firebase_core.dart';

import 'package:vector/view_models/home_view_model.dart';
import 'package:vector/view_models/onboarding_view_model.dart';
import 'package:vector/core/utils/firebase_test_util.dart';
import 'package:vector/views/welcome.dart';
import 'package:vector/views/welcome.dart' as views;

void main() async {
WidgetsFlutterBinding.ensureInitialized();
Expand Down Expand Up @@ -37,7 +40,8 @@ class MyApp extends StatelessWidget {
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const WelcomePage(),

home: views.WelcomePage(),
),
);
}
Expand Down
91 changes: 91 additions & 0 deletions lib/shourya
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import 'package:flutter/material.dart';
import 'package:vector/views/BottomNav.dart';


class WelcomePage extends StatelessWidget {
const WelcomePage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFF0B0B0F),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24),
child: Column(
children: [
const Spacer(),


Image.asset(
'assets/Group_111.png',
height: MediaQuery.of(context).size.height * 0.35,
),

const SizedBox(height: 32),


const Text(
'Energize your lives with',
style: TextStyle(
color: Color(0xFFF5F5F5),
fontSize: 18,
),
),

const SizedBox(height: 8),

const Text(
'Vector!',
style: TextStyle(
color: Color(0xFFEE94FE),
fontSize: 28,
fontWeight: FontWeight.bold,
),
),

const Spacer(),


SizedBox(
width: double.infinity,
height: 52,
child: ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF693298),
elevation: 6,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(26),
),
),
child: const Text(
'Get Started',
style: TextStyle(
fontSize: 18,
color: Color(0xFFFFFFFF),
),
),
),
),

const SizedBox(height: 16),

const Text(
'Join us for a better lifestyle!',
style: TextStyle(
color: Colors.white70,
fontSize: 14,
),
),

const SizedBox(height: 24),
],
),
),
),
bottomNavigationBar: CustomBottomNav(),

);
}
}
82 changes: 82 additions & 0 deletions lib/views/BottomNav.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

class CustomBottomNav extends StatefulWidget {
const CustomBottomNav({super.key});

@override
State<CustomBottomNav> createState() => _CustomBottomNavState();
}

class _CustomBottomNavState extends State<CustomBottomNav> {
int selectedIndex = 0;

final icons = [
'assets/icons/Vector.svg',
'assets/icons/primary.svg',
'assets/icons/SVGRepo_iconCarrier.svg',
'assets/icons/Page_1.svg',
];

@override
Widget build(BuildContext context) {
return SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
child: Container(
height: 48,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(40),
boxShadow: [
BoxShadow(
color: Colors.black,
blurRadius: 20,
offset: const Offset(0, 6),
),
],
),
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: List.generate(icons.length, (index) {
final isActive = index == selectedIndex;

return GestureDetector(
onTap: () {
setState(() => selectedIndex = index);
},
child: SizedBox(
width: 40,
child: Center(
child: Container(
width: isActive ? 40 : 22,
height: isActive ? 36 : 22,
decoration: BoxDecoration(
color: isActive
? const Color(0xFF7527AC)
: Colors.transparent,
shape: BoxShape.circle,
),
child: Center(
child: SvgPicture.asset(
icons[index],
width: 20,
height: 20,
colorFilter: ColorFilter.mode(
isActive ? Colors.white : Colors.black,
BlendMode.srcIn,
),
),
),
),
),
),
);
}),
),
),
),
);
}
}
Loading