From 2c97c0706e559de85a19be0770d536c1794217cd Mon Sep 17 00:00:00 2001 From: Sergej A Date: Fri, 19 Aug 2016 11:16:47 +0200 Subject: [PATCH] Added Widgets --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 27 ++- .../AppWidget.java | 161 ++++++++++++++++++ .../BreakReminder.java | 79 ++++++++- .../example_appwidget_preview.png | Bin 0 -> 3522 bytes app/src/main/res/layout/app_widget2x1.xml | 39 +++++ app/src/main/res/layout/app_widget2x2.xml | 40 +++++ app/src/main/res/layout/app_widget3x3.xml | 40 +++++ app/src/main/res/layout/app_widget4x4.xml | 40 +++++ .../res/layout/content_break_reminder.xml | 2 +- app/src/main/res/values-v14/dimens.xml | 10 ++ app/src/main/res/values/dimens.xml | 6 + app/src/main/res/values/strings.xml | 4 +- app/src/main/res/xml/app_widget2x1_info.xml | 10 ++ app/src/main/res/xml/app_widget2x2_info.xml | 10 ++ app/src/main/res/xml/app_widget3x3_info.xml | 10 ++ app/src/main/res/xml/app_widget4x4_info.xml | 10 ++ 17 files changed, 474 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/orgprivacy_friendly_apps/secuso/privacyfriendlybreakreminder/AppWidget.java create mode 100644 app/src/main/res/drawable-nodpi/example_appwidget_preview.png create mode 100644 app/src/main/res/layout/app_widget2x1.xml create mode 100644 app/src/main/res/layout/app_widget2x2.xml create mode 100644 app/src/main/res/layout/app_widget3x3.xml create mode 100644 app/src/main/res/layout/app_widget4x4.xml create mode 100644 app/src/main/res/values-v14/dimens.xml create mode 100644 app/src/main/res/xml/app_widget2x1_info.xml create mode 100644 app/src/main/res/xml/app_widget2x2_info.xml create mode 100644 app/src/main/res/xml/app_widget3x3_info.xml create mode 100644 app/src/main/res/xml/app_widget4x4_info.xml diff --git a/app/build.gradle b/app/build.gradle index 02a4b1a..3d3965d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "orgprivacy_friendly_apps.secuso.privacyfriendlybreakreminder" - minSdkVersion 15 + minSdkVersion 14 targetSdkVersion 23 versionCode 1 versionName "1.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c3ea625..f70864c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="orgprivacy_friendly_apps.secuso.privacyfriendlybreakreminder"> + - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/orgprivacy_friendly_apps/secuso/privacyfriendlybreakreminder/AppWidget.java b/app/src/main/java/orgprivacy_friendly_apps/secuso/privacyfriendlybreakreminder/AppWidget.java new file mode 100644 index 0000000..2056412 --- /dev/null +++ b/app/src/main/java/orgprivacy_friendly_apps/secuso/privacyfriendlybreakreminder/AppWidget.java @@ -0,0 +1,161 @@ +package orgprivacy_friendly_apps.secuso.privacyfriendlybreakreminder; + +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.provider.Settings; +import android.widget.RemoteViews; + +/** + * Implementation of App Widget functionality. + */ +public class AppWidget extends AppWidgetProvider { + + static String time = ""; + static RemoteViews views = null; + + static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, + int appWidgetId) { + + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + CharSequence widgetText = prefs.getString("name_text", "Help"); + + // Construct the RemoteViews object + if (views == null) + views = new RemoteViews(context.getPackageName(), R.layout.app_widget2x1); + + views.setTextViewText(R.id.appwidget_text, widgetText); + if (time.equals("")) + views.setTextViewText(R.id.time, "00:00"); + else + views.setTextViewText(R.id.time, time); + + + //Open App if clicked + Intent openApp = new Intent(context, BreakReminder.class); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, openApp, 0); + views.setOnClickPendingIntent(R.id.appwidget_text, pendingIntent); + views.setOnClickPendingIntent(R.id.time, pendingIntent); + + // Instruct the widget manager to update the widget + appWidgetManager.updateAppWidget(appWidgetId, views); + } + + @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); + } + } + + @Override + public void onEnabled(Context context) { + // Enter relevant functionality for when the first widget is created + } + + @Override + public void onDisabled(Context context) { + // Enter relevant functionality for when the last widget is disabled + } + + @Override + public void onReceive(Context context, Intent intent) { + + String data = ""; + Bundle getPrevData = intent.getExtras(); + if (getPrevData != null) { + data = getPrevData.getString("time"); + if (data != null) + time = data; + } + super.onReceive(context, intent); + } + + @Override + public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { + + + System.out.println("Minimal width: " + newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH) + " minimal height: " + newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT)); + + // Get min width and height. + int minWidth = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); + int minHeight = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); + + + getRemoteViews(context, minWidth, minHeight); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + CharSequence widgetText = prefs.getString("name_text", "Help"); + views.setTextViewText(R.id.appwidget_text, widgetText); + views.setTextViewText(R.id.time, time); + + //Open App if clicked + Intent openApp = new Intent(context, BreakReminder.class); + PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, openApp, PendingIntent.FLAG_NO_CREATE); + views.setOnClickPendingIntent(R.id.appwidget_text, pendingIntent); + views.setOnClickPendingIntent(R.id.time, pendingIntent); + + + // Obtain appropriate widget and update it. + appWidgetManager.updateAppWidget(appWidgetId, views); + + super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); + } + + private RemoteViews getRemoteViews(Context context, int minWidth, int minHeight) { + // First find out rows and columns based on width provided. + int rows = getCellsForSize(minHeight); + int columns = getCellsForSize(minWidth); + + + int minValue = 0; + if (columns < rows) { + minValue = columns; + } else { + minValue = rows; + } + // Now you changing layout base on you column count + // In this code from 1 column to 4 + // you can make code for more columns on your own. + switch (minValue) { + case 1: + views = new RemoteViews(context.getPackageName(), R.layout.app_widget2x1); + return views; + case 2: + views = new RemoteViews(context.getPackageName(), R.layout.app_widget2x2); + return views; + case 3: + views = new RemoteViews(context.getPackageName(), R.layout.app_widget3x3); + return views; + case 4: + views = new RemoteViews(context.getPackageName(), R.layout.app_widget4x4); + return views; + default: + views = new RemoteViews(context.getPackageName(), R.layout.app_widget2x1); + return views; + } + + + } + + /** + * Returns number of cells needed for given size of the widget. + * + * @param size Widget size in dp. + * @return Size in number of cells. + */ + private static int getCellsForSize(int size) { + int n = 2; + while (70 * n - 30 < size) { + ++n; + } + return n - 1; + } +} + diff --git a/app/src/main/java/orgprivacy_friendly_apps/secuso/privacyfriendlybreakreminder/BreakReminder.java b/app/src/main/java/orgprivacy_friendly_apps/secuso/privacyfriendlybreakreminder/BreakReminder.java index bf328c6..a15ac11 100644 --- a/app/src/main/java/orgprivacy_friendly_apps/secuso/privacyfriendlybreakreminder/BreakReminder.java +++ b/app/src/main/java/orgprivacy_friendly_apps/secuso/privacyfriendlybreakreminder/BreakReminder.java @@ -2,6 +2,8 @@ package orgprivacy_friendly_apps.secuso.privacyfriendlybreakreminder; import android.app.Notification; import android.app.NotificationManager; +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; @@ -38,14 +40,27 @@ public class BreakReminder extends AppCompatActivity private CountDownTimer ct; private String stopTime = ""; private int oldTime = 0; - + private boolean addNewProfile = false; private Spinner profileSpinner; @Override protected void onCreate(Bundle savedInstanceState) { + + SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); + boolean onPause = sharedPrefs.getBoolean("onPause", false); + if (onPause) { + System.out.println("ON PAUSE WAS TRUE!!!!"); + SharedPreferences.Editor editor = sharedPrefs.edit(); + editor.putBoolean("onPause", false); + editor.apply(); + return; + } + super.onCreate(savedInstanceState); + System.out.println("WELCOME TO THE MOTHER FUCKING JUNGLE BIIIIIIIIIIIIIIIIIIIIIIIIIIITCH"); + setContentView(R.layout.activity_break_reminder); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); @@ -59,7 +74,7 @@ public class BreakReminder extends AppCompatActivity NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); + String allProfiles = sharedPrefs.getString("profiles", ""); if (allProfiles.equals("")) { System.out.println("Es gibt noch keine Profile!!"); @@ -157,6 +172,9 @@ public class BreakReminder extends AppCompatActivity bufferZeroMinute = "0"; ct_text.setText(bufferZeroMinute + time / 1000 / 60 + ":00"); + + //FIXME Update Widgets + updateWidgets(bufferZeroMinute + time / 1000 / 60 + ":00"); break; } } @@ -212,11 +230,39 @@ public class BreakReminder extends AppCompatActivity }); } + @Override + public void onPause() { + super.onPause(); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean("onPause", true); + editor.apply(); + System.out.println("IM ON PAUSE BITCH 1111111"); + } + + @Override public void onResume() { super.onResume(); - fillProfiles(); - profileSpinner = (Spinner) findViewById(R.id.spinner); + + //FIXME Add flag if New Profile or Resume + if (addNewProfile) { + fillProfiles(); + profileSpinner = (Spinner) findViewById(R.id.spinner); + addNewProfile = false; + } else { + + } + } + + @Override + public void onStop() { + super.onStop(); + System.out.println("ON PAUSE CALLED!"); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean("onPause", false); + editor.apply(); } @Override @@ -266,7 +312,7 @@ public class BreakReminder extends AppCompatActivity int time = mins * 60 * 1000; //FIXME Hardcoded for testing - stopTime = (String) "00:05";//ct_text.getText(); + stopTime = (String) ct_text.getText(); oldTime = time; if (stopTime == "" && !isRunning) { @@ -319,6 +365,10 @@ public class BreakReminder extends AppCompatActivity ct_text.setText(bufferZeroMinute + (millisUntilFinished / 1000) / 60 + ":" + bufferZeroSecond + millisUntilFinished / 1000 % 60); + //Fixme Update widgets + + updateWidgets(bufferZeroMinute + (millisUntilFinished / 1000) / 60 + ":" + bufferZeroSecond + millisUntilFinished / 1000 % 60); + //Show how much time is left //String timeLeft = bufferZeroMinute + (millisUntilFinished / 1000) / 60 + ":" + bufferZeroSecond + millisUntilFinished / 1000 % 60; //System.out.println("Time left: " + timeLeft); @@ -339,6 +389,9 @@ public class BreakReminder extends AppCompatActivity public void onFinish() { isRunning = false; ct_text.setText("00:00"); + + updateWidgets("00:00"); + //trigger the alarm SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); String ringPref = sharedPrefs.getString("notifications_new_message_ringtone", ""); @@ -409,18 +462,30 @@ public class BreakReminder extends AppCompatActivity } private void createNewProfile() { + addNewProfile = true; Intent intent = new Intent(this, ProfileActivity.class); this.startActivity(intent); } + private void updateWidgets(String time) { + System.out.println("UPDATING THE WIDGET -------"); + Intent intent = new Intent(this, AppWidget.class); + intent.putExtra("time", time); + int ids[] = AppWidgetManager.getInstance(getApplication()).getAppWidgetIds(new ComponentName(this.getApplicationContext(), AppWidget.class)); + System.out.println("Number of WIDGETS : " + ids.length); + intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); + intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); + sendBroadcast(intent); + } + public void startBreak() { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); String allProfiles = sharedPrefs.getString("profiles", ""); String[] profiles = allProfiles.split(";"); String currentProfile = sharedPrefs.getString("name_text", ""); - for (int i = 0; i < profiles.length; i++){ - if(profiles[i].split(",")[0].equals(currentProfile) && profiles[i].split(",")[3].equals("true")){ + for (int i = 0; i < profiles.length; i++) { + if (profiles[i].split(",")[0].equals(currentProfile) && profiles[i].split(",")[3].equals("true")) { Intent intent = new Intent(this, BreakActivity.class); this.startActivity(intent); return; diff --git a/app/src/main/res/drawable-nodpi/example_appwidget_preview.png b/app/src/main/res/drawable-nodpi/example_appwidget_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..894b069a4907d258f60b1b2406b90f5a0fe1c35b GIT binary patch literal 3522 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 + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/app_widget2x2.xml b/app/src/main/res/layout/app_widget2x2.xml new file mode 100644 index 0000000..52c8b26 --- /dev/null +++ b/app/src/main/res/layout/app_widget2x2.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/app_widget3x3.xml b/app/src/main/res/layout/app_widget3x3.xml new file mode 100644 index 0000000..b582182 --- /dev/null +++ b/app/src/main/res/layout/app_widget3x3.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/app_widget4x4.xml b/app/src/main/res/layout/app_widget4x4.xml new file mode 100644 index 0000000..d6a51e3 --- /dev/null +++ b/app/src/main/res/layout/app_widget4x4.xml @@ -0,0 +1,40 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_break_reminder.xml b/app/src/main/res/layout/content_break_reminder.xml index d38e1c1..327aa76 100644 --- a/app/src/main/res/layout/content_break_reminder.xml +++ b/app/src/main/res/layout/content_break_reminder.xml @@ -55,7 +55,7 @@ android:layout_centerHorizontal="true" android:clickable="true" android:enabled="true" - android:text="@string/_30_00" + android:text="@string/break_reminder_time" android:textAppearance="?android:attr/textAppearanceLarge" android:textIsSelectable="false" android:textSize="60sp" diff --git a/app/src/main/res/values-v14/dimens.xml b/app/src/main/res/values-v14/dimens.xml new file mode 100644 index 0000000..4db8c59 --- /dev/null +++ b/app/src/main/res/values-v14/dimens.xml @@ -0,0 +1,10 @@ + + + + + 0dp + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 893c317..404a0ab 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,4 +7,10 @@ 16dp 16dp 8dp + + + 8dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 75e141f..640715c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,7 +38,7 @@ Vibrate Play/Stop Reset - 30:00 + 30:00 Exercise-name Exercise time Repetitions @@ -90,6 +90,8 @@ More Information can be found here: https://www.secuso.org You have to train your chest hard! Eat healthy + EXAMPLE + Add widget diff --git a/app/src/main/res/xml/app_widget2x1_info.xml b/app/src/main/res/xml/app_widget2x1_info.xml new file mode 100644 index 0000000..231cb7d --- /dev/null +++ b/app/src/main/res/xml/app_widget2x1_info.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/app_widget2x2_info.xml b/app/src/main/res/xml/app_widget2x2_info.xml new file mode 100644 index 0000000..7ad9519 --- /dev/null +++ b/app/src/main/res/xml/app_widget2x2_info.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/app_widget3x3_info.xml b/app/src/main/res/xml/app_widget3x3_info.xml new file mode 100644 index 0000000..41b1252 --- /dev/null +++ b/app/src/main/res/xml/app_widget3x3_info.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/app_widget4x4_info.xml b/app/src/main/res/xml/app_widget4x4_info.xml new file mode 100644 index 0000000..4a628a7 --- /dev/null +++ b/app/src/main/res/xml/app_widget4x4_info.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file