From c4b791a029bd70cdc611e537efcb8b03780703ae Mon Sep 17 00:00:00 2001 From: Zach Prezkuta Date: Sun, 9 Aug 2015 17:05:25 -0600 Subject: Allow user to change background color/transparency for the widget, for greater compatibility with various wallpapers Use slider for background transparency adjustment Change-Id: I7f1d00fd5df6ea52b127287fc17baf1477fbb9a3 --- AndroidManifest.xml | 4 +- res/layout/appwidget.xml | 3 - res/layout/background_transparency.xml | 28 +++ res/layout/weather_panel.xml | 8 +- res/values/strings.xml | 4 + res/xml/preferences_clock.xml | 15 ++ .../cyanogenmod/lockclock/ClockWidgetService.java | 8 + src/com/cyanogenmod/lockclock/misc/Constants.java | 6 +- .../cyanogenmod/lockclock/misc/Preferences.java | 12 ++ .../preference/BackgroundTransparency.java | 200 +++++++++++++++++++++ 10 files changed, 280 insertions(+), 8 deletions(-) create mode 100644 res/layout/background_transparency.xml create mode 100644 src/com/cyanogenmod/lockclock/preference/BackgroundTransparency.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8d45a72..1bf0043 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -16,8 +16,8 @@ + android:versionCode="21" + android:versionName="3.4.1" > diff --git a/res/layout/appwidget.xml b/res/layout/appwidget.xml index dc8fe8e..0af81c2 100644 --- a/res/layout/appwidget.xml +++ b/res/layout/appwidget.xml @@ -26,15 +26,12 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal|top" /> - + + + + + + diff --git a/res/layout/weather_panel.xml b/res/layout/weather_panel.xml index 5401081..4af7732 100644 --- a/res/layout/weather_panel.xml +++ b/res/layout/weather_panel.xml @@ -53,7 +53,9 @@ android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" - android:padding="4dip" + android:paddingLeft="4dip" + android:paddingRight="4dip" + android:paddingBottom="4dip" android:gravity="center" android:src="@android:drawable/ic_dialog_alert" /> @@ -63,7 +65,9 @@ android:layout_centerVertical="true" android:layout_toLeftOf="@id/weather_image" android:orientation="horizontal" - android:padding="4dip" > + android:paddingLeft="4dip" + android:paddingRight="4dip" + android:paddingBottom="4dip" > Timestamp font color Details font color + + Background color + Background transparency + 3 hours 6 hours diff --git a/res/xml/preferences_clock.xml b/res/xml/preferences_clock.xml index 8eca8fe..04f6175 100644 --- a/res/xml/preferences_clock.xml +++ b/res/xml/preferences_clock.xml @@ -72,5 +72,20 @@ android:defaultValue="#80ffffff" android:entries="@array/font_color_entries" android:entryValues="@array/font_color_values" /> + + + + + diff --git a/src/com/cyanogenmod/lockclock/ClockWidgetService.java b/src/com/cyanogenmod/lockclock/ClockWidgetService.java index 8402194..d5f6635 100644 --- a/src/com/cyanogenmod/lockclock/ClockWidgetService.java +++ b/src/com/cyanogenmod/lockclock/ClockWidgetService.java @@ -183,6 +183,14 @@ public class ClockWidgetService extends IntentService { setClockSize(remoteViews, ratio); } + // Set the widget background color/transparency + int backColor = Preferences.clockBackgroundColor(this); + int backTrans = Preferences.clockBackgroundTransparency(this); + backColor = (backTrans << 24) | (backColor & 0xFFFFFF); + remoteViews.setInt(R.id.clock_panel, "setBackgroundColor", backColor); + remoteViews.setInt(R.id.calendar_panel, "setBackgroundColor", backColor); + remoteViews.setInt(R.id.weather_panel, "setBackgroundColor", backColor); + // Do the update mAppWidgetManager.updateAppWidget(id, remoteViews); } diff --git a/src/com/cyanogenmod/lockclock/misc/Constants.java b/src/com/cyanogenmod/lockclock/misc/Constants.java index 751de2d..a7113f2 100755 --- a/src/com/cyanogenmod/lockclock/misc/Constants.java +++ b/src/com/cyanogenmod/lockclock/misc/Constants.java @@ -31,6 +31,8 @@ public class Constants { public static final String CLOCK_SHOW_ALARM = "clock_show_alarm"; public static final String CLOCK_FONT_COLOR = "clock_font_color"; public static final String CLOCK_ALARM_FONT_COLOR = "clock_alarm_font_color"; + public static final String CLOCK_BACKGROUND_COLOR = "clock_background_color"; + public static final String CLOCK_BACKGROUND_TRANSPARENCY = "clock_background_transparency"; public static final String CLOCK_AM_PM_INDICATOR = "clock_am_pm_indicator"; public static final String SHOW_WEATHER = "show_weather"; @@ -91,7 +93,9 @@ public class Constants { public static final String DEFAULT_LIGHT_COLOR = "#ffffffff"; public static final String DEFAULT_DARK_COLOR = "#80ffffff"; - + public static final String DEFAULT_BACKGROUND_COLOR = "#00000000"; + public static final int DEFAULT_BACKGROUND_TRANSPARENCY = 0; + // Intent actions public static final String ACTION_SHOW_FORECAST = "com.cyanogenmod.lockclock.action.SHOW_FORECAST"; diff --git a/src/com/cyanogenmod/lockclock/misc/Preferences.java b/src/com/cyanogenmod/lockclock/misc/Preferences.java index 01e1d45..941e761 100644 --- a/src/com/cyanogenmod/lockclock/misc/Preferences.java +++ b/src/com/cyanogenmod/lockclock/misc/Preferences.java @@ -81,6 +81,18 @@ public class Preferences { return color; } + public static int clockBackgroundColor(Context context) { + int color = Color.parseColor(getPrefs(context).getString(Constants.CLOCK_BACKGROUND_COLOR, + Constants.DEFAULT_BACKGROUND_COLOR)); + return color; + } + + public static int clockBackgroundTransparency(Context context) { + int trans = getPrefs(context).getInt(Constants.CLOCK_BACKGROUND_TRANSPARENCY, + Constants.DEFAULT_BACKGROUND_TRANSPARENCY); + return trans; + } + public static int weatherFontColor(Context context) { int color = Color.parseColor(getPrefs(context).getString(Constants.WEATHER_FONT_COLOR, Constants.DEFAULT_LIGHT_COLOR)); diff --git a/src/com/cyanogenmod/lockclock/preference/BackgroundTransparency.java b/src/com/cyanogenmod/lockclock/preference/BackgroundTransparency.java new file mode 100644 index 0000000..88eebe9 --- /dev/null +++ b/src/com/cyanogenmod/lockclock/preference/BackgroundTransparency.java @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2015 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.lockclock.preference; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.DialogInterface; +import android.os.Bundle; +import android.os.Parcel; +import android.os.Parcelable; +import android.os.UserHandle; +import android.preference.DialogPreference; +import android.provider.Settings; +import android.util.AttributeSet; +import android.view.View; +import android.widget.Button; +import android.widget.SeekBar; +import android.widget.TextView; + +import com.cyanogenmod.lockclock.ClockWidgetProvider; +import com.cyanogenmod.lockclock.R; +import com.cyanogenmod.lockclock.misc.Constants; + +/** + * Preference for selection of background transparency for the clock widget + */ +public class BackgroundTransparency extends DialogPreference { + private static final String TAG = "BackgroundTransparency"; + + private final Context mContext; + + private TransparencySeekBar mBackgroundTransparency; + + private int mOriginalBackgroundTransparency; + + private final int mDefaultBackgroundTransparency; + + public BackgroundTransparency(Context context, AttributeSet attrs) { + super(context, attrs); + mContext = context; + + mDefaultBackgroundTransparency = Constants.DEFAULT_BACKGROUND_TRANSPARENCY; + setDialogLayoutResource(R.layout.background_transparency); + } + + @Override + protected void onBindDialogView(View view) { + super.onBindDialogView(view); + + SharedPreferences getPrefs = mContext.getSharedPreferences(Constants.PREF_NAME, Context.MODE_PRIVATE); + mOriginalBackgroundTransparency = getPrefs.getInt(Constants.CLOCK_BACKGROUND_TRANSPARENCY, + Constants.DEFAULT_BACKGROUND_TRANSPARENCY); + + SeekBar trans = (SeekBar) view.findViewById(R.id.background_transparency_seekbar); + mBackgroundTransparency = new TransparencySeekBar(trans); + + mBackgroundTransparency.setProgress(mOriginalBackgroundTransparency); + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + super.onDialogClosed(positiveResult); + updateTransparency(positiveResult); + } + + @Override + protected Parcelable onSaveInstanceState() { + final Parcelable superState = super.onSaveInstanceState(); + if (getDialog() == null || !getDialog().isShowing()) { + return superState; + } + + // Save the dialog state + final SavedState myState = new SavedState(superState); + myState.originalBackgroundTransparency = mOriginalBackgroundTransparency; + myState.currentBackgroundTransparency = mBackgroundTransparency.getProgress(); + + // Restore the old state when the activity or dialog is being paused + updateTransparency(false); + + return myState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + if (state == null || !state.getClass().equals(SavedState.class)) { + // Didn't save state for us in onSaveInstanceState + super.onRestoreInstanceState(state); + return; + } + + SavedState myState = (SavedState) state; + super.onRestoreInstanceState(myState.getSuperState()); + + mOriginalBackgroundTransparency = myState.originalBackgroundTransparency; + mBackgroundTransparency.setProgress(myState.currentBackgroundTransparency); + + updateTransparency(true); + } + + private static class SavedState extends BaseSavedState { + int originalBackgroundTransparency; + int currentBackgroundTransparency; + + public SavedState(Parcelable superState) { + super(superState); + } + + public SavedState(Parcel source) { + super(source); + originalBackgroundTransparency = source.readInt(); + currentBackgroundTransparency = source.readInt(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeInt(originalBackgroundTransparency); + dest.writeInt(currentBackgroundTransparency); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + private void updateTransparency(boolean accept) { + int trans = accept ? mBackgroundTransparency.getProgress() : mOriginalBackgroundTransparency; + callChangeListener(trans); + + SharedPreferences getPrefs = mContext.getSharedPreferences(Constants.PREF_NAME, Context.MODE_PRIVATE); + SharedPreferences.Editor edit = getPrefs.edit(); + edit.putInt(Constants.CLOCK_BACKGROUND_TRANSPARENCY, trans); + edit.apply(); + } + + private class TransparencySeekBar implements SeekBar.OnSeekBarChangeListener { + private final SeekBar mSeekBar; + + private static final int MIN = 0; + private static final int MAX = 255; + private static final int STEP = 5; + + public TransparencySeekBar(SeekBar seekBar) { + mSeekBar = seekBar; + + mSeekBar.setMax((MAX - MIN) / STEP); + mSeekBar.setOnSeekBarChangeListener(this); + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + updateTransparency(true); + } + } + + public void setProgress(int progress) { + int p = Math.max(progress, MIN) - MIN; + mSeekBar.setProgress(Math.round((float) p / STEP)); + } + + public int getProgress() { + return mSeekBar.getProgress() * STEP + MIN; + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + // Do nothing here + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + // Do nothing here + } + } +} -- cgit v1.1