/*
* Copyright 2014 Jeremie Long
*
* 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.lithidsw.wallbox.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Environment;
import android.text.format.DateFormat;
import android.util.DisplayMetrics;
import android.util.Log;
import android.widget.Toast;
import com.lithidsw.wallbox.R;
import com.lithidsw.wallbox.app.randomizer.db.TableHelper;
public class Utils {
Context mContext;
Toast mToast = null;
public Utils(Context context) {
mContext = context;
}
public String getScreenSize(String smallStr,
String normalStr, String largeStr) {
String downloadFile = null;
DisplayMetrics displayMetrics = mContext.getResources()
.getDisplayMetrics();
float screenWidthDp = displayMetrics.widthPixels
/ displayMetrics.density;
float metrics = mContext.getResources().getDisplayMetrics().density;
if (screenWidthDp >= 600) {
downloadFile = largeStr;
} else {
if (metrics >= 2.0) {
downloadFile = normalStr;
} else {
downloadFile = smallStr;
}
}
return downloadFile;
}
public Bitmap changeHue( Bitmap source, int number ) {
double hue = (number / 100);
int screenWidth = source.getWidth();
int screenHeight = source.getHeight();
Bitmap result = Bitmap.createBitmap( screenWidth, screenHeight, source.getConfig() );
float[] hsv = new float[3];
for( int x = 0; x < screenWidth; x++ ) {
for( int y = 0; y < screenHeight; y++ ) {
int c = source.getPixel( x, y );
Color.colorToHSV(c, hsv);
hsv[0] = (float) ((hsv[0] + 360 * hue) % 360);
c = (Color.HSVToColor( hsv ) & 0x00ffffff) | (c & 0xff000000);
result.setPixel( x, y, c );
}
}
return result;
}
public int sortPref(SharedPreferences prefs, String item) {
return prefs.getInt(item, 0);
}
public String setRandomizerWallpaperFromFile() {
try {
WallpaperManager wm = WallpaperManager.getInstance(mContext);
String[] items = new TableHelper(mContext).getRandPaper();
if (items == null) {
return null;
}
File file = new File(items[0]);
Bitmap mBitmap = BitmapFactory.decodeFile(file.toString());
wm.setBitmap(mBitmap);
return items[1];
} catch (IOException e) {
return null;
}
}
public static String calculateMD5(String itempath) {
File updateFile = new File(itempath);
MessageDigest digest;
try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
return null;
}
InputStream is;
try {
is = new FileInputStream(updateFile);
} catch (FileNotFoundException e) {
return null;
}
byte[] buffer = new byte[8192];
int read;
try {
while ((read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
String output = bigInt.toString(16);
output = String.format("%32s", output).replace(' ', '0');
return output;
} catch (IOException e) {
throw new RuntimeException("Unable to process file for MD5", e);
} finally {
try {
is.close();
} catch (IOException e) {
}
}
}
public Boolean setWallpaperBitmap(Bitmap bitmap) {
try {
WallpaperManager wm = WallpaperManager.getInstance(mContext);
wm.setBitmap(bitmap);
return true;
} catch (IOException e) {
return false;
}
}
public void setSaturatedWallpaper() {
try {
WallpaperManager wm = WallpaperManager.getInstance(mContext);
Drawable draw = wm.getDrawable();
saveSaturateImage(drawableToBitmap(draw));
Bitmap bit = toGrayscale(drawableToBitmap(draw), h2F());
wm.setBitmap(bit);
} catch (IOException e) {
sendToast(mContext.getResources().getString(R.string.apply_error));
}
}
public void setSaturatedWallpaperFromFile(Boolean isRand) {
WallpaperManager wm = WallpaperManager.getInstance(mContext);
Bitmap bitmap;
try {
if (!isRand) {
File file = new File(mContext.getFilesDir(), C.CACHEIMG);
Bitmap myBitmap = BitmapFactory.decodeFile(file.toString());
bitmap = toGrayscale(myBitmap, h2F());
} else {
Drawable draw = wm.getDrawable();
saveSaturateImage(drawableToBitmap(draw));
bitmap = toGrayscale(drawableToBitmap(draw), h2F());
}
wm.setBitmap(bitmap);
Log.e(C.TAG, mContext.getResources().getString(R.string.set_wallpaper));
} catch (IOException e) {
Log.e(C.TAG, mContext.getResources().getString(R.string.apply_error));
}
}
public void sendToast(String str) {
if (mToast != null) {
mToast.cancel();
}
mToast = Toast.makeText(mContext, str, Toast.LENGTH_SHORT);
mToast.show();
}
public Drawable convertToGrayscale(Drawable drawable, float sat) {
ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(sat);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
drawable.setColorFilter(filter);
return drawable;
}
public Bitmap toGrayscale(Bitmap bmpOriginal, float sat) {
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();
Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(sat);
ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
paint.setColorFilter(f);
c.drawBitmap(bmpOriginal, 0, 0, paint);
return bmpGrayscale;
}
public Bitmap toColor(Bitmap bmpOriginal, int brightness, int contrast, int sat, int hue) {
int width, height;
height = bmpOriginal.getHeight();
width = bmpOriginal.getWidth();
Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas c = new Canvas(bmpGrayscale);
Paint paint = new Paint();
paint.setColorFilter(ColorFilterGenerator.adjustColor(brightness, contrast, sat, hue));
c.drawBitmap(bmpOriginal, 0, 0, paint);
return bmpGrayscale;
}
public static Bitmap drawableToBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
public boolean saveWallSnap(Bitmap bitmap) {
File storageDir = new File(
Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES
),
"WallSnap"
);
if (!storageDir.exists()) {
storageDir.mkdirs();
}
String JPEG_FILE_PREFIX = "WallSnap";
String timeStamp =
new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = JPEG_FILE_PREFIX + timeStamp;
try {
File image = File.createTempFile(imageFileName, ".png", storageDir);
FileOutputStream out = new FileOutputStream(image);
bitmap.compress(Bitmap.CompressFormat.PNG, 0, out);
out.flush();
out.close();
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
mediaScanIntent.setData(Uri.fromFile(image));
mContext.sendBroadcast(mediaScanIntent);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public void saveSaturateImage(Bitmap finalBitmap) {
File file = new File(mContext.getFilesDir(), C.CACHEIMG);
if (file.exists()) {
file.delete();
}
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.PNG, 0, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public String getFilePathFromUrl(String str) {
String fileNameExt = str.substring(str.lastIndexOf('/') + 1,
str.length());
File wallCache = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath()
+ "/"
+ mContext.getApplicationContext().getString(R.string.app_name)
+ "/");
return wallCache + "/" + fileNameExt;
}
public float getColorFloat(int num) {
final String[] sa = mContext.getResources().getStringArray(R.array.satValues);
return Float.parseFloat(sa[num]);
}
public float getFloat(int num) {
final String[] sa = mContext.getResources().getStringArray(R.array.satValues);
return Float.parseFloat(sa[num]);
}
public float h2F() {
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
final String[] sa = mContext.getResources().getStringArray(R.array.satValues);
return Float.parseFloat(sa[hour]);
}
public String getHour(Integer in) {
int hour = in;
String shour = String.valueOf(in);
if (!DateFormat.is24HourFormat(mContext)) {
if (hour >= 12) {
if (hour == 12) {
shour = 12 + " PM";
} else {
shour = hour - 12 + " PM";
}
} else if (hour == 0) {
shour = 12 + " AM";
} else {
shour = hour + " AM";
}
}
return mContext.getResources().getString(R.string.wallpaper_at) + shour;
}
public File getExternalDir() {
return new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/" + mContext.getString(R.string.app_name));
}
public void removeDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
new File(dir, children[i]).delete();
}
}
}
public void setWallpaperAlarms(Boolean run) {
int INTERVAL = 43200000;
/**
* TODO: These will be set in arrays.xml and passed here
* from the settings activity, or on boot.
*
* This sets the alarms for when to check for wallpaper updates.
*
* Time intervals:
* 1 = Every 24 hours = 86400000
* 2 = Every 12 hours = 43200000
* 3 = Every 6 hours = 21600000
* 4 = Every 3 hours = 10800000
* 5 = Every 1 hour = 3600000
* 6 = Every 30 mins = 1800000
*/
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
Intent in1 = new Intent("com.lithidsw.wallbox.WALLPAPER_CHECK_UPDATES");
PendingIntent pi = PendingIntent.getBroadcast(mContext, 9856, in1, 0);
AlarmManager am = (AlarmManager) mContext.getSystemService(Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), INTERVAL, pi);
if (!run) {
am.cancel(pi);
}
}
public void stopSaturatedAlarms() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY) + 1);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
Intent in = new Intent("com.lithidsw.wallbox.UPDATE_SATURATE_WALL");
PendingIntent pi = PendingIntent.getBroadcast(mContext, C.ALARM_ID, in, 0);
AlarmManager am = (AlarmManager) mContext.getSystemService(
Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pi);
am.cancel(pi);
}
public void setSaturatedAlarms() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY) + 1);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
Intent in = new Intent("com.lithidsw.wallbox.UPDATE_SATURATE_WALL");
PendingIntent pi = PendingIntent.getBroadcast(mContext, C.ALARM_ID, in, 0);
AlarmManager am = (AlarmManager) mContext.getSystemService(
Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
AlarmManager.INTERVAL_HOUR, pi);
}
public void stopRandomizerAlarms() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
Intent in = new Intent("com.lithidsw.wallbox.UPDATE_RANDOMIZER_WALL");
PendingIntent pi = PendingIntent.getBroadcast(mContext, 9563, in, 0);
AlarmManager am = (AlarmManager) mContext.getSystemService(
Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
AlarmManager.INTERVAL_DAY, pi);
am.cancel(pi);
}
public void setRandomizerAlarms(int option) {
long interval;
switch (option) {
case 0:
interval = 0;
break;
case 1:
interval = (AlarmManager.INTERVAL_FIFTEEN_MINUTES / 15);
break;
case 2:
interval = (AlarmManager.INTERVAL_HALF_HOUR / 15);
break;
case 3:
interval = (AlarmManager.INTERVAL_FIFTEEN_MINUTES / 3);
break;
case 4:
interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES;
break;
case 5:
interval = AlarmManager.INTERVAL_HALF_HOUR;
break;
case 6:
interval = (AlarmManager.INTERVAL_HALF_HOUR + AlarmManager.INTERVAL_FIFTEEN_MINUTES);
break;
case 7:
interval = AlarmManager.INTERVAL_HOUR;
break;
case 8:
interval = (AlarmManager.INTERVAL_HOUR * 2);
break;
case 9:
interval = (AlarmManager.INTERVAL_HOUR * 4);
break;
case 10:
interval = (AlarmManager.INTERVAL_HALF_DAY / 2);
break;
case 11:
interval = AlarmManager.INTERVAL_HALF_DAY;
break;
case 12:
interval = AlarmManager.INTERVAL_DAY;
break;
default:
interval = 0;
}
if (interval == 0) {
return;
}
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, cal.get(Calendar.HOUR_OF_DAY));
cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE));
cal.set(Calendar.SECOND, cal.get(Calendar.SECOND));
cal.add(Calendar.SECOND, 5);
Intent in = new Intent("com.lithidsw.wallbox.UPDATE_RANDOMIZER_WALL");
PendingIntent pi = PendingIntent.getBroadcast(mContext, 9563, in, 0);
AlarmManager am = (AlarmManager) mContext.getSystemService(
Activity.ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
interval, pi);
}
}