package com.reindeercrafts.notificationpeek.settings.appearance;
import android.app.Fragment;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.TransitionDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TextView;
import com.reindeercrafts.notificationpeek.NotificationService;
import com.reindeercrafts.notificationpeek.R;
import com.reindeercrafts.notificationpeek.settings.PreferenceKeys;
/**
* Appearance setting fragment used to contain Peek view background preferences, including
* pure black/system wallpaper option, blur radius and dim option.
* <p/>
* Created by zhelu on 5/23/14.
*/
public class AppearanceSettingsFragment extends Fragment
implements AdapterView.OnItemSelectedListener, SeekBar.OnSeekBarChangeListener {
public static final int TRANSITION_ANIM_DURATION = 1000; // 1s
private Handler mHandler;
private WallpaperFactory mWallpaperFactory;
private Spinner mBackgroundSpinner;
private boolean mNothingSelected = true;
private ImageView mPreviewImageView;
private TransitionDrawable mPreviewImageDrawable;
private Drawable[] mChangeDrawables;
private Drawable[] mAdjustDrawables;
private int mBlackDrawableIndex;
private boolean mAdjusted;
private SeekBar mRadiusSeek;
private SeekBar mDimSeek;
private TextView mRadiusText;
private TextView mDimText;
private boolean mUseLiveWallpaper;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mHandler = new Handler(Looper.getMainLooper());
mWallpaperFactory = new WallpaperFactory(getActivity());
mUseLiveWallpaper = WallpaperFactory.isLiveWallpaperUsed(getActivity());
mPreviewImageDrawable = initPreviewBackgroundDrawable();
mPreviewImageDrawable.setCrossFadeEnabled(true);
View rootView = inflater.inflate(R.layout.appearance_fragment_layout, container, false);
// Background selection spinner.
mBackgroundSpinner = (Spinner) rootView.findViewById(R.id.spinner);
ArrayAdapter<String> spinnerAdapter =
new ArrayAdapter<String>(getActivity(), R.layout.spinner_item_layout,
R.id.text_view,
getResources().getStringArray(R.array.background_pref_array));
mBackgroundSpinner.setAdapter(spinnerAdapter);
mBackgroundSpinner.setOnItemSelectedListener(this);
// Background preview image view.
mPreviewImageView = (ImageView) rootView.findViewById(R.id.preview_image_view);
mPreviewImageView.setImageDrawable(mPreviewImageDrawable);
// Seek bars and headers.
mRadiusSeek = (SeekBar) rootView.findViewById(R.id.radius_seek);
mDimSeek = (SeekBar) rootView.findViewById(R.id.dim_seek);
mRadiusText = (TextView) rootView.findViewById(R.id.radius_text);
mDimText = (TextView) rootView.findViewById(R.id.dim_text);
initSeekBars();
updateLayouts(false);
return rootView;
}
/**
* Create a new {@link android.graphics.drawable.TransitionDrawable} object with correct order
* of Drawables based on user selection.
*
* @return TransitionDrawable object created.
*/
private TransitionDrawable initPreviewBackgroundDrawable() {
boolean isWallpaperSelected = WallpaperFactory.isWallpaperThemeSelected(getActivity());
Drawable black = new ColorDrawable(Color.BLACK);
Drawable wallpaper =
mUseLiveWallpaper ? new ColorDrawable(Color.TRANSPARENT) : new BitmapDrawable(
getResources(), mWallpaperFactory.getPrefSystemWallpaper());
mChangeDrawables =
!isWallpaperSelected ? new Drawable[]{black, wallpaper} : new Drawable[]{wallpaper, black};
mBlackDrawableIndex = !isWallpaperSelected ? 0 : 1;
return new TransitionDrawable(mChangeDrawables);
}
private void initSeekBars() {
mRadiusSeek.setMax(ImageBlurrer.MAX_SUPPORTED_BLUR_PIXELS * 10);
mDimSeek.setMax(WallpaperFactory.DEFAULT_MAX_DIM);
SharedPreferences preferences =
PreferenceManager.getDefaultSharedPreferences(getActivity());
int radius = (int) (preferences
.getFloat(PreferenceKeys.PREF_RADIUS, ImageBlurrer.MAX_SUPPORTED_BLUR_PIXELS) * 10);
int dim = preferences.getInt(PreferenceKeys.PREF_DIM, WallpaperFactory.DEFAULT_MAX_DIM);
mRadiusSeek.setProgress(radius);
mDimSeek.setProgress(255 - dim);
mRadiusSeek.setOnSeekBarChangeListener(this);
mDimSeek.setOnSeekBarChangeListener(this);
}
/**
* Seek Drawable index within TransitionDrawable object. We need to find the index of the
* drawable that is the starting drawable of the TransitionDrawable.
*
* @return Index of the source drawable.
*/
private int getSourceDrawableIndex() {
if (mPreviewImageDrawable.getDrawable(0).getClass()
.equals(mPreviewImageDrawable.getDrawable(1).getClass())) {
// At this point we know that user is using the SeekBar to adjust background, so that
// we have two Drawables having the same type. Therefore, we return the last index of
// the TransitionDrawable, which points to the "Current" drawable that user chooses.
return 1;
}
// One of the Drawables is a ColorDrawable (Black), the other is a BitmapDrawable, choose the one
// that is different from the Black ColorDrawable.
return (mBlackDrawableIndex + 1) % 2;
}
/**
* Update layout components (SeekBar, TextView, ImageView) according to the new preference.
*
* @param manual If the update is from user or from the initialization.
*/
private void updateLayouts(boolean manual) {
if (!WallpaperFactory.isWallpaperThemeSelected(getActivity())) {
// Using pure black.
if (!manual) {
mBackgroundSpinner.setSelection(0);
} else {
mPreviewImageDrawable.reverseTransition(TRANSITION_ANIM_DURATION);
}
mRadiusSeek.setEnabled(false);
mDimSeek.setEnabled(false);
mRadiusText.setEnabled(false);
mDimText.setEnabled(false);
} else {
// using system wallpaper.
if (!manual) {
mBackgroundSpinner.setSelection(1);
} else {
mPreviewImageDrawable.reverseTransition(TRANSITION_ANIM_DURATION);
}
mRadiusSeek.setEnabled(true && !mUseLiveWallpaper);
mDimSeek.setEnabled(true && !mUseLiveWallpaper);
mRadiusText.setEnabled(true && !mUseLiveWallpaper);
mDimText.setEnabled(true && !mUseLiveWallpaper);
}
}
@Override
public void onStop() {
super.onStop();
// Inform Notification Peek to update Peek view background.
Intent intent = new Intent(NotificationService.ACTION_PREFERENCE_CHANGED);
intent.putExtra(PreferenceKeys.INTENT_ACTION_KEY, PreferenceKeys.PREF_BACKGROUND);
getActivity().sendBroadcast(intent);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// onItemSelected() is called the first time the SeekBar is populated but nothing has been
// selected, so we use this boolean value to work it around.
if (mNothingSelected) {
mNothingSelected = false;
return;
}
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity());
if (position == 0) {
pref.edit()
.putInt(PreferenceKeys.PREF_BACKGROUND, WallpaperFactory.BACKGROUND_PURE_BLACK)
.apply();
} else {
pref.edit().putInt(PreferenceKeys.PREF_BACKGROUND,
WallpaperFactory.BACKGROUND_SYSTEM_WALLPAPER).apply();
}
mHandler.postDelayed(mChangePreviewRunnable, 300);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
SharedPreferences.Editor editor =
PreferenceManager.getDefaultSharedPreferences(getActivity()).edit();
switch (seekBar.getId()) {
case R.id.radius_seek:
float newRadius = progress / 10f;
editor.putFloat(PreferenceKeys.PREF_RADIUS, newRadius).apply();
break;
case R.id.dim_seek:
editor.putInt(PreferenceKeys.PREF_DIM, 255 - progress).apply();
break;
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Change preview background.
mAdjusted = true;
mHandler.postDelayed(mReloadPreviewRunnable, 300);
}
private Runnable mReloadPreviewRunnable = new Runnable() {
@Override
public void run() {
mAdjustDrawables = new Drawable[]{mPreviewImageDrawable
.getDrawable(getSourceDrawableIndex()), new BitmapDrawable(
getResources(), mWallpaperFactory.getPrefSystemWallpaper())};
mPreviewImageDrawable = new TransitionDrawable(mAdjustDrawables);
mPreviewImageView.setImageDrawable(mPreviewImageDrawable);
mPreviewImageDrawable.startTransition(TRANSITION_ANIM_DURATION);
}
};
private Runnable mChangePreviewRunnable = new Runnable() {
@Override
public void run() {
// Build a new TransitionDrawable that presents the change of preview images.
if (mAdjusted) {
mAdjusted = false;
mChangeDrawables[1] = mChangeDrawables[mBlackDrawableIndex];
mChangeDrawables[0] = mAdjustDrawables[1];
mPreviewImageDrawable = new TransitionDrawable(mChangeDrawables);
mPreviewImageView.setImageDrawable(mPreviewImageDrawable);
}
updateLayouts(true);
}
};
}