diff --git a/app/build.gradle b/app/build.gradle index 512012e..e42095a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,7 +17,7 @@ android { applicationId "com.tommasoberlose.anotherwidget" minSdkVersion 19 targetSdkVersion 26 - versionCode 25 + versionCode 27 versionName "1.3" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/app/release/output.json b/app/release/output.json index 64f65bc..e921328 100644 --- a/app/release/output.json +++ b/app/release/output.json @@ -1 +1 @@ -[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":24},"path":"app-release.apk","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"19"}}] \ No newline at end of file +[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":27},"path":"app-release.apk","properties":{"packageId":"com.tommasoberlose.anotherwidget","split":"","minSdkVersion":"19"}}] \ No newline at end of file diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/UpdatesReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/UpdatesReceiver.kt index 054e0e6..bc6d26c 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/UpdatesReceiver.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/receiver/UpdatesReceiver.kt @@ -7,6 +7,7 @@ import android.content.Intent import android.app.AlarmManager import android.app.PendingIntent import android.icu.text.LocaleDisplayNames +import android.os.Build import android.preference.PreferenceManager import android.util.Log import com.tommasoberlose.anotherwidget.`object`.Constants @@ -39,8 +40,12 @@ class UpdatesReceiver : BroadcastReceiver() { fun setUpdates(context: Context) { CalendarUtil.updateEventList(context) removeUpdates(context) - context.startService(Intent(context, CrocodileService::class.java)) - /* + /*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(Intent(context, CrocodileService::class.java)) + } else { + context.startService(Intent(context, CrocodileService::class.java)) + }*/ + val now = Calendar.getInstance() now.set(Calendar.MILLISECOND, 0) now.set(Calendar.SECOND, 0) @@ -49,7 +54,7 @@ class UpdatesReceiver : BroadcastReceiver() { val i = Intent(context, UpdatesReceiver::class.java) i.action = Constants.ACTION_TIME_UPDATE val pi = PendingIntent.getBroadcast(context, 0, i, 0) - am.setRepeating(AlarmManager.RTC_WAKEUP, now.timeInMillis, (1000 * 60).toLong(), pi) */ + am.setRepeating(AlarmManager.RTC_WAKEUP, now.timeInMillis, (1000 * 60).toLong(), pi) } fun removeUpdates(context: Context) { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt index 05fdd94..4ff744e 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/MainActivity.kt @@ -23,6 +23,7 @@ import android.content.BroadcastReceiver import com.tommasoberlose.anotherwidget.util.CalendarUtil import com.tommasoberlose.anotherwidget.util.WeatherUtil import android.content.DialogInterface +import android.content.res.Resources import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.Drawable @@ -180,7 +181,18 @@ class MainActivity : AppCompatActivity() { updateSettings() updateAppWidget() updateClockView() - widget_bitmap.setImageBitmap(Util.getBitmapFromView(main_layout)) + + val SP = PreferenceManager.getDefaultSharedPreferences(this) + val displayMetrics = Resources.getSystem().displayMetrics + var height = Util.convertDpToPixel(120f, this).toInt() + if (SP.getBoolean(Constants.PREF_SHOW_CLOCK, false)) { + height += Util.convertSpToPixels(SP.getFloat(Constants.PREF_TEXT_CLOCK_SIZE, 90f), this).toInt() + Util.convertDpToPixel(8f, this).toInt() + } + if (SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f) + SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) > 50) { + height += Util.convertDpToPixel(24f, this).toInt() + } + widget_bitmap.setImageBitmap(Util.getBitmapFromView(main_layout, displayMetrics.widthPixels, height - Util.convertDpToPixel(32f, this).toInt())) + widget.layoutParams.height = height + Util.convertDpToPixel(16f, this).toInt() } @@ -349,8 +361,14 @@ class MainActivity : AppCompatActivity() { calendar_temp.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f)) time.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_CLOCK_SIZE, 90f)) - second_row_icon.scaleX = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 16f - second_row_icon.scaleY = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 16f + second_row_icon.scaleX = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 18f + second_row_icon.scaleY = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 18f + + weather_icon.scaleX = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 20f + weather_icon.scaleY = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 20f + + empty_weather_icon.scaleX = SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f) / 24f + empty_weather_icon.scaleY = SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f) / 24f multiple_events.scaleX = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 16f multiple_events.scaleY = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 16f diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/SupportDevActivity.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/SupportDevActivity.kt index 39a9066..c832173 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/SupportDevActivity.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/activity/SupportDevActivity.kt @@ -41,29 +41,49 @@ class SupportDevActivity : AppCompatActivity(), BillingProcessor.IBillingHandler val lunch = bp!!.getPurchaseListingDetails("donation_lunch") val dinner = bp!!.getPurchaseListingDetails("donation_dinner") - import_donation_coffee.text = coffee.priceText - action_donation_coffee.setOnClickListener { - bp!!.purchase(this, "donation_coffee") + if (coffee != null) { + import_donation_coffee.text = coffee.priceText + action_donation_coffee.setOnClickListener { + bp!!.purchase(this, "donation_coffee") + } + } else { + action_donation_coffee.visibility = View.GONE } - import_donation_donuts.text = donuts.priceText - action_donation_donuts.setOnClickListener { - bp!!.purchase(this, "donation_donuts") + if (donuts != null) { + import_donation_donuts.text = donuts.priceText + action_donation_donuts.setOnClickListener { + bp!!.purchase(this, "donation_donuts") + } + } else { + action_donation_donuts.visibility = View.GONE } - import_donation_breakfast.text = breakfast.priceText - action_donation_breakfast.setOnClickListener { - bp!!.purchase(this, "donation_breakfast") + if (breakfast != null) { + import_donation_breakfast.text = breakfast.priceText + action_donation_breakfast.setOnClickListener { + bp!!.purchase(this, "donation_breakfast") + } + } else { + action_donation_breakfast.visibility = View.GONE } - import_donation_lunch.text = lunch.priceText - action_donation_lunch.setOnClickListener { - bp!!.purchase(this, "donation_lunch") + if (lunch != null) { + import_donation_lunch.text = lunch.priceText + action_donation_lunch.setOnClickListener { + bp!!.purchase(this, "donation_lunch") + } + } else { + action_donation_lunch.visibility = View.GONE } - import_donation_dinner.text = dinner.priceText - action_donation_dinner.setOnClickListener { - bp!!.purchase(this, "donation_dinner") + if (dinner != null) { + import_donation_dinner.text = dinner.priceText + action_donation_dinner.setOnClickListener { + bp!!.purchase(this, "donation_dinner") + } + } else { + action_donation_dinner.visibility = View.GONE } products_list.visibility = View.VISIBLE diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt index 67d0b34..9b72f48 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/ui/widget/TheWidget.kt @@ -44,9 +44,11 @@ import android.text.style.RelativeSizeSpan import android.text.style.StyleSpan import android.util.DisplayMetrics import android.util.TypedValue +import android.widget.LinearLayout import com.tommasoberlose.anotherwidget.ui.view.CustomTypefaceSpan import kotlinx.android.synthetic.main.the_widget.* import kotlinx.android.synthetic.main.the_widget.view.* +import kotlinx.android.synthetic.main.the_widget_sans.view.* /** @@ -85,11 +87,17 @@ class TheWidget : AppWidgetProvider() { val SP = PreferenceManager.getDefaultSharedPreferences(context) val displayMetrics = Resources.getSystem().displayMetrics val widgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId) - var height = widgetInfo.minHeight + var height = Util.convertDpToPixel(80f, context).toInt() + val width = displayMetrics.widthPixels + if (widgetInfo != null) { + height = widgetInfo.minHeight + } if (SP.getBoolean(Constants.PREF_SHOW_CLOCK, false)) { height += Util.convertSpToPixels(SP.getFloat(Constants.PREF_TEXT_CLOCK_SIZE, 90f), context).toInt() + Util.convertDpToPixel(8f, context).toInt() } - val width = displayMetrics.widthPixels + if (SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f) > 30 && SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) > 22) { + height += Util.convertDpToPixel(24f, context).toInt() + } generateWidgetView(context, appWidgetId, appWidgetManager, width - Util.convertDpToPixel(16f, context).toInt(), height) } @@ -228,7 +236,13 @@ class TheWidget : AppWidgetProvider() { } else { views.setTextViewText(R.id.next_event_date, dateStringValue) } - views.setOnClickPendingIntent(R.id.next_event_date, pIntent) + + if (SP.getBoolean(Constants.PREF_SHOW_NEXT_EVENT, false) && CalendarUtil.getEventsCount(context) > 1) { + val multipleIntent = PendingIntent.getBroadcast(context, widgetID, Intent(Constants.ACTION_GO_TO_NEXT_EVENT), 0) + views.setOnClickPendingIntent(R.id.next_event_date, multipleIntent) + } else { + views.setOnClickPendingIntent(R.id.next_event_date, pIntent) + } } views.setViewVisibility(R.id.empty_layout, View.GONE) @@ -279,25 +293,24 @@ class TheWidget : AppWidgetProvider() { val SP = PreferenceManager.getDefaultSharedPreferences(context) if (!SP.getBoolean(Constants.PREF_SHOW_CLOCK, false)) { views.setViewVisibility(R.id.time, View.GONE) + views.setViewVisibility(R.id.bottom_divider, View.VISIBLE) } else { + views.setViewVisibility(R.id.bottom_divider, View.GONE) + val now = Calendar.getInstance() + if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) { + val textBadHour = SpannableString(Constants.badHourFormat.format(now.timeInMillis).replace(" ", "")) + textBadHour.setSpan(RelativeSizeSpan(0.4f), textBadHour.length - 2, + textBadHour.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE) + + views.setTextViewText(R.id.time, textBadHour) + } else { + views.setTextViewText(R.id.time, Constants.goodHourFormat.format(now.timeInMillis)) + } + + val clockPIntent = PendingIntent.getActivity(context, widgetID, Util.getClockIntent(context), 0) + views.setOnClickPendingIntent(R.id.time, clockPIntent) views.setViewVisibility(R.id.time, View.VISIBLE) } - val now = Calendar.getInstance() - - - - if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) { - val textBadHour = SpannableString(Constants.badHourFormat.format(now.timeInMillis).replace(" ", "")) - textBadHour.setSpan(RelativeSizeSpan(0.4f), textBadHour.length - 2, - textBadHour.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE) - - views.setTextViewText(R.id.time, textBadHour) - } else { - views.setTextViewText(R.id.time, Constants.goodHourFormat.format(now.timeInMillis)) - } - - val clockPIntent = PendingIntent.getActivity(context, widgetID, Util.getClockIntent(context), 0) - views.setOnClickPendingIntent(R.id.time, clockPIntent) return views } @@ -402,8 +415,14 @@ class TheWidget : AppWidgetProvider() { v.calendar_temp.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f)) v.time.setTextSize(TypedValue.COMPLEX_UNIT_SP, SP.getFloat(Constants.PREF_TEXT_CLOCK_SIZE, 90f)) - v.second_row_icon.scaleX = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 16f - v.second_row_icon.scaleY = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 16f + v.second_row_icon.scaleX = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 18f + v.second_row_icon.scaleY = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 18f + + v.weather_icon.scaleX = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 20f + v.weather_icon.scaleY = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 20f + + v.empty_weather_icon.scaleX = SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f) / 24f + v.empty_weather_icon.scaleY = SP.getFloat(Constants.PREF_TEXT_MAIN_SIZE, 24f) / 24f v.multiple_events.scaleX = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 16f v.multiple_events.scaleY = SP.getFloat(Constants.PREF_TEXT_SECOND_SIZE, 16f) / 16f @@ -487,17 +506,17 @@ class TheWidget : AppWidgetProvider() { if (!SP.getBoolean(Constants.PREF_SHOW_CLOCK, false)) { v.time.visibility = View.GONE } else { - v.time.visibility = View.VISIBLE - } - val now = Calendar.getInstance() - if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) { - val textBadHour = SpannableString(Constants.badHourFormat.format(now.timeInMillis).replace(" ", "")) - textBadHour.setSpan(RelativeSizeSpan(0.4f), textBadHour.length - 2, - textBadHour.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + val now = Calendar.getInstance() + if (SP.getString(Constants.PREF_HOUR_FORMAT, "12").equals("12")) { + val textBadHour = SpannableString(Constants.badHourFormat.format(now.timeInMillis).replace(" ", "")) + textBadHour.setSpan(RelativeSizeSpan(0.4f), textBadHour.length - 2, + textBadHour.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE); - v.time.text = textBadHour - } else { - v.time.text = Constants.goodHourFormat.format(now.timeInMillis) + v.time.text = textBadHour + } else { + v.time.text = Constants.goodHourFormat.format(now.timeInMillis) + } + v.time.visibility = View.VISIBLE } return v } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt index 43c66a9..79fd85b 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/CalendarUtil.kt @@ -58,19 +58,22 @@ object CalendarUtil { resetNextEventData(context) } else { val provider = CalendarProvider(context) - val instances = provider.getInstances(now.timeInMillis, limit.timeInMillis).list - for (instance in instances) { - val e = provider.getEvent(instance.eventId) - if (e != null && (SP.getBoolean(Constants.PREF_CALENDAR_ALL_DAY, false) || !e.allDay) && !(SP.getString(Constants.PREF_CALENDAR_FILTER, "").contains(" " + e.calendarId + ",")) && (SP.getBoolean(Constants.PREF_SHOW_DECLINED_EVENTS, true) || !e.selfAttendeeStatus.equals(CalendarContract.Attendees.ATTENDEE_STATUS_DECLINED))) { - if (e.allDay) { - val start = Calendar.getInstance() - start.timeInMillis = instance.begin - val end = Calendar.getInstance() - end.timeInMillis = instance.end - instance.begin = start.timeInMillis - start.timeZone.getOffset(start.timeInMillis) - instance.end = end.timeInMillis - end.timeZone.getOffset(end.timeInMillis) + val data = provider.getInstances(now.timeInMillis, limit.timeInMillis) + if (data != null) { + val instances = data.list + for (instance in instances) { + val e = provider.getEvent(instance.eventId) + if (e != null && instance.begin <= limit.timeInMillis && (SP.getBoolean(Constants.PREF_CALENDAR_ALL_DAY, false) || !e.allDay) && !(SP.getString(Constants.PREF_CALENDAR_FILTER, "").contains(" " + e.calendarId + ",")) && (SP.getBoolean(Constants.PREF_SHOW_DECLINED_EVENTS, true) || !e.selfAttendeeStatus.equals(CalendarContract.Attendees.ATTENDEE_STATUS_DECLINED))) { + if (e.allDay) { + val start = Calendar.getInstance() + start.timeInMillis = instance.begin + val end = Calendar.getInstance() + end.timeInMillis = instance.end + instance.begin = start.timeInMillis - start.timeZone.getOffset(start.timeInMillis) + instance.end = end.timeInMillis - end.timeZone.getOffset(end.timeInMillis) + } + eventList.add(Event(e.id.toInt(), e.title, instance.begin, instance.end, e.calendarId.toInt(), e.allDay, e.eventLocation ?: "")) } - eventList.add(Event(e.id.toInt(), e.title, instance.begin, instance.end, e.calendarId.toInt(), e.allDay, e.eventLocation?: "")) } } @@ -88,6 +91,7 @@ object CalendarUtil { event1.startDate.compareTo(event.startDate) } }) + eventList.reverse() saveEvents(context, eventList) saveNextEventData(context, eventList[0]) } @@ -105,8 +109,12 @@ object CalendarUtil { return calendarList } val provider = CalendarProvider(context) - return provider.calendars.list - + val data = provider.calendars + if (data != null) { + return data.list + } else { + return calendarList + } } fun saveEvents(context: Context, eventList: ArrayList) { @@ -120,6 +128,11 @@ object CalendarUtil { @SuppressLint("ApplySharedPref") fun resetNextEventData(context: Context) { + Realm.init(context) + val db = Realm.getDefaultInstance() + db.executeTransaction { + db.where(Event::class.java).findAll().deleteAllFromRealm() + } val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) SP.edit() .remove(Constants.PREF_NEXT_EVENT_ID) @@ -151,7 +164,24 @@ object CalendarUtil { nextEvent } else { val eventList = db.where(Event::class.java).findAll() - eventList[0]?: Event() + + if (eventList.isNotEmpty()) { + eventList.sortWith(Comparator { event: Event, event1: Event -> + if (event.allDay && event1.allDay) { + event.startDate.compareTo(event1.startDate) + } else if (event.allDay) { + 1 + } else if (event1.allDay) { + -1 + } else { + event1.startDate.compareTo(event.startDate) + } + }) + eventList.reverse() + eventList[0] ?: Event() + } else { + Event() + } } } @@ -162,27 +192,45 @@ object CalendarUtil { val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) val eventList = db.where(Event::class.java).findAll() - var found = false - for (e in eventList) { - if (e.id == SP.getInt(Constants.PREF_NEXT_EVENT_ID, 0)) { - if (eventList.indexOf(e) < eventList.size - 1) { - SP.edit() - .putInt(Constants.PREF_NEXT_EVENT_ID, eventList[eventList.indexOf(e) + 1]?.id ?: 0) - .commit() + if (eventList.isNotEmpty()) { + /* + eventList.sortWith(Comparator { event: Event, event1: Event -> + if (event.allDay && event1.allDay) { + event.startDate.compareTo(event1.startDate) + } else if (event.allDay) { + 1 + } else if (event1.allDay) { + -1 } else { - SP.edit() - .putInt(Constants.PREF_NEXT_EVENT_ID, eventList[0]?.id ?: 0) - .commit() + event1.startDate.compareTo(event.startDate) } - found = true - break - } - } + }) + eventList.reverse()*/ - if (!found) { - SP.edit() - .putInt(Constants.PREF_NEXT_EVENT_ID, eventList[0]?.id ?: 0) - .commit() + var found = false + for (e in eventList) { + if (e.id == SP.getInt(Constants.PREF_NEXT_EVENT_ID, 0)) { + if (eventList.indexOf(e) < eventList.size - 1) { + SP.edit() + .putInt(Constants.PREF_NEXT_EVENT_ID, eventList[eventList.indexOf(e) + 1]?.id ?: 0) + .commit() + } else { + SP.edit() + .putInt(Constants.PREF_NEXT_EVENT_ID, eventList[0]?.id ?: 0) + .commit() + } + found = true + break + } + } + + if (!found) { + SP.edit() + .putInt(Constants.PREF_NEXT_EVENT_ID, eventList[0]?.id ?: 0) + .commit() + } + } else { + resetNextEventData(context) } context.sendBroadcast(Intent(Constants.ACTION_TIME_UPDATE)) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/CrocodileService.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/CrocodileService.kt index 8a8092a..377b7a9 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/CrocodileService.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/CrocodileService.kt @@ -1,5 +1,7 @@ package com.tommasoberlose.anotherwidget.util +import android.app.Notification +import android.app.PendingIntent import android.app.Service import android.content.Intent import android.os.IBinder @@ -7,7 +9,12 @@ import android.content.BroadcastReceiver import android.content.Context import com.tommasoberlose.anotherwidget.`object`.Constants import android.content.IntentFilter +import android.os.Build +import android.support.v4.app.NotificationCompat +import android.support.v4.content.ContextCompat import android.util.Log +import com.tommasoberlose.anotherwidget.R +import com.tommasoberlose.anotherwidget.ui.activity.MainActivity class CrocodileService : Service() { @@ -42,6 +49,18 @@ class CrocodileService : Service() { } override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val mBuilder: NotificationCompat.Builder = NotificationCompat.Builder(this, "Settings") + .setSmallIcon(R.drawable.ic_stat_name) + .setPriority(Notification.PRIORITY_MIN) + .setColor(ContextCompat.getColor(this, R.color.colorPrimary)) + .setContentTitle(this.getString(R.string.background_service_title)) + .setContentText(this.getString(R.string.background_service_subtitle)) + .setAutoCancel(true); + startForeground(5, mBuilder.build()) + } + return Service.START_NOT_STICKY } diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt index 1f27951..dbedead 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/Util.kt @@ -257,6 +257,7 @@ object Util { if (SP.getString(Constants.PREF_CALENDAR_APP_PACKAGE, "").equals("")) { val calIntent = Intent(Intent.ACTION_MAIN) + calIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) calIntent.addCategory(Intent.CATEGORY_APP_CALENDAR) return calIntent } else if (SP.getString(Constants.PREF_CALENDAR_APP_PACKAGE, "").equals("_")) { @@ -266,10 +267,12 @@ object Util { return try { val intent: Intent = pm.getLaunchIntentForPackage(SP.getString(Constants.PREF_CALENDAR_APP_PACKAGE, "")) intent.addCategory(Intent.CATEGORY_LAUNCHER) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent } catch (e: Exception) { e.printStackTrace() val calIntent = Intent(Intent.ACTION_MAIN) + calIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) calIntent.addCategory(Intent.CATEGORY_APP_CALENDAR) calIntent } @@ -281,6 +284,7 @@ object Util { if (SP.getString(Constants.PREF_WEATHER_APP_PACKAGE, "").equals("")) { val weatherIntent: Intent = Intent(Intent.ACTION_VIEW) weatherIntent.addCategory(Intent.CATEGORY_DEFAULT) + weatherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) weatherIntent.data = Uri.parse("dynact://velour/weather/ProxyActivity") weatherIntent.component = ComponentName("com.google.android.googlequicksearchbox", "com.google.android.apps.gsa.velour.DynamicActivityTrampoline") return weatherIntent @@ -291,10 +295,12 @@ object Util { return try { val intent: Intent = pm.getLaunchIntentForPackage(SP.getString(Constants.PREF_WEATHER_APP_PACKAGE, "")) intent.addCategory(Intent.CATEGORY_LAUNCHER) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent } catch (e: Exception) { val weatherIntent: Intent = Intent(Intent.ACTION_VIEW) weatherIntent.addCategory(Intent.CATEGORY_DEFAULT) + weatherIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) weatherIntent.data = Uri.parse("dynact://velour/weather/ProxyActivity") weatherIntent.component = ComponentName("com.google.android.googlequicksearchbox", "com.google.android.apps.gsa.velour.DynamicActivityTrampoline") weatherIntent @@ -308,6 +314,7 @@ object Util { val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, e.id.toLong()) val intent = Intent(Intent.ACTION_VIEW) .setData(uri) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.putExtra("beginTime", e.startDate); intent.putExtra("endTime", e.endDate); return intent @@ -318,11 +325,13 @@ object Util { return try { val intent: Intent = pm.getLaunchIntentForPackage(SP.getString(Constants.PREF_EVENT_APP_PACKAGE, "")) intent.addCategory(Intent.CATEGORY_LAUNCHER) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent } catch (ex: Exception) { val uri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, e.id.toLong()) val intent = Intent(Intent.ACTION_VIEW) .setData(uri) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intent.putExtra("beginTime", e.startDate); intent.putExtra("endTime", e.endDate); intent @@ -334,7 +343,7 @@ object Util { val SP = PreferenceManager.getDefaultSharedPreferences(context) if (SP.getString(Constants.PREF_CLOCK_APP_PACKAGE, "").equals("")) { val clockIntent = Intent(AlarmClock.ACTION_SHOW_ALARMS) - clockIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + clockIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK return clockIntent } else if (SP.getString(Constants.PREF_CLOCK_APP_PACKAGE, "").equals("_")) { return Intent() @@ -556,7 +565,12 @@ object Util { @SuppressLint("ApplySharedPref") fun updateSettingsByDefault(context: Context) { - context.startService(Intent(context, CrocodileService::class.java)) + try { + context.startService(Intent(context, CrocodileService::class.java)) + } catch (e: Exception) { + + } + val SP = PreferenceManager.getDefaultSharedPreferences(context) val editor = SP.edit() if (SP.contains(Constants.PREF_SHOW_EVENT_LOCATION)) { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt index 2f2bfcc..a00513d 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/util/WeatherUtil.kt @@ -80,7 +80,7 @@ object WeatherUtil { Awareness.SnapshotApi.getWeather(mGoogleApiClient) .setResultCallback({ weatherResult -> - if (weatherResult.status.isSuccess) { + if (weatherResult.status.isSuccess && weatherResult.weather != null) { val weather: Weather = weatherResult.weather val SP: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) SP.edit() diff --git a/app/src/main/res/layout/activity_support_dev.xml b/app/src/main/res/layout/activity_support_dev.xml index 9819c28..bd38565 100644 --- a/app/src/main/res/layout/activity_support_dev.xml +++ b/app/src/main/res/layout/activity_support_dev.xml @@ -81,200 +81,204 @@ android:layout_gravity="center_horizontal" android:id="@+id/loader" android:layout_margin="16dp"/> - + android:layout_height="wrap_content"> - + - - + android:gravity="center_vertical" + android:id="@+id/action_donation_coffee" + android:orientation="horizontal" + android:paddingTop="12dp" + android:paddingBottom="12dp"> + + - - - - + + + + - - + android:gravity="center_vertical" + android:id="@+id/action_donation_donuts" + android:orientation="horizontal" + android:paddingTop="12dp" + android:paddingBottom="12dp"> + + - - - - + + + + - - + android:gravity="center_vertical" + android:id="@+id/action_donation_breakfast" + android:orientation="horizontal" + android:paddingTop="12dp" + android:paddingBottom="12dp"> + + - - - - + + + + - - + android:gravity="center_vertical" + android:id="@+id/action_donation_lunch" + android:orientation="horizontal" + android:paddingTop="12dp" + android:paddingBottom="12dp"> + + - - - - + + + + - - + android:gravity="center_vertical" + android:id="@+id/action_donation_dinner" + android:orientation="horizontal" + android:paddingTop="12dp" + android:paddingBottom="12dp"> + + - + app:cardCornerRadius="2dp" + app:cardElevation="0dp" + app:cardBackgroundColor="@color/black_10" + app:cardPreventCornerOverlap="true"> + + + - + @@ -86,6 +89,7 @@ android:lines="1" android:gravity="right" android:ellipsize="end" + android:includeFontPadding="false" android:layout_height="wrap_content" style="@style/AnotherWidget.Title" /> @@ -112,8 +117,8 @@ android:gravity="center_vertical" android:orientation="horizontal"> @@ -146,6 +152,7 @@ android:layout_marginEnd="8dp" android:id="@+id/divider2" android:text="@string/divider" + android:includeFontPadding="false" style="@style/AnotherWidget.Subtitle"/> diff --git a/app/src/main/res/layout/the_widget_sans.xml b/app/src/main/res/layout/the_widget_sans.xml index 24e8686..698d2db 100644 --- a/app/src/main/res/layout/the_widget_sans.xml +++ b/app/src/main/res/layout/the_widget_sans.xml @@ -11,11 +11,18 @@ + \ No newline at end of file diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index bbbdbae..2dfbda3 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -149,4 +149,6 @@ Una Cena Costosa Una Colazione Inglese Una Pranzo Veloce + Another Widget è attivo + AW è attivo in background \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7995ed3..8611ef1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -154,4 +154,6 @@ An Expensive Dinner An English Breakfast A Quick Lunch + Another Widget is Running + AW is running in the background diff --git a/app/src/main/res/xml-v21/the_widget_info.xml b/app/src/main/res/xml-v21/the_widget_info.xml index 5918086..9c71ab6 100644 --- a/app/src/main/res/xml-v21/the_widget_info.xml +++ b/app/src/main/res/xml-v21/the_widget_info.xml @@ -3,10 +3,10 @@ android:initialKeyguardLayout="@layout/the_widget" android:initialLayout="@layout/the_widget" android:minHeight="80dp" - android:minWidth="380dp" + android:minWidth="300dp" android:configure="com.tommasoberlose.anotherwidget.ui.activity.MainActivity" android:minResizeHeight="60dp" - android:minResizeWidth="380dp" + android:minResizeWidth="300dp" android:previewImage="@drawable/widget_preview" android:resizeMode="vertical" android:updatePeriodMillis="60000" diff --git a/app/src/main/res/xml/the_widget_info.xml b/app/src/main/res/xml/the_widget_info.xml index 168b032..219c9a1 100644 --- a/app/src/main/res/xml/the_widget_info.xml +++ b/app/src/main/res/xml/the_widget_info.xml @@ -3,9 +3,9 @@ android:initialKeyguardLayout="@layout/the_widget" android:initialLayout="@layout/the_widget" android:minHeight="80dp" - android:minWidth="380dp" + android:minWidth="300dp" android:minResizeHeight="60dp" - android:minResizeWidth="380dp" + android:minResizeWidth="300dp" android:previewImage="@drawable/widget_preview" android:resizeMode="vertical" android:updatePeriodMillis="60000"