Commit a30bacd0 authored by Varun Patil's avatar Varun Patil Committed by GitHub

Merge pull request #293 from unstablebrainiac/mess-menu-widget

Init mess menu widget
parents 4ae124bd a617daa3
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="app.insti"> package="app.insti">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...@@ -10,29 +9,38 @@ ...@@ -10,29 +9,38 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera" />
<application <application
android:name=".InstiAppApplication"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher_round" android:icon="@mipmap/ic_launcher_round"
android:label="@string/app_name" android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme">
android:name="app.insti.InstiAppApplication" <receiver android:name=".widget.MessMenuWidget">
android:networkSecurityConfig="@xml/network_security_config"> <intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/mess_menu_widget_info" />
</receiver>
<meta-data <meta-data
android:name="com.google.android.gms.version" android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" /> android:value="@integer/google_play_services_version" />
<meta-data <meta-data
android:name="com.google.android.geo.API_KEY" android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_api_key" /> android:value="@string/google_maps_api_key" />
<uses-library android:name="org.apache.http.legacy" android:required="false" /> <uses-library
android:name="org.apache.http.legacy"
<!-- FCM styling --> android:required="false" /> <!-- FCM styling -->
<meta-data <meta-data
android:name="com.google.firebase.messaging.default_notification_icon" android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_lotusgray" /> android:resource="@drawable/ic_lotusgray" />
...@@ -89,24 +97,36 @@ ...@@ -89,24 +97,36 @@
android:pathPattern="/map/.*" android:pathPattern="/map/.*"
android:scheme="https" /> android:scheme="https" />
</intent-filter> </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="insti.app"
android:pathPattern="/mess"
android:scheme="https" />
</intent-filter>
</activity> </activity>
<activity <activity
android:name=".activity.LoginActivity" android:name=".activity.LoginActivity"
android:screenOrientation="portrait"> android:screenOrientation="portrait">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW"/> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data <data
android:host="insti.app" android:host="insti.app"
android:scheme="instiapp"/> android:scheme="instiapp" />
</intent-filter> </intent-filter>
</activity> </activity>
<service android:name=".InstiAppFirebaseMessagingService"> <service android:name=".InstiAppFirebaseMessagingService">
...@@ -117,18 +137,16 @@ ...@@ -117,18 +137,16 @@
<receiver android:name=".NotificationBroadcastReceiver"> <receiver android:name=".NotificationBroadcastReceiver">
<intent-filter> <intent-filter>
<action android:name="notification_cancelled"/> <action android:name="notification_cancelled" />
</intent-filter> </intent-filter>
</receiver> </receiver>
<meta-data <meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id" android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id" /> android:value="@string/default_notification_channel_id" />
<meta-data <meta-data
android:name="com.google.android.gms.vision.DEPENDENCIES" android:name="com.google.android.gms.vision.DEPENDENCIES"
android:value="barcode" /> android:value="barcode" />
</application> </application>
</manifest> </manifest>
\ No newline at end of file
...@@ -60,6 +60,7 @@ public class Constants { ...@@ -60,6 +60,7 @@ public class Constants {
public static final String DATA_TYPE_NEWS = "newsentry"; public static final String DATA_TYPE_NEWS = "newsentry";
public static final String DATA_TYPE_PT = "blogentry"; public static final String DATA_TYPE_PT = "blogentry";
public static final String DATA_TYPE_MAP= "map"; public static final String DATA_TYPE_MAP= "map";
public static final String DATA_TYPE_MESS = "mess";
public static final String CARD_TYPE_TITLE = "card_type_title"; public static final String CARD_TYPE_TITLE = "card_type_title";
public static final String CARD_TYPE_BODY_HEAD = "card_type_body_head"; public static final String CARD_TYPE_BODY_HEAD = "card_type_body_head";
......
...@@ -47,6 +47,10 @@ public class SessionManager { ...@@ -47,6 +47,10 @@ public class SessionManager {
return pref.getString(Constants.USER_ID, ""); return pref.getString(Constants.USER_ID, "");
} }
public User getCurrentUser() {
return User.fromString(pref.getString(Constants.CURRENT_USER, ""));
}
public String getSessionID() { public String getSessionID() {
return pref.getString(Constants.SESSION_ID, ""); return pref.getString(Constants.SESSION_ID, "");
} }
......
...@@ -295,4 +295,25 @@ public final class Utils { ...@@ -295,4 +295,25 @@ public final class Utils {
} catch (NoSuchFieldException | IllegalAccessException ignored) {} } catch (NoSuchFieldException | IllegalAccessException ignored) {}
return TAG; return TAG;
} }
public static String generateDayString(int day) {
switch (day) {
case 1:
return "Monday";
case 2:
return "Tuesday";
case 3:
return "Wednesday";
case 4:
return "Thursday";
case 5:
return "Friday";
case 6:
return "Saturday";
case 7:
return "Sunday";
default:
throw new IndexOutOfBoundsException("DayIndexOutOfBounds: " + day);
}
}
} }
...@@ -84,6 +84,7 @@ import retrofit2.Response; ...@@ -84,6 +84,7 @@ import retrofit2.Response;
import static app.insti.Constants.DATA_TYPE_BODY; import static app.insti.Constants.DATA_TYPE_BODY;
import static app.insti.Constants.DATA_TYPE_EVENT; import static app.insti.Constants.DATA_TYPE_EVENT;
import static app.insti.Constants.DATA_TYPE_MAP; import static app.insti.Constants.DATA_TYPE_MAP;
import static app.insti.Constants.DATA_TYPE_MESS;
import static app.insti.Constants.DATA_TYPE_NEWS; import static app.insti.Constants.DATA_TYPE_NEWS;
import static app.insti.Constants.DATA_TYPE_PT; import static app.insti.Constants.DATA_TYPE_PT;
import static app.insti.Constants.DATA_TYPE_USER; import static app.insti.Constants.DATA_TYPE_USER;
...@@ -323,7 +324,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -323,7 +324,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
* Open the proper fragment from given type and id * Open the proper fragment from given type and id
*/ */
private void chooseIntent(String type, String id) { private void chooseIntent(String type, String id) {
if (type == null || id == null) { if (type == null || (!type.equals(DATA_TYPE_MESS) && id == null)) {
return; return;
} }
switch (type) { switch (type) {
...@@ -342,6 +343,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -342,6 +343,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
case DATA_TYPE_MAP: case DATA_TYPE_MAP:
updateFragment(MapFragment.newInstance(id)); updateFragment(MapFragment.newInstance(id));
return; return;
case DATA_TYPE_MESS:
updateFragment(new MessMenuFragment());
return;
} }
Log.e("NOTIFICATIONS", "Server sent invalid notification?"); Log.e("NOTIFICATIONS", "Server sent invalid notification?");
} }
...@@ -407,6 +411,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -407,6 +411,8 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
return DATA_TYPE_USER; return DATA_TYPE_USER;
case "map": case "map":
return DATA_TYPE_MAP; return DATA_TYPE_MAP;
case "mess":
return DATA_TYPE_MESS;
} }
} catch (MalformedURLException ignored) {} } catch (MalformedURLException ignored) {}
return null; return null;
...@@ -417,7 +423,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -417,7 +423,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
super.onStart(); super.onStart();
initNavigationView(); initNavigationView();
if (session.isLoggedIn()) { if (session.isLoggedIn()) {
currentUser = User.fromString(session.pref.getString(Constants.CURRENT_USER, "")); currentUser = session.getCurrentUser();
updateNavigationView(); updateNavigationView();
updateFCMId(); updateFCMId();
} }
...@@ -638,6 +644,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -638,6 +644,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
* Change the active fragment to the supplied one * Change the active fragment to the supplied one
*/ */
public void updateFragment(Fragment fragment) { public void updateFragment(Fragment fragment) {
if (session.isLoggedIn() && currentUser == null) {
currentUser = session.getCurrentUser();
}
Bundle bundle = fragment.getArguments(); Bundle bundle = fragment.getArguments();
if (bundle == null) { if (bundle == null) {
bundle = new Bundle(); bundle = new Bundle();
......
...@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView; ...@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView;
import java.util.List; import java.util.List;
import app.insti.R; import app.insti.R;
import app.insti.Utils;
import app.insti.api.model.MessMenu; import app.insti.api.model.MessMenu;
public class MessMenuAdapter extends RecyclerView.Adapter<MessMenuAdapter.ViewHolder> { public class MessMenuAdapter extends RecyclerView.Adapter<MessMenuAdapter.ViewHolder> {
...@@ -36,7 +37,7 @@ public class MessMenuAdapter extends RecyclerView.Adapter<MessMenuAdapter.ViewHo ...@@ -36,7 +37,7 @@ public class MessMenuAdapter extends RecyclerView.Adapter<MessMenuAdapter.ViewHo
@Override @Override
public void onBindViewHolder(@NonNull MessMenuAdapter.ViewHolder holder, int position) { public void onBindViewHolder(@NonNull MessMenuAdapter.ViewHolder holder, int position) {
MessMenu messMenu = messMenus.get(position); MessMenu messMenu = messMenus.get(position);
holder.day.setText(generateDayString(messMenu.getDay())); holder.day.setText(Utils.generateDayString(messMenu.getDay()));
holder.breakfast.setText(messMenu.getBreakfast()); holder.breakfast.setText(messMenu.getBreakfast());
holder.lunch.setText(messMenu.getLunch()); holder.lunch.setText(messMenu.getLunch());
holder.snacks.setText(messMenu.getSnacks()); holder.snacks.setText(messMenu.getSnacks());
...@@ -57,27 +58,6 @@ public class MessMenuAdapter extends RecyclerView.Adapter<MessMenuAdapter.ViewHo ...@@ -57,27 +58,6 @@ public class MessMenuAdapter extends RecyclerView.Adapter<MessMenuAdapter.ViewHo
messMenus = menus; messMenus = menus;
} }
private String generateDayString(int day) {
switch (day) {
case 1:
return "Monday";
case 2:
return "Tuesday";
case 3:
return "Wednesday";
case 4:
return "Thursday";
case 5:
return "Friday";
case 6:
return "Saturday";
case 7:
return "Sunday";
default:
throw new IndexOutOfBoundsException("DayIndexOutOfBounds: " + day);
}
}
public class ViewHolder extends RecyclerView.ViewHolder { public class ViewHolder extends RecyclerView.ViewHolder {
private TextView day; private TextView day;
private TextView breakfast; private TextView breakfast;
......
...@@ -4,7 +4,10 @@ import androidx.annotation.NonNull; ...@@ -4,7 +4,10 @@ import androidx.annotation.NonNull;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List; import java.util.List;
import java.util.Locale;
public class HostelMessMenu { public class HostelMessMenu {
@NonNull() @NonNull()
...@@ -70,4 +73,29 @@ public class HostelMessMenu { ...@@ -70,4 +73,29 @@ public class HostelMessMenu {
public void setMessMenus(List<MessMenu> messMenus) { public void setMessMenus(List<MessMenu> messMenus) {
this.messMenus = messMenus; this.messMenus = messMenus;
} }
public List<MessMenu> getSortedMessMenus() {
List<MessMenu> messMenus = getMessMenus();
/* Sort by day starting today
* This could have been done in a much simpler way with Java 8 :(
* Don't try to fix this */
final List<MessMenu> sortedMenus = new ArrayList<>();
final Calendar calendar = Calendar.getInstance(Locale.UK);
int today = calendar.get(Calendar.DAY_OF_WEEK) - 2;
if (today == -1) {
today = 6;
}
/* Sort by day */
for (int i = 0; i < 7; i++) {
final int day = (today + i) % 7 + 1;
for (MessMenu menu : messMenus) {
if (menu.getDay() == day) {
sortedMenus.add(menu);
}
}
}
return sortedMenus;
}
} }
...@@ -16,9 +16,7 @@ import androidx.recyclerview.widget.RecyclerView; ...@@ -16,9 +16,7 @@ import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.List; import java.util.List;
import java.util.Locale;
import app.insti.Constants; import app.insti.Constants;
import app.insti.R; import app.insti.R;
...@@ -147,27 +145,7 @@ public class MessMenuFragment extends BaseFragment { ...@@ -147,27 +145,7 @@ public class MessMenuFragment extends BaseFragment {
/* Skip if we're already destroyed */ /* Skip if we're already destroyed */
if (getActivity() == null || getView() == null) return; if (getActivity() == null || getView() == null) return;
List<MessMenu> messMenus = hostelMessMenu.getMessMenus(); final List<MessMenu> sortedMenus = hostelMessMenu.getSortedMessMenus();
/* Sort by day starting today
* This could have been done in a much simpler way with Java 8 :(
* Don't try to fix this */
final List<MessMenu> sortedMenus = new ArrayList<>();
final Calendar calendar = Calendar.getInstance(Locale.UK);
int today = calendar.get(Calendar.DAY_OF_WEEK) - 2;
if (today == -1) {
today = 6;
}
/* Sort by day */
for (int i = 0; i < 7; i++) {
final int day = (today + i) % 7 + 1;
for (MessMenu menu : messMenus) {
if (menu.getDay() == day) {
sortedMenus.add(menu);
}
}
}
/* Display */ /* Display */
notifyChange(sortedMenus); notifyChange(sortedMenus);
......
package app.insti.widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.RemoteViews;
import java.util.Calendar;
import java.util.List;
import app.insti.R;
import app.insti.SessionManager;
import app.insti.Utils;
import app.insti.activity.MainActivity;
import app.insti.api.RetrofitInterface;
import app.insti.api.ServiceGenerator;
import app.insti.api.model.HostelMessMenu;
import app.insti.api.model.MessMenu;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Implementation of App Widget functionality.
*/
public class MessMenuWidget extends AppWidgetProvider {
// TODO Remove duplicate code from MessMenuFragment
private RemoteViews views;
private List<HostelMessMenu> instituteMessMenu;
private void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
// Construct the RemoteViews object
views = new RemoteViews(context.getPackageName(), R.layout.mess_menu_widget);
SessionManager sessionManager = new SessionManager(context);
if (sessionManager.isLoggedIn()) {
ServiceGenerator serviceGenerator = new ServiceGenerator(context);
RetrofitInterface retrofitInterface = serviceGenerator.getRetrofitInterface();
retrofitInterface.getInstituteMessMenu(sessionManager.getSessionID()).enqueue(new Callback<List<HostelMessMenu>>() {
@Override
public void onResponse(Call<List<HostelMessMenu>> call, Response<List<HostelMessMenu>> response) {
if (response.isSuccessful()) {
instituteMessMenu = response.body();
displayMenu(sessionManager.getCurrentUser().getHostel());
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
@Override
public void onFailure(Call<List<HostelMessMenu>> call, Throwable t) {
// Network error
}
});
} else {
views.setTextViewText(R.id.meal_text_view, "Login to see your mess menu");
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
private void displayMenu(String hostel) {
HostelMessMenu hostelMessMenu = findMessMenu(instituteMessMenu, hostel);
if (hostelMessMenu != null)
displayMessMenu(hostelMessMenu);
}
private void displayMessMenu(HostelMessMenu hostelMessMenu) {
MessMenu todaysMenu = hostelMessMenu.getSortedMessMenus().get(0);
views.setTextViewText(R.id.day_text_view, Utils.generateDayString(todaysMenu.getDay()));
Calendar calendar = Calendar.getInstance();
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
// TODO: Consider moving to a separate Meal class
String mealType;
String mealTime;
String menu;
if (hourOfDay < 10 || hourOfDay >= 22) {
// breakfast
mealType = "Breakfast";
menu = todaysMenu.getBreakfast();
if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
mealTime = "8am to 10am";
} else {
mealTime = "7:30am to 9:30am";
}
} else if (hourOfDay < 14) {
// lunch
mealType = "Lunch";
menu = todaysMenu.getLunch();
mealTime = "12noon to 2pm";
} else if (hourOfDay < 18) {
// snacks
mealType = "Snacks";
menu = todaysMenu.getSnacks();
mealTime = "4:30pm to 6:15pm";
} else {
// dinner
mealType = "Dinner";
menu = todaysMenu.getDinner();
mealTime = "8pm to 10pm";
}
views.setTextViewText(R.id.meal_name_text_view, mealType);
views.setTextViewText(R.id.meal_time_text_view, mealTime);
views.setTextViewText(R.id.meal_text_view, menu);
}
private HostelMessMenu findMessMenu(List<HostelMessMenu> hostelMessMenus, String hostel) {
for (HostelMessMenu hostelMessMenu : hostelMessMenus) {
if (hostelMessMenu.getShortName().equals(hostel)) {
return hostelMessMenu;
}
}
return null;
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
Intent intent = new Intent(context, MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://insti.app/mess/"));
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.mess_menu_widget, pendingIntent);
}
}
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="4dp" />
<padding
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp" />
</shape>
\ No newline at end of file
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mess_menu_widget"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/round_background"
android:orientation="vertical"
android:padding="@dimen/widget_margin">
<TextView
android:id="@+id/day_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimary"
android:textSize="20sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:orientation="horizontal">
<TextView
android:id="@+id/meal_name_text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="@color/colorGray"
android:textSize="16sp" />
<TextView
android:id="@+id/meal_time_text_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="end"
android:textColor="@color/colorGray"
android:textSize="16sp" />
</LinearLayout>
<TextView
android:id="@+id/meal_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000000" />
</LinearLayout>
...@@ -10,4 +10,7 @@ ...@@ -10,4 +10,7 @@
<dimen name="expanded_card_height">280dp</dimen> <dimen name="expanded_card_height">280dp</dimen>
<dimen name="place_name_text_size">20sp</dimen> <dimen name="place_name_text_size">20sp</dimen>
<dimen name="place_sub_head_text_size">16sp</dimen> <dimen name="place_sub_head_text_size">16sp</dimen>
<!-- Widget -->
<dimen name="widget_margin">16dp</dimen>
</resources> </resources>
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialKeyguardLayout="@layout/mess_menu_widget"
android:initialLayout="@layout/mess_menu_widget"
android:minWidth="250dp"
android:minHeight="110dp"
android:previewImage="@mipmap/ic_launcher_foreground"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="86400000"
android:widgetCategory="home_screen|keyguard" />
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment