/* * 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.app.wallsnap; import java.util.Random; import android.app.AlertDialog; import android.app.ProgressDialog; import android.app.WallpaperInfo; import android.app.WallpaperManager; import android.content.Context; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.support.v8.renderscript.Allocation; import android.support.v8.renderscript.RenderScript; import android.support.v8.renderscript.ScriptIntrinsicBlur; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SeekBar; import com.lithidsw.wallbox.R; import com.lithidsw.wallbox.utils.C; import com.lithidsw.wallbox.utils.ColorFilterGenerator; import com.lithidsw.wallbox.utils.CustomDialogs; import com.lithidsw.wallbox.utils.Utils; public class WallSnapFragment extends Fragment implements View.OnClickListener, SeekBar.OnSeekBarChangeListener { FragmentActivity mActivity; Resources mResources; LinearLayout mLayout; LinearLayout mLayoutMainClick; SharedPreferences prefs; Utils mUtils; SeekBar mSeekBlur; SeekBar mSeekSat; SeekBar mSeekHue; SeekBar mSeekBright; SeekBar mSeekContrast; ImageView mImageView; Bitmap mBitmap; int mBlurItem; int mSatItem; int mHueItem; int mBrightItem; int mContrastItem; int mSelectedItem; private WallpaperManager wm; private Bundle bundle; private Drawable bundleDrawable; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mActivity = super.getActivity(); mResources = mActivity.getResources(); mLayout = (LinearLayout) inflater.inflate(R.layout.wallsnap_frag, container, false); if (mLayout != null ) { bundle = getArguments(); wm = WallpaperManager.getInstance(mActivity); mUtils = new Utils(mActivity); prefs = mActivity.getSharedPreferences(C.PREF, Context.MODE_PRIVATE); mSeekBlur = (SeekBar) mLayout.findViewById(R.id.blur_seeker); mSeekBlur.setOnSeekBarChangeListener(this); mSeekSat = (SeekBar) mLayout.findViewById(R.id.sat_seeker); mSeekSat.setOnSeekBarChangeListener(this); mSeekHue = (SeekBar) mLayout.findViewById(R.id.hue_seeker); mSeekHue.setOnSeekBarChangeListener(this); mSeekBright = (SeekBar) mLayout.findViewById(R.id.bright_seeker); mSeekBright.setOnSeekBarChangeListener(this); mSeekContrast = (SeekBar) mLayout.findViewById(R.id.contrast_seeker); mSeekContrast.setOnSeekBarChangeListener(this); mLayoutMainClick = (LinearLayout) mLayout.findViewById(R.id.main_layout); mLayoutMainClick.setOnClickListener(this); mImageView = (ImageView) mLayout.findViewById(R.id.main_image); mImageView.setImageDrawable(getMainDrawable()); setSeekers(); } if (!prefs.getBoolean(C.PREF_WALLSNAP_FIRST_RUN_MAIN, false)) { prefs.edit().putBoolean(C.PREF_WALLSNAP_FIRST_RUN_MAIN, true).commit(); String title = mResources.getString(R.string.main_title_wallsnap); String message = mResources.getString(R.string.wallsnap_description); new CustomDialogs().openFirstDialog(mActivity, title, message); } setHasOptionsMenu(true); return mLayout; } private Drawable getMainDrawable() { Drawable drawable = null; if (bundle != null) { if (bundleDrawable == null) { bundleDrawable = Drawable.createFromPath(bundle.getString(C.EXTRA_PATH)); if (bundleDrawable != null) { drawable = bundleDrawable; } } else { drawable = bundleDrawable; } } if (drawable == null) { drawable = wm.getDrawable(); } return drawable; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_save: sortDialog(); return true; case R.id.action_refresh: resetColors(); return true; default: return false; } } @Override public void onResume() { super.onResume(); check(); } private void setSeekers() { mSeekBlur.setMax(24); mSeekSat.setMax(200); mSeekSat.setProgress(100); mSeekHue.setMax(320); mSeekHue.setProgress(180); mSeekBright.setMax(200); mSeekBright.setProgress(100); mSeekContrast.setMax(100); } private void randomImage() { resetColors(); Random r = new Random(); mSatItem = r.nextInt(200) + 1; mSeekSat.setProgress(mSatItem); mHueItem = r.nextInt(320) + 1; mSeekHue.setProgress(mHueItem); mBrightItem = r.nextInt(100) + 1; mSeekBright.setProgress(mBrightItem); mContrastItem = r.nextInt(100) + 1; mSeekContrast.setProgress(mContrastItem); updateImagePre(); } private void updateImagePre() { Drawable drawable = mImageView.getDrawable(); if (drawable != null) { drawable.setColorFilter(ColorFilterGenerator.adjustColor(mBrightItem, mContrastItem, mSatItem, mHueItem)); } } Bitmap BlurImage (Bitmap input, int radius) { RenderScript rsScript = RenderScript.create(mActivity); Allocation alloc = Allocation.createFromBitmap(rsScript, input); ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rsScript, alloc.getElement()); blur.setRadius(radius + 1); blur.setInput(alloc); Bitmap result = Bitmap.createBitmap(input.getWidth(), input.getHeight(), input.getConfig()); Allocation outAlloc = Allocation.createFromBitmap(rsScript, result); blur.forEach(outAlloc); outAlloc.copyTo(result); rsScript.destroy(); return result; } private void updateBlur() { Bitmap bitmap = BlurImage(Utils.drawableToBitmap(getMainDrawable()), mBlurItem); if (bitmap != null) { mImageView.setImageBitmap(BlurImage(bitmap, mBlurItem)); Drawable drawable = mImageView.getDrawable(); if (drawable != null) { drawable.setColorFilter(ColorFilterGenerator.adjustColor(mBrightItem, mContrastItem, mSatItem, mHueItem)); } } } private void toast4Live() { if (bundle == null) { try { WallpaperInfo info = wm.getWallpaperInfo(); if (info != null) { info.toString(); mUtils.sendToast(mResources.getString(R.string.last_known_current_live)); } } catch (NullPointerException ignore) { } } } private void resetColors() { mSeekSat.setProgress(100); mSeekHue.setProgress(180); mSeekBright.setProgress(100); mSeekContrast.setProgress(0); check(); } public void check() { toast4Live(); mImageView.setImageDrawable(getMainDrawable()); } private void sortDialog() { String[] items = mResources.getStringArray(R.array.wallsnap_types); new AlertDialog.Builder(mActivity) .setTitle(mResources.getString(R.string.wallsnap_type_dialog_title)) .setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); new ImageSaver().execute(which); } }).show(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.main_layout: randomImage(); break; default: break; } } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { switch (seekBar.getId()) { case R.id.blur_seeker: mBlurItem = progress; break; case R.id.sat_seeker: mSatItem = (progress - 100); break; case R.id.hue_seeker: mHueItem = (progress - 180); break; case R.id.bright_seeker: mBrightItem = (progress - 100); break; case R.id.contrast_seeker: mContrastItem = progress; break; } updateImagePre(); } @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onStopTrackingTouch(SeekBar seekBar) { switch (seekBar.getId()) { case R.id.blur_seeker: updateBlur(); break; } } class ImageSaver extends AsyncTask<Integer, String, Boolean> { ProgressDialog progressDialog; @Override protected void onPreExecute() { progressDialog = ProgressDialog.show(mActivity, "", mResources.getStringArray(R.array.wallsnap_types_progress)[mSelectedItem]); } @Override protected Boolean doInBackground(Integer... type) { boolean success; Bitmap bitmap = BlurImage(Utils.drawableToBitmap(getMainDrawable()), mBlurItem); mBitmap = mUtils.toColor(bitmap, mBrightItem, mContrastItem, mSatItem, mHueItem); switch (type[0]) { case 0: success = mUtils.saveWallSnap(mBitmap); break; case 1: success = mUtils.saveWallSnap(mBitmap); if (success) { success = mUtils.setWallpaperBitmap(mBitmap); } break; case 2: success = mUtils.setWallpaperBitmap(mBitmap); break; default: success = false; break; } return success; } @Override protected void onPostExecute(Boolean count) { progressDialog.dismiss(); if (count) { mUtils.sendToast(mResources.getStringArray(R.array.wallsnap_types_toast)[mSelectedItem]); switch (mSelectedItem) { case 0: resetColors(); break; default: mImageView.setImageBitmap(mBitmap); resetColors(); break; } } else { mUtils.sendToast(mResources.getString(R.string.wallpaper_error)); } check(); } } }