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
3 changes: 3 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

<queries>
<intent>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ class MainActivity : FlutterActivity() {
fun isPhone(context: Context): Boolean {
val resources = context.resources
val configuration = resources.configuration
val screenWidthDp = configuration.screenWidthDp
return screenWidthDp <= resources.getDimension(R.dimen.min_tablet_width_dp)
val screenWidthDp = configuration.smallestScreenWidthDp
return screenWidthDp <= resources.getInteger(R.integer.min_tablet_width_dp)
}
2 changes: 1 addition & 1 deletion android/app/src/main/res/values/dimens.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
<dimen name="material_small_padding">8dp</dimen>
<dimen name="material_tiny_padding">4dp</dimen>
<dimen name="card_view_corner_radius">2dp</dimen>
<dimen name="min_tablet_width_dp">600dp</dimen>
<integer name="min_tablet_width_dp">600</integer>
</resources>
Binary file added assets/images/logos/Moodle.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@
"tumOnlineDegraded": "TUMonline Services sind derzeit beeinträchtigt!",
"tumOnlineMaintenance": "TUMonline Services werden derzeit gewartet!",
"campus": "Campus",
"moodle": "Moodle",
"studies": "Studium",
"suggested": "Interessante {}",
"more": "Mehr",
Expand Down
1 change: 1 addition & 0 deletions assets/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@
"tumOnlineDegraded": "TUMonline Services are currently degraded!",
"tumOnlineMaintenance": "TUMonline Services are currently under maintenance!",
"campus": "Campus",
"moodle" : "Moodle",
"studies": "Studies",
"suggested": "Suggested {}",
"more": "More",
Expand Down
3 changes: 3 additions & 0 deletions lib/base/enums/shortcut_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ enum ShortcutItemType {
studyRooms(en: "Study Rooms", de: "Lernräume"),
calendar(en: "Calendar", de: "Kalendar"),
studies(en: "Studies", de: "Studium"),
moodle(en: "Moodle", de: "Moodle"),
roomSearch(en: "Room Search", de: "Raumsuche");

final String en;
Expand Down Expand Up @@ -47,6 +48,8 @@ extension Routing on ShortcutItemType {
return routes.calendar;
case ShortcutItemType.studies:
return routes.studies;
case ShortcutItemType.moodle:
return routes.moodle;
case ShortcutItemType.roomSearch:
return routes.roomSearch;
}
Expand Down
8 changes: 8 additions & 0 deletions lib/base/networking/protocols/api.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import 'package:campus_flutter/moodleComponent/model/moodle_course.dart';
import 'package:campus_flutter/moodleComponent/networking/apis/MoodleApi.dart';
import 'package:campus_flutter/moodleComponent/service/shibboleth_session_generator.dart';
import 'package:dio/dio.dart' as dio;

abstract class Api {
static String tumToken = "";
static String tumId = "";
static Future<List<MoodleCourse>>? coursesFuture;
static List<MoodleCourse> courses = [];
static ShibbolethSession? session;
static MoodleApi? moodleApi;

String get domain;

Expand Down
64 changes: 64 additions & 0 deletions lib/base/routing/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@ import 'package:campus_flutter/homeComponent/view/departure/departures_details_v
import 'package:campus_flutter/feedbackComponent/views/feedback_form_view.dart';
import 'package:campus_flutter/feedbackComponent/views/feedback_success_view.dart';
import 'package:campus_flutter/homeComponent/screen/home_screen.dart';
import 'package:campus_flutter/moodleComponent/view/moodle_course_viewmodel.dart';
import 'package:campus_flutter/moodleComponent/view/moodle_viewmodel.dart';
import 'package:campus_flutter/navigaTumComponent/model/navigatum_roomfinder_map.dart';
import 'package:campus_flutter/navigaTumComponent/views/navigatum_room_view.dart';
import 'package:campus_flutter/onboardingComponent/views/confirm_view.dart';
import 'package:campus_flutter/onboardingComponent/views/location_permissions_view.dart';
import 'package:campus_flutter/onboardingComponent/views/login_view.dart';
import 'package:campus_flutter/main.dart';
import 'package:campus_flutter/navigation.dart';
import 'package:campus_flutter/onboardingComponent/views/password_view.dart';
import 'package:campus_flutter/onboardingComponent/views/permission_check_view.dart';
import 'package:campus_flutter/personComponent/views/person_details_view.dart';
import 'package:campus_flutter/placesComponent/model/cafeterias/cafeteria.dart';
Expand All @@ -38,6 +41,7 @@ import 'package:campus_flutter/settingsComponent/views/settings_scaffold.dart';
import 'package:campus_flutter/studiesComponent/model/lecture.dart';
import 'package:campus_flutter/studiesComponent/screen/studies_screen.dart';
import 'package:campus_flutter/studiesComponent/view/lectureDetail/lecture_details_view.dart';
import 'package:flutter/cupertino.dart' show Text;
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';

Expand All @@ -54,6 +58,11 @@ final _router = GoRouter(
builder: (context, state) =>
PermissionCheckView(isSettingsView: (state.extra as bool?) ?? false),
),
GoRoute(
path: safetyArea,
builder: (context, state) =>
PasswordView(),
),
GoRoute(
path: locationPermission,
builder: (context, state) => const LocationPermissionView(),
Expand Down Expand Up @@ -97,6 +106,61 @@ final _router = GoRouter(
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
path: moodle,
pageBuilder: (context, state)

=> const NoTransitionPage(child: MoodleViewModel())
),
GoRoute(
path: "$moodle/viewCourse",
pageBuilder: (context, state) {
final args = state.extra as MoodleCourseArguments?;

if (args == null) {
return const NoTransitionPage(child: Text("Ein Fehler ist aufgetreten"));
}

return NoTransitionPage(
child: MoodleCourseViewModel(
args.session, // 1. Argument
args.api, // 2. Argument
args.course // 3. Argument
)
);
}
),
GoRoute(
path: '/webviewPage',
pageBuilder: (context, state) {
final Map<String, dynamic>? args = state.extra as Map<String, dynamic>?;

if (args == null || args['url'] == null) {
return const NoTransitionPage(child: Text("Ein Fehler ist aufgetreten"));
}

return NoTransitionPage(
child: WebViewPage(
url: args['url'] as String,
// Keine Cookie-Argumente mehr nötig
),
);
},
),

GoRoute(
path: '/pdf-viewer',
builder: (context, state) {

return PdfViewScreen(
stringPathFuture: state.extra as Future<String>,
);
},
),
],
),
StatefulShellBranch(
routes: [
GoRoute(
Expand Down
4 changes: 4 additions & 0 deletions lib/base/routing/routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ const onboarding = "/onboarding";
const confirm = "/confirm";
const locationPermission = "/locationPermission";
const permissionCheck = "/permissionCheck";
const safetyArea = "/safetyArea";

/// Home tab
const home = "/";
Expand Down Expand Up @@ -42,6 +43,9 @@ const search = "/search";
const roomSearch = "/roomSearch";
const personSearch = "/personSearch";

/// Moodle
const moodle = "/moodle";

/// General
const navigaTum = "/navigaTum";
const personDetails = "/personDetails";
Expand Down
29 changes: 21 additions & 8 deletions lib/campusComponent/screen/campus_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,27 @@ class CampusScreen extends StatelessWidget {
if (orientation == Orientation.portrait) {
return body();
} else {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Spacer(),
Expanded(flex: 2, child: body()),
const Spacer(),
],
);
return SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Row(children: [
Expanded(child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(children: [
Text('News', style: Theme.of(context).textTheme.headlineSmall),
const SizedBox(height: 10),
NewsWidgetView(),
],),)),

const VerticalDivider(width: 0),
Expanded(child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(children: [
StudentClubWidgetView(),
const SizedBox(height: 10),
MovieWidgetView(),
],),)), ]
));
}
},
);
Expand Down
43 changes: 36 additions & 7 deletions lib/homeComponent/screen/home_screen.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,34 @@
import 'package:campus_flutter/base/networking/protocols/api.dart';
import 'package:campus_flutter/base/util/padded_divider.dart';
import 'package:campus_flutter/homeComponent/view/contactCard/contact_view.dart';
import 'package:campus_flutter/homeComponent/view/widget/widget_screen.dart';
import 'package:campus_flutter/moodleComponent/model/moodle_course.dart';
import 'package:campus_flutter/moodleComponent/model/moodle_user.dart';
import 'package:campus_flutter/moodleComponent/networking/apis/MoodleApi.dart';
import 'package:campus_flutter/moodleComponent/service/shibboleth_session_generator.dart';
import 'package:campus_flutter/onboardingComponent/viewModels/onboarding_viewmodel.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

Future<List<MoodleCourse>> connectToMoodle(WidgetRef ref) async {
var username = Api.tumId;
var password = await ref.read(onboardingViewModel).getPassword();
ShibbolethSession session = await ShibbolethSessionGenerator().generateSession(username, password).timeout(Duration(seconds: 15), onTimeout: () {
throw WrongTumPasswordSetException();
});
try {
var api = MoodleApi(session);
MoodleUser user = await api.getMoodleUser(username);
Api.courses = await api.getCourses(user);
Api.session = session;
Api.moodleApi = api;
return Api.courses;
}
catch(e) {
throw WrongTumPasswordSetException();
}
}

class HomeScreen extends ConsumerStatefulWidget {
const HomeScreen({super.key});

Expand All @@ -21,13 +46,17 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
if (orientation == Orientation.portrait) {
return _widgetScrollView();
} else {
return Row(
children: [
const Spacer(),
Expanded(flex: 2, child: _widgetScrollView()),
const Spacer(),
],
);
return SizedBox(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Row(children: [
Expanded(child: ContactScreen()),
const VerticalDivider(width: 0),
Expanded(child: SingleChildScrollView(
controller: scrollController,
scrollDirection: Axis.vertical,
child: WidgetScreen(),)), ]
));
}
},
);
Expand Down
4 changes: 4 additions & 0 deletions lib/homeComponent/view/contactCard/contact_card_view.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import 'package:auto_size_text/auto_size_text.dart';
import 'package:campus_flutter/base/enums/device.dart';
import 'package:campus_flutter/base/extensions/base_64_decode_image_data.dart';
import 'package:campus_flutter/base/networking/protocols/api.dart';
import 'package:campus_flutter/base/services/device_type_service.dart';
import 'package:campus_flutter/base/util/delayed_loading_indicator.dart';
import 'package:campus_flutter/homeComponent/screen/home_screen.dart';
import 'package:campus_flutter/homeComponent/view/contactCard/contact_card_loading_view.dart';
import 'package:campus_flutter/navigation_service.dart';
import 'package:campus_flutter/personComponent/model/personDetails/person_details.dart';
Expand Down Expand Up @@ -39,6 +41,8 @@ class _ContactCardViewState extends ConsumerState<ContactCardView> {
stream: ref.watch(profileDetailsViewModel).personDetails,
builder: (context, snapshot) {
if (snapshot.hasData || snapshot.hasError) {
Api.tumId = widget.profile.tumID!;
Api.coursesFuture ??= connectToMoodle(ref);
return InkWell(
onTap: () => NavigationService.openStudentCardSheet(context),
child: contactInfo(snapshot.data, widget.profile),
Expand Down
Loading