Skip to content

Commit

Permalink
plusonelabs#293 Add "Go to Today" button to the Widget's header
Browse files Browse the repository at this point in the history
  • Loading branch information
yvolk committed Aug 29, 2019
1 parent 1b7f2e9 commit 4400dfe
Show file tree
Hide file tree
Showing 20 changed files with 138 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package org.andstatus.todoagenda;

import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;
import android.widget.RemoteViews;

import org.andstatus.todoagenda.prefs.AllSettings;
import org.andstatus.todoagenda.provider.EventProviderType;
Expand Down Expand Up @@ -52,9 +54,33 @@ public void onReceive(Context context, Intent intent) {
case Intent.ACTION_TIMEZONE_CHANGED:
EventAppWidgetProvider.updateWidgetsWithData(context);
break;
case EventAppWidgetProvider.ACTION_GOTO_POSITIONS:
int widgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, 0);
int position1 = intent.getIntExtra(EventAppWidgetProvider.EXTRA_WIDGET_LIST_POSITION1, 0);
int position2 = intent.getIntExtra(EventAppWidgetProvider.EXTRA_WIDGET_LIST_POSITION2, 0);
gotoPosition(context, widgetId, position1);
if (position1 >= 0 && position2 >= 0 && position1 != position2) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
gotoPosition(context, widgetId, position2);
break;
default:
EventAppWidgetProvider.updateEventList(context);
break;
}
}

private void gotoPosition(Context context, int widgetId, int position) {
if (widgetId == 0 || position < 0) return;

AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget);
Log.d("gotoToday", "Scrolling widget " + widgetId + " to position " + position);
rv.setScrollPosition(R.id.event_list, position);
appWidgetManager.updateAppWidget(widgetId, rv);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,13 @@

public class EventAppWidgetProvider extends AppWidgetProvider {

private static final String PACKAGE = EventAppWidgetProvider.class.getPackage().getName();
private static final String PACKAGE = "org.andstatus.todoagenda";
public static final String ACTION_REFRESH = PACKAGE + ".action.REFRESH";
public static final String ACTION_GOTO_POSITIONS = PACKAGE + ".action.GOTO_TODAY";
public static final String EXTRA_WIDGET_LIST_POSITION1 = "widgetListPosition1";
public static final String EXTRA_WIDGET_LIST_POSITION2 = "widgetListPosition2";
public static final int REQUEST_CODE_EMPTY = 1;
public static final int REQUEST_CODE_ADD_EVENT = 3;

public static int[] getWidgetIds(Context context) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
Expand All @@ -60,33 +65,25 @@ public void onUpdate(Context baseContext, AppWidgetManager appWidgetManager, int
InstanceSettings settings = AllSettings.instanceFromId(baseContext, widgetId);
AlarmReceiver.scheduleAlarm(settings.getWidgetHeaderThemeContext());
RemoteViews rv = new RemoteViews(baseContext.getPackageName(), R.layout.widget);
configureBackground(settings, rv);
configureWidgetHeader(settings, rv);
configureList(settings, widgetId, rv);
configureNoEvents(settings, rv);
appWidgetManager.updateAppWidget(widgetId, rv);
}
}

private void configureBackground(InstanceSettings settings, RemoteViews rv) {
private void configureWidgetHeader(InstanceSettings settings, RemoteViews rv) {
if (settings.getShowWidgetHeader()) {
setBackgroundColor(rv, R.id.action_bar, settings.getWidgetHeaderBackgroundColor());
configureCurrentDate(settings, rv);
setActionIcons(settings, rv);
configureAddEvent(settings, rv);
configureRefresh(settings, rv);
configureOverflowMenu(settings, rv);
rv.setViewVisibility(R.id.action_bar, View.VISIBLE);
} else {
rv.setViewVisibility(R.id.action_bar, View.GONE);
}
// int color = settings.getEventsBackgroundColor();
// int opaqueColor = Color.rgb(red(color), green(color), blue(color));
// setColorFilter(rv, R.id.background_image, opaqueColor);
// setAlpha(rv, R.id.background_image, alpha(color));
}

private void configureWidgetHeader(InstanceSettings settings, RemoteViews rv) {
configureCurrentDate(settings, rv);
setActionIcons(settings, rv);
configureAddEvent(settings, rv);
configureRefresh(settings.getContext(), rv);
configureOverflowMenu(settings, rv);
}

private void configureCurrentDate(InstanceSettings settings, RemoteViews rv) {
Expand All @@ -100,6 +97,7 @@ private void configureCurrentDate(InstanceSettings settings, RemoteViews rv) {
}

private void setActionIcons(InstanceSettings settings, RemoteViews rv) {
setImageFromAttr(settings.getWidgetHeaderThemeContext(), rv, R.id.go_to_today, R.attr.header_action_go_to_today);
setImageFromAttr(settings.getWidgetHeaderThemeContext(), rv, R.id.add_event, R.attr.header_action_add_event);
setImageFromAttr(settings.getWidgetHeaderThemeContext(), rv, R.id.refresh, R.attr.header_action_refresh);
setImageFromAttr(settings.getWidgetHeaderThemeContext(), rv, R.id.overflow_menu, R.attr.header_action_overflow);
Expand All @@ -108,6 +106,7 @@ private void setActionIcons(InstanceSettings settings, RemoteViews rv) {
if (themeId == R.style.Theme_Calendar_Dark || themeId == R.style.Theme_Calendar_Light) {
alpha = 154;
}
setAlpha(rv, R.id.go_to_today, alpha);
setAlpha(rv, R.id.add_event, alpha);
setAlpha(rv, R.id.refresh, alpha);
setAlpha(rv, R.id.overflow_menu, alpha);
Expand All @@ -119,38 +118,37 @@ private void configureAddEvent(InstanceSettings settings, RemoteViews rv) {

private PendingIntent getPermittedAddEventPendingIntent(InstanceSettings settings) {
Context context = settings.getContext();
Intent intent = PermissionsUtil.getPermittedIntent(context,
Intent intent = PermissionsUtil.getPermittedActivityIntent(context,
CalendarIntentUtil.createNewEventIntent(settings.getTimeZone()));
return isIntentAvailable(context, intent) ?
PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) :
PendingIntent.getActivity(context, REQUEST_CODE_ADD_EVENT, intent, PendingIntent.FLAG_UPDATE_CURRENT) :
getEmptyPendingIntent(context);
}

private static PendingIntent getEmptyPendingIntent(Context context) {
public static PendingIntent getEmptyPendingIntent(Context context) {
return PendingIntent.getActivity(
context.getApplicationContext(),
0,
REQUEST_CODE_EMPTY,
new Intent(),
PendingIntent.FLAG_UPDATE_CURRENT);
}

private void configureRefresh(Context context, RemoteViews rv) {
Intent intent = new Intent(context, EnvironmentChangedReceiver.class);
private void configureRefresh(InstanceSettings settings, RemoteViews rv) {
Intent intent = new Intent(settings.getContext(), EnvironmentChangedReceiver.class);
intent.setAction(ACTION_REFRESH);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
PendingIntent pendingIntent = PermissionsUtil.getPermittedPendingBroadcastIntent(settings, intent);
rv.setOnClickPendingIntent(R.id.refresh, pendingIntent);
}

private void configureOverflowMenu(InstanceSettings settings, RemoteViews rv) {
Intent intent = MainActivity.intentToConfigure(settings.getContext(), settings.getWidgetId());
PendingIntent menuPendingIntent = PermissionsUtil.getPermittedPendingIntent(settings, intent);
rv.setOnClickPendingIntent(R.id.overflow_menu, menuPendingIntent);
PendingIntent pendingIntent = PermissionsUtil.getPermittedPendingActivityIntent(settings, intent);
rv.setOnClickPendingIntent(R.id.overflow_menu, pendingIntent);
}

private static boolean isIntentAvailable(Context context, Intent intent) {
PackageManager packageManager = context.getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package org.andstatus.todoagenda;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService.RemoteViewsFactory;
Expand All @@ -9,6 +12,7 @@
import org.andstatus.todoagenda.prefs.InstanceSettings;
import org.andstatus.todoagenda.provider.EventProviderType;
import org.andstatus.todoagenda.util.DateUtil;
import org.andstatus.todoagenda.util.PermissionsUtil;
import org.andstatus.todoagenda.widget.DayHeader;
import org.andstatus.todoagenda.widget.DayHeaderVisualizer;
import org.andstatus.todoagenda.widget.WidgetEntry;
Expand Down Expand Up @@ -77,6 +81,22 @@ public void onDataSetChanged() {
widgetEntries = addDayHeaders(getEventEntries());
else
widgetEntries = getEventEntries();

configureGotoToday(getSettings(), getTomorrowsPosition(), getTodaysPosition());
}

private int getTodaysPosition() {
for (int ind = 0; ind < getWidgetEntries().size() - 1; ind++) {
if (!getWidgetEntries().get(ind).isBeforeToday()) return ind;
}
return getWidgetEntries().size() - 1;
}

private int getTomorrowsPosition() {
for (int ind = 0; ind < getWidgetEntries().size() - 1; ind++) {
if (getWidgetEntries().get(ind).isAfterToday()) return ind;
}
return getWidgetEntries().size() > 0 ? 0 : -1;
}

private List<WidgetEntry> getEventEntries() {
Expand Down Expand Up @@ -158,4 +178,26 @@ public boolean hasStableIds() {
return true;
}

private static void configureGotoToday(InstanceSettings settings, int tomorrowsPosition, int todaysPosition) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(settings.getContext());
if (appWidgetManager == null) return;

RemoteViews rv = new RemoteViews(settings.getContext().getPackageName(), R.layout.widget);
int widgetId = settings.getWidgetId();
PendingIntent pendingIntent;
if (todaysPosition < 0) {
pendingIntent = EventAppWidgetProvider.getEmptyPendingIntent(settings.getContext());
} else {
Intent intent = new Intent(settings.getContext().getApplicationContext(), EnvironmentChangedReceiver.class);
intent.setAction(EventAppWidgetProvider.ACTION_GOTO_POSITIONS);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
intent.putExtra(EventAppWidgetProvider.EXTRA_WIDGET_LIST_POSITION1, tomorrowsPosition);
intent.putExtra(EventAppWidgetProvider.EXTRA_WIDGET_LIST_POSITION2, todaysPosition);
pendingIntent = PermissionsUtil.getPermittedPendingBroadcastIntent(settings, intent);
}
rv.setOnClickPendingIntent(R.id.go_to_today, pendingIntent);
Log.d("configureGotoToday", "widgetId:" + widgetId +
", position:" + tomorrowsPosition + " -> " + todaysPosition);
appWidgetManager.updateAppWidget(widgetId, rv);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ public static Intent createOpenCalendarAtDayIntent(DateTime goToTime) {
}

public static PendingIntent createOpenCalendarEventPendingIntent(InstanceSettings settings) {
return PermissionsUtil.getPermittedPendingIntent(settings, createViewIntent());
return PermissionsUtil.getPermittedPendingActivityIntent(settings, createViewIntent());
}

public static PendingIntent createOpenCalendarPendingIntent(InstanceSettings settings) {
return PermissionsUtil.getPermittedPendingIntent(settings,
return PermissionsUtil.getPermittedPendingActivityIntent(settings,
createOpenCalendarAtDayIntent(new DateTime(settings.getTimeZone())));
}

Expand Down
4 changes: 4 additions & 0 deletions app/src/main/java/org/andstatus/todoagenda/util/DateUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ public static boolean isBeforeToday(DateTime date) {
return date.isBefore(DateUtil.now(date.getZone()).withTimeAtStartOfDay());
}

public static boolean isAfterToday(DateTime date) {
return !date.isBefore(DateUtil.now(date.getZone()).withTimeAtStartOfDay().plusDays(1));
}

public static boolean isBeforeNow(DateTime date) {
return date.isBefore(now(date.getZone()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,25 @@ private PermissionsUtil() {
}

@NonNull
public static PendingIntent getPermittedPendingIntent(InstanceSettings settings, Intent intent) {
Intent intentPermitted = getPermittedIntent(settings.getContext(), intent);
public static PendingIntent getPermittedPendingBroadcastIntent(InstanceSettings settings, Intent intent) {
// We need unique request codes for each widget
int requestCode = (intent.getAction() == null ? 1 : intent.getAction().hashCode()) + settings.getWidgetId();
return arePermissionsGranted(settings.getContext())
? PendingIntent.getBroadcast(settings.getContext(), requestCode, intent,
PendingIntent.FLAG_UPDATE_CURRENT)
: PendingIntent.getActivity(settings.getContext(), settings.getWidgetId(),
MainActivity.intentToStartMe(settings.getContext()), PendingIntent.FLAG_UPDATE_CURRENT);
}

@NonNull
public static PendingIntent getPermittedPendingActivityIntent(InstanceSettings settings, Intent intent) {
Intent intentPermitted = getPermittedActivityIntent(settings.getContext(), intent);
return PendingIntent.getActivity(settings.getContext(), settings.getWidgetId(), intentPermitted, PendingIntent
.FLAG_UPDATE_CURRENT);
}

@NonNull
public static Intent getPermittedIntent(@NonNull Context context, @NonNull Intent intent) {
public static Intent getPermittedActivityIntent(@NonNull Context context, @NonNull Intent intent) {
return arePermissionsGranted(context) ? intent : MainActivity.intentToStartMe(context);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,8 @@ public boolean isBeforeToday() {
public boolean isToday() {
return DateUtil.isToday(getStartDate());
}

public boolean isAfterToday() {
return DateUtil.isAfterToday(getStartDate());
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions app/src/main/res/layout/widget.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,18 @@
android:layout_height="wrap_content"
android:layout_weight="1" />

<ImageView
android:id="@+id/go_to_today"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:layout_weight="0"
android:contentDescription="@string/go_to_today"
android:src="@drawable/ic_action_today_light" />

<ImageView
android:id="@+id/add_event"
android:layout_width="wrap_content"
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values-v21/themes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<style name="Theme.Calendar.Black" parent="android:Theme.Holo">
<item name="header">@color/header_current_date_black</item>
<item name="header_action_overflow">@drawable/ic_action_overflow_light</item>
<item name="header_action_go_to_today">@drawable/ic_action_today_light</item>
<item name="header_action_add_event">@drawable/ic_action_add_event_light</item>
<item name="header_action_refresh">@drawable/ic_action_refresh_light</item>
<item name="dayHeaderTitle">@color/day_header_title_black</item>
Expand All @@ -23,6 +24,7 @@
<style name="Theme.Calendar.Dark" parent="android:Theme.Holo">
<item name="header">@color/header_current_date_dark</item>
<item name="header_action_overflow">@drawable/ic_action_overflow_light</item>
<item name="header_action_go_to_today">@drawable/ic_action_today_light</item>
<item name="header_action_add_event">@drawable/ic_action_add_event_light</item>
<item name="header_action_refresh">@drawable/ic_action_refresh_light</item>
<item name="dayHeaderTitle">@color/day_header_title_dark</item>
Expand All @@ -36,6 +38,7 @@
<style name="Theme.Calendar.Light" parent="android:Theme.Holo.Light">
<item name="header">@color/header_current_date_light</item>
<item name="header_action_overflow">@drawable/ic_action_overflow_dark</item>
<item name="header_action_go_to_today">@drawable/ic_action_today_dark</item>
<item name="header_action_add_event">@drawable/ic_action_add_event_dark</item>
<item name="header_action_refresh">@drawable/ic_action_refresh_dark</item>
<item name="dayHeaderTitle">@color/day_header_title_light</item>
Expand All @@ -49,6 +52,7 @@
<style name="Theme.Calendar.White" parent="android:Theme.Holo.Light">
<item name="header">@color/header_current_date_white</item>
<item name="header_action_overflow">@drawable/ic_action_overflow_dark</item>
<item name="header_action_go_to_today">@drawable/ic_action_today_dark</item>
<item name="header_action_add_event">@drawable/ic_action_add_event_dark</item>
<item name="header_action_refresh">@drawable/ic_action_refresh_dark</item>
<item name="dayHeaderTitle">@color/day_header_title_white</item>
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/attrs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

<attr name="header" format="reference|color" />
<attr name="header_action_overflow" format="reference" />
<attr name="header_action_go_to_today" format="reference" />
<attr name="header_action_add_event" format="reference" />
<attr name="header_action_refresh" format="reference" />
<attr name="dayHeaderTitle" format="reference|color" />
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<string name="tomorrow">Tomorrow</string>
<string name="no_upcoming_events">No upcoming events</string>
<string name="open_prefs_desc">Open the settings of the calendar widget</string>
<string name="go_to_today">Go to Today</string>
<string name="add_event_desc">Add new calender event</string>
<string name="indicator_alarm">Indicator if an alarm has been set</string>
<string name="indicator_recurring">Indicator if the event is recurring</string>
Expand Down
Loading

0 comments on commit 4400dfe

Please sign in to comment.