package com.rubika.aotalk; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.media.AudioManager; import android.media.audiofx.Visualizer; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.RemoteException; import android.os.Vibrator; import android.preference.PreferenceManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.GridView; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import com.actionbarsherlock.app.SherlockFragment; import com.google.analytics.tracking.android.EasyTracker; import com.google.analytics.tracking.android.Tracker; import com.rubika.aotalk.ui.improvedtextview.ImprovedTextView; import com.rubika.aotalk.util.Logging; import com.rubika.aotalk.util.Statics; @SuppressLint("NewApi") public class FragmentTools extends SherlockFragment { private static final String APP_TAG = "--> The Leet :: FragmentTools"; private ImprovedTextView title; private ImageButton play; private LinearLayout load; private boolean enableVibrations = false; private boolean enableVisualizer = true; private boolean cycleColor = false; private static Context context; private Tracker tracker; final Handler handler = new Handler(); private Visualizer visualizer; private VisualizerView visualizerView; private LinearLayout visualizerHolder; public static FragmentTools newInstance() { FragmentTools f = new FragmentTools(); return f; } public FragmentTools() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onDestroyView() { if (visualizer != null) { visualizer.setEnabled(false); visualizer.release(); visualizer = null; } if (visualizerView != null) { visualizerView = null; } super.onDestroyView(); } @Override public void onResume() { super.onResume(); enableVisualizer = PreferenceManager.getDefaultSharedPreferences(context).getBoolean("enableMusicVisualizer", true); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD) { if (enableVisualizer) { AOTalk.getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC); if (visualizer == null) { setupVisualizer(); } if (!visualizer.getEnabled() && visualizer != null) { visualizer.setEnabled(true); } if (AOTalk.isPlaying) { visualizerHolder.setVisibility(View.VISIBLE); } else { visualizerHolder.setVisibility(View.GONE); } } else { if (visualizer != null) { visualizer.setEnabled(false); visualizer.release(); visualizer = null; } visualizerHolder.setVisibility(View.GONE); } } updatePlayer(AOTalk.isPlaying, AOTalk.currentTrack); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { return null; } context = AOTalk.getContext(); EasyTracker.getInstance().setContext(context); tracker = EasyTracker.getTracker(); View fragmentTools = inflater.inflate(R.layout.fragment_tools, container, false); GridView grid = (GridView) fragmentTools.findViewById(R.id.grid); if (!PreferenceManager.getDefaultSharedPreferences(context).getBoolean("enableAnimations", true)) { grid.setLayoutAnimation(null); } enableVibrations = PreferenceManager.getDefaultSharedPreferences(context).getBoolean("enableMusicVibrations", false); enableVisualizer = PreferenceManager.getDefaultSharedPreferences(context).getBoolean("enableMusicVisualizer", true); grid.setAdapter(AOTalk.gridAdapter); title = (ImprovedTextView) fragmentTools.findViewById(R.id.gsptext); play = (ImageButton) fragmentTools.findViewById(R.id.gspplay); load = (LinearLayout) fragmentTools.findViewById(R.id.gspload); visualizerHolder = (LinearLayout) fragmentTools.findViewById(R.id.visualizer); updatePlayer(AOTalk.isPlaying, AOTalk.currentTrack); play.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (AOTalk.service != null) { play.setVisibility(View.GONE); load.setVisibility(View.VISIBLE); if (AOTalk.isPlaying) { Message msg = Message.obtain(null, Statics.MESSAGE_PLAYER_STOP); msg.replyTo = AOTalk.serviceMessenger; try { AOTalk.service.send(msg); } catch (RemoteException e) { Logging.log(APP_TAG, e.getMessage()); } enableVibrations = PreferenceManager.getDefaultSharedPreferences(context).getBoolean("enableMusicVibrations", false); tracker.sendEvent("Player", "Play", "", 0L); } else { Message msg = Message.obtain(null, Statics.MESSAGE_PLAYER_PLAY); msg.replyTo = AOTalk.serviceMessenger; try { AOTalk.service.send(msg); } catch (RemoteException e) { Logging.log(APP_TAG, e.getMessage()); } enableVibrations = PreferenceManager.getDefaultSharedPreferences(context).getBoolean("enableMusicVibrations", false); tracker.sendEvent("Player", "Stop", "", 0L); } } else { Logging.log(APP_TAG, "service is NULL"); } } }); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD){ if (enableVisualizer) { AOTalk.getActivity().setVolumeControlStream(AudioManager.STREAM_MUSIC); if (visualizer == null) { setupVisualizer(); } if (visualizer != null) { if (!visualizer.getEnabled()) { visualizer.setEnabled(true); } } } else { if (visualizer != null) { visualizer.setEnabled(false); visualizer.release(); visualizer = null; } } } ImageView gspLogo = (ImageView) fragmentTools.findViewById(R.id.gsplogo); gspLogo.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(context, Gridstream.class); startActivity(intent); } }); return fragmentTools; } private void setupVisualizer() { // Create a VisualizerView (defined below), which will render the simplified audio wave form to a Canvas. if (visualizerHolder != null) { visualizerView = new VisualizerView(AOTalk.getContext()); visualizerView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); visualizerHolder.addView(visualizerView); // Create the Visualizer object and attach it to our media player. try { visualizer = new Visualizer(0); visualizer.setCaptureSize(Visualizer.getCaptureSizeRange()[1]); visualizer.setDataCaptureListener( new Visualizer.OnDataCaptureListener() { public void onWaveFormDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { if (visualizerView != null) { visualizerView.updateVisualizer(bytes); } } public void onFftDataCapture(Visualizer visualizer, byte[] bytes, int samplingRate) { } }, Visualizer.getMaxCaptureRate() / 2, true, false ); } catch (IllegalStateException e) { Logging.log(APP_TAG, e.getMessage()); } catch (RuntimeException e) { Logging.log(APP_TAG, e.getMessage()); } } } public void updatePlayer(boolean isPlaying, String text) { AOTalk.isPlaying = isPlaying; if (context != null && title != null) { if (text != null) { title.setText(text); } else { title.setText(context.getText(R.string.gsp2)); } } if (load != null) { load.setVisibility(View.GONE); } if (play != null) { play.setVisibility(View.VISIBLE); if (!isPlaying) { play.setImageResource(R.drawable.icon_play); } else { play.setImageResource(R.drawable.icon_stop); } } if (visualizerHolder != null) { if (!isPlaying) { visualizerHolder.setVisibility(View.GONE); } else { if (enableVisualizer) { visualizerHolder.setVisibility(View.VISIBLE); } else { visualizerHolder.setVisibility(View.GONE); } } } } private class VisualizerView extends View { private byte[] mBytes; private float[] mPoints; private Rect mRect = new Rect(); private Paint paint0 = new Paint(); private Paint paint1 = new Paint(); private Paint paint2 = new Paint(); private float amplitude = 0; private Vibrator vibrator; private float colorCounter = 0; public VisualizerView(Context context) { super(context); vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); init(); } private void init() { mBytes = null; paint0.setStrokeWidth(0); paint0.setAntiAlias(true); paint0.setColor(Color.argb(255, 51, 181, 229)); paint0.setStyle(Paint.Style.FILL); paint0.setStrokeJoin(Paint.Join.ROUND); paint0.setStrokeCap(Paint.Cap.ROUND); paint1 = new Paint(); paint1.set(paint0); paint1.setColor(Color.argb(32, 51, 181, 229)); paint1.setStrokeWidth(10f); paint2 = new Paint(); paint2.set(paint1); paint2.setStrokeWidth(20f); } public void updateVisualizer(byte[] bytes) { mBytes = bytes; invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mBytes == null) { return; } if (mPoints == null || mPoints.length < mBytes.length * 4) { mPoints = new float[mBytes.length * 4]; } mRect.set(0, 0, getWidth(), getHeight()); for (int i = 0; i < mBytes.length - 1; i++) { mPoints[i * 4] = mRect.width() * i / (mBytes.length - 1); mPoints[i * 4 + 1] = mRect.height() / 2 + ((byte) (mBytes[i] + 128)) * (mRect.height() / 2) / 128; mPoints[i * 4 + 2] = mRect.width() * (i + 1) / (mBytes.length - 1); mPoints[i * 4 + 3] = mRect.height() / 2 + ((byte) (mBytes[i + 1] + 128)) * (mRect.height() / 2) / 128; } if (enableVibrations) { float accumulator = 0; for (int i = 0; i < mBytes.length - 1; i++) { accumulator += Math.abs(mBytes[i]); } float amp = accumulator/(128 * mBytes.length); if(amp > amplitude && accumulator < 130000) { vibrator.vibrate(20); amplitude = amp; } else { amplitude *= 0.99; } } if (cycleColor) { generateColor(); } canvas.drawLines(mPoints, paint2); canvas.drawLines(mPoints, paint1); canvas.drawLines(mPoints, paint0); } private void generateColor() { int r = (int)Math.floor(128*(Math.sin(colorCounter) + 3)); int g = (int)Math.floor(128*(Math.sin(colorCounter + 1) + 1)); int b = (int)Math.floor(128*(Math.sin(colorCounter + 7) + 1)); paint0.setColor(Color.argb(255, r, g, b)); paint1.setColor(Color.argb(32, r, g, b)); paint2.setColor(Color.argb(32, r, g, b)); colorCounter += 0.03; } } }