package com.forrestguice.suntimeswidget; /** Copyright (C) 2017 Forrest Guice This file is part of SuntimesWidget. SuntimesWidget is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. SuntimesWidget is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with SuntimesWidget. If not, see <http://www.gnu.org/licenses/>. */ import android.app.AlarmManager; import android.appwidget.AppWidgetManager; import android.content.Context; import android.view.View; import android.widget.RemoteViews; import com.forrestguice.suntimeswidget.calculator.SuntimesEquinoxSolsticeData; import com.forrestguice.suntimeswidget.calculator.SuntimesEquinoxSolsticeDataset; import com.forrestguice.suntimeswidget.layouts.SolsticeLayout; import com.forrestguice.suntimeswidget.layouts.SolsticeLayout_1x1_0; import com.forrestguice.suntimeswidget.settings.AppSettings; import com.forrestguice.suntimeswidget.settings.WidgetSettings; import java.util.Calendar; /** * Flippable widget */ public class SolsticeWidget0 extends SuntimesWidget0 { public static final String SOLSTICE_WIDGET_UPDATE = "suntimes.SOLSTICE_WIDGET_UPDATE"; @Override protected Class getConfigClass() { return SolsticeWidget0ConfigActivity.class; } @Override protected String getUpdateIntentFilter() { return SolsticeWidget0.SOLSTICE_WIDGET_UPDATE; } @Override protected long getUpdateInterval() { return AlarmManager.INTERVAL_HOUR * 3; } @Override protected long getUpdateTimeMillis(Context context, int appWidgetId) { Calendar updateTime = Calendar.getInstance(); updateTime.add(Calendar.SECOND, (int)(getUpdateInterval() / 1000)); return updateTime.getTimeInMillis(); } @Override protected void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { SolsticeWidget0.updateAppWidget(context, appWidgetManager, appWidgetId); } protected static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { SolsticeLayout layout = SolsticeWidget0.getWidgetLayout(context, appWidgetManager, appWidgetId); SolsticeWidget0.updateAppWidget(context, appWidgetManager, appWidgetId, layout); } protected static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, SolsticeLayout layout) { RemoteViews views = layout.getViews(context); boolean showTitle = WidgetSettings.loadShowTitlePref(context, appWidgetId); views.setViewVisibility(R.id.text_title, showTitle ? View.VISIBLE : View.GONE); SuntimesEquinoxSolsticeData data; boolean overrideMode = WidgetSettings.loadTimeMode2OverridePref(context, appWidgetId); if (overrideMode) { SuntimesEquinoxSolsticeDataset dataset = new SuntimesEquinoxSolsticeDataset(context, appWidgetId); dataset.calculateData(); WidgetSettings.TrackingMode trackingMode = WidgetSettings.loadTrackingModePref(context, appWidgetId); SuntimesEquinoxSolsticeData nextEvent = (trackingMode == WidgetSettings.TrackingMode.SOONEST ? dataset.findSoonest(dataset.now()) : dataset.findClosest(dataset.now())); data = (nextEvent != null ? nextEvent : dataset.dataEquinoxSpring); } else { data = new SuntimesEquinoxSolsticeData(context, appWidgetId); data.calculate(); } views.setOnClickPendingIntent(R.id.widgetframe_inner, SuntimesWidget0.clickActionIntent(context, appWidgetId, SolsticeWidget0.class)); layout.prepareForUpdate(data); layout.themeViews(context, views, appWidgetId); layout.updateViews(context, appWidgetId, views, data); appWidgetManager.updateAppWidget(appWidgetId, views); } protected static SolsticeLayout getWidgetLayout(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { //int minWidth = context.getResources().getInteger(R.integer.widget_size_minWidthDp); //int minHeight = context.getResources().getInteger(R.integer.widget_size_minHeightDp); //int[] mustFitWithinDp = {minWidth, minHeight}; //Log.d("getWidgetLayout2", "0: must fit: [" + mustFitWithinDp[0] + ", " + mustFitWithinDp[1] + "]"); /**if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { Bundle widgetOptions = appWidgetManager.getAppWidgetOptions(appWidgetId); int[] sizePortrait = { widgetOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH), // dp values widgetOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT) }; int[] sizeLandscape = { widgetOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH), widgetOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT) }; mustFitWithinDp[0] = Math.min( sizePortrait[0], sizeLandscape[0] ); mustFitWithinDp[1] = Math.min( sizePortrait[1], sizeLandscape[1] ); //Log.d("getWidgetLayout2", "1: must fit: [" + mustFitWithinDp[0] + ", " + mustFitWithinDp[1] + "]"); }*/ SolsticeLayout layout; //if (WidgetSettings.loadAllowResizePref(context, appWidgetId)) //{ /**int minWidth1x3 = context.getResources().getInteger(R.integer.widget_size_minWidthDp1x3); layout = ((mustFitWithinDp[0] >= minWidth1x3) ? new SuntimesLayout_1x3_0() : WidgetSettings.loadSun1x1ModePref_asLayout(context, appWidgetId)); } else { layout = WidgetSettings.loadSun1x1ModePref_asLayout(context, appWidgetId); */ //layout = new SolsticeLayout_1x1_0(); // TODO //} else { layout = new SolsticeLayout_1x1_0(); //} //Log.d("getWidgetLayout2", "layout is: " + layout); return layout; } @Override public void initLocale(Context context) { AppSettings.initLocale(context); SuntimesUtils.initDisplayStrings(context); WidgetSettings.SolsticeEquinoxMode.initDisplayStrings(context); } /** * UpdateInterval * enum interval intended for example *---------------------------------------------------------------------------------------------- * INTERVAL_SLOW .. 1d .. time shown is in years or weeks .. e.g. 1y 2w from now * INTERVAL_NORMAL .. 12h .. time shown is less than a year .. e.g. 14w 5d from now * INTERVAL_FAST .. 15m .. time shown is less than a week .. e.g. 4d 16h from now * INTERVAL_VERYFAST .. 5m .. time shown is less than a day .. e.g. 16h 48m from now * INTERVAL_RAPID .. 1m .. time shown is less than an hour .. e.g. 45m from now * INTERVAL_VERYRAPID .. 5s .. time shown is less than a minute .. e.g. 30s from now */ /**public static enum UpdateInterval { INTERVAL_SLOW( ONE_DAY, -1 ), INTERVAL_NORMAL( HALF_DAY, ONE_YEAR ), INTERVAL_FAST( FIFTEEN_MINUTES, ONE_WEEK ), INTERVAL_VERYFAST( FIVE_MINUTES, ONE_DAY ), INTERVAL_RAPID( ONE_MINUTE, ONE_HOUR ), INTERVAL_VERYRAPID( FIVE_SECONDS, ONE_MINUTE ); public long interval, threshold; private UpdateInterval(long interval, long threshold) { this.interval = interval; this.threshold = threshold; } public static UpdateInterval getInterval(long timeDelta) { if (timeDelta < INTERVAL_VERYRAPID.threshold) { return INTERVAL_VERYRAPID; } else if (timeDelta < INTERVAL_RAPID.threshold) { return INTERVAL_RAPID; } else if (timeDelta < INTERVAL_VERYFAST.threshold) { return INTERVAL_VERYFAST; } else if (timeDelta < INTERVAL_FAST.threshold) { return INTERVAL_FAST; } else if (timeDelta < INTERVAL_NORMAL.threshold) { return INTERVAL_NORMAL; } else { return INTERVAL_SLOW; } } } private static final long ONE_YEAR = 365 * AlarmManager.INTERVAL_DAY; private static final long ONE_WEEK = 7 * AlarmManager.INTERVAL_DAY; private static final long ONE_DAY = AlarmManager.INTERVAL_DAY; private static final long HALF_DAY = AlarmManager.INTERVAL_HALF_DAY; private static final long ONE_HOUR = AlarmManager.INTERVAL_HOUR; private static final long FIFTEEN_MINUTES = AlarmManager.INTERVAL_FIFTEEN_MINUTES; private static final long FIVE_MINUTES = 5 * 60 * 1000; @SuppressWarnings("PointlessArithmeticExpression") private static final long ONE_MINUTE = 1 * 60 * 1000; @SuppressWarnings("PointlessArithmeticExpression") private static final long FIVE_SECONDS = 1 * 5 * 1000;*/ }