OSDN Git Service

Eleven: request record audio permission for visualizer
[android-x86/packages-apps-Eleven.git] / src / com / cyanogenmod / eleven / ui / activities / HomeActivity.java
index 775fe55..6499a20 100644 (file)
  */
 package com.cyanogenmod.eleven.ui.activities;
 
+import android.Manifest;
 import android.animation.ArgbEvaluator;
 import android.animation.ObjectAnimator;
 import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.graphics.Color;
 import android.net.Uri;
 import android.os.AsyncTask;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.provider.MediaStore;
@@ -38,6 +41,7 @@ import com.cyanogenmod.eleven.R;
 import com.cyanogenmod.eleven.cache.ImageFetcher;
 import com.cyanogenmod.eleven.ui.fragments.AlbumDetailFragment;
 import com.cyanogenmod.eleven.ui.fragments.ArtistDetailFragment;
+import com.cyanogenmod.eleven.ui.fragments.AudioPlayerFragment;
 import com.cyanogenmod.eleven.ui.fragments.IChildFragment;
 import com.cyanogenmod.eleven.ui.fragments.ISetupActionBar;
 import com.cyanogenmod.eleven.ui.fragments.PlaylistDetailFragment;
@@ -50,6 +54,8 @@ import com.cyanogenmod.eleven.utils.BitmapWithColors;
 import com.cyanogenmod.eleven.utils.MusicUtils;
 import com.cyanogenmod.eleven.utils.NavUtils;
 
+import java.util.ArrayList;
+
 public class HomeActivity extends SlidingPanelActivity implements
         FragmentManager.OnBackStackChangedListener {
     private static final String TAG = "HomeActivity";
@@ -65,6 +71,9 @@ public class HomeActivity extends SlidingPanelActivity implements
     private static final int NEW_PHOTO = 1;
     public static final int EQUALIZER = 2;
 
+    private static final int PERMISSION_REQUEST_STORAGE = 1;
+    private Bundle mSavedInstanceState;
+
     private String mKey;
     private boolean mLoadedBaseFragment = false;
     private boolean mHasPendingPlaybackRequest = false;
@@ -80,6 +89,14 @@ public class HomeActivity extends SlidingPanelActivity implements
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
+        mSavedInstanceState = savedInstanceState;
+
+        if (!needRequestStoragePermission()) {
+            init();
+        }
+    }
+
+    private void init() {
         // if we've been launched by an intent, parse it
         Intent launchIntent = getIntent();
         boolean intentHandled = false;
@@ -88,7 +105,7 @@ public class HomeActivity extends SlidingPanelActivity implements
         }
 
         // if the intent didn't cause us to load a fragment, load the music browse one
-        if (savedInstanceState == null && !mLoadedBaseFragment) {
+        if (mSavedInstanceState == null && !mLoadedBaseFragment) {
             final MusicBrowserPhoneFragment fragment = new MusicBrowserPhoneFragment();
             if (launchIntent != null) {
                 fragment.setDefaultPageIdx(launchIntent.getIntExtra(EXTRA_BROWSE_PAGE_IDX,
@@ -104,10 +121,11 @@ public class HomeActivity extends SlidingPanelActivity implements
 
         getSupportFragmentManager().addOnBackStackChangedListener(this);
 
+
         // if we are resuming from a saved instance state
-        if (savedInstanceState != null) {
+        if (mSavedInstanceState != null) {
             // track which fragments are loaded and if this is the top level activity
-            mTopLevelActivity = savedInstanceState.getBoolean(STATE_KEY_BASE_FRAGMENT);
+            mTopLevelActivity = mSavedInstanceState.getBoolean(STATE_KEY_BASE_FRAGMENT);
             mLoadedBaseFragment = mTopLevelActivity;
 
             // update the action bar based on the top most fragment
@@ -122,6 +140,8 @@ public class HomeActivity extends SlidingPanelActivity implements
         if (!intentHandled) {
             handlePlaybackIntent(launchIntent);
         }
+
+        mSavedInstanceState = null;
     }
 
     @Override
@@ -171,8 +191,6 @@ public class HomeActivity extends SlidingPanelActivity implements
 
     @Override
     protected void onSlide(float slideOffset) {
-        super.onSlide(slideOffset);
-
         boolean isInBrowser = getCurrentPanel() == Panel.Browse && slideOffset < 0.7f;
         if (isInBrowser != mBrowsePanelActive) {
             mBrowsePanelActive = isInBrowser;
@@ -182,10 +200,11 @@ public class HomeActivity extends SlidingPanelActivity implements
 
     @Override
     public void onWindowFocusChanged(boolean hasFocus) {
-        getAudioPlayerFragment().onWindowFocusChanged(hasFocus
-                && (getCurrentPanel() == Panel.MusicPlayer));
-
         super.onWindowFocusChanged(hasFocus);
+
+        if (getCurrentPanel() == Panel.MusicPlayer) {
+            getAudioPlayerFragment().setVisualizerVisible(hasFocus);
+        }
     }
 
     private void updateStatusBarColor() {
@@ -196,15 +215,14 @@ public class HomeActivity extends SlidingPanelActivity implements
                 @Override
                 protected BitmapWithColors doInBackground(Void... params) {
                     ImageFetcher imageFetcher = ImageFetcher.getInstance(HomeActivity.this);
-                    final BitmapWithColors bitmap = imageFetcher.getArtwork(
+                    return imageFetcher.getArtwork(
                             MusicUtils.getAlbumName(), MusicUtils.getCurrentAlbumId(),
                             MusicUtils.getArtistName(), true);
-                    return bitmap;
                 }
                 @Override
                 protected void onPostExecute(BitmapWithColors bmc) {
-                    updateEqualizerColor(bmc != null
-                            ? bmc.getVibrantColor() : Color.TRANSPARENT);
+                    updateVisualizerColor(bmc != null
+                            ? bmc.getContrastingColor() : Color.TRANSPARENT);
                     updateStatusBarColor(bmc != null
                             ? bmc.getVibrantDarkColor() : Color.TRANSPARENT);
                 }
@@ -212,11 +230,16 @@ public class HomeActivity extends SlidingPanelActivity implements
         }
     }
 
-    private void updateEqualizerColor(int color) {
+    private void updateVisualizerColor(int color) {
         if (color == Color.TRANSPARENT) {
-            color = getResources().getColor(R.color.equalizer_fill_color);
+            color = getResources().getColor(R.color.visualizer_fill_color);
+        }
+
+        // check for null since updatestatusBarColor is a async task
+        AudioPlayerFragment fragment = getAudioPlayerFragment();
+        if (fragment != null) {
+            fragment.setVisualizerColor(color);
         }
-        getAudioPlayerFragment().updateVisualizerColor(color);
     }
 
     private void updateStatusBarColor(int color) {
@@ -462,4 +485,59 @@ public class HomeActivity extends SlidingPanelActivity implements
                     !(topFragment instanceof MusicBrowserPhoneFragment));
         }
     }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, String permissions[],
+            int[] grantResults) {
+        switch (requestCode) {
+            case PERMISSION_REQUEST_STORAGE: {
+                if (checkPermissionGrantResults(grantResults)) {
+                    init();
+                } else {
+                    finish();
+                }
+            }
+        }
+    }
+
+    private boolean needRequestStoragePermission() {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return false;
+
+        boolean needRequest = false;
+        String[] permissions = {
+                Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                Manifest.permission.READ_EXTERNAL_STORAGE
+        };
+        ArrayList<String> permissionList = new ArrayList<String>();
+        for (String permission : permissions) {
+            if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
+                permissionList.add(permission);
+                needRequest = true;
+            }
+        }
+
+        if (needRequest) {
+            int count = permissionList.size();
+            if (count > 0) {
+                String[] permissionArray = new String[count];
+                for (int i = 0; i < count; i++) {
+                    permissionArray[i] = permissionList.get(i);
+                }
+
+                requestPermissions(permissionArray, PERMISSION_REQUEST_STORAGE);
+            }
+        }
+
+        return needRequest;
+    }
+
+    private boolean checkPermissionGrantResults(int[] grantResults) {
+        for (int result : grantResults) {
+            if (result != PackageManager.PERMISSION_GRANTED) {
+                return false;
+            }
+        }
+        return true;
+    }
+
 }