content: package com.alium.orin.ui.activities.base;
  
  import android.Manifest;
  import android.content.Intent;
  import android.content.pm.PackageManager;
  import android.media.AudioManager;
  import android.net.Uri;
  import android.os.Build;
  import android.os.Bundle;
  import android.provider.Settings;
  import android.support.annotation.NonNull;
  import android.support.annotation.Nullable;
  import android.support.design.widget.Snackbar;
  import android.support.v4.app.ActivityCompat;
  import android.view.KeyEvent;
  import android.view.View;
  
  import com.kabouzeid.appthemehelper.ThemeStore;
  import com.alium.orin.R;
  
  /**
   * @author Karim Abou Zeid (kabouzeid)
   */
  public abstract class AbsBaseActivity extends AbsThemeActivity {
      public static final int PERMISSION_REQUEST = 100;
  
      private boolean hadPermissions;
      private String[] permissions;
      private String permissionDeniedMessage;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setVolumeControlStream(AudioManager.STREAM_MUSIC);
  
          permissions = getPermissionsToRequest();
          hadPermissions = hasPermissions();
  
          setPermissionDeniedMessage(null);
      }
  
      @Override
      protected void onPostCreate(@Nullable Bundle savedInstanceState) {
          super.onPostCreate(savedInstanceState);
          if (!hasPermissions()) {
              requestPermissions();
          }
      }
  
      @Override
      protected void onResume() {
          super.onResume();
          final boolean hasPermissions = hasPermissions();
          if (hasPermissions != hadPermissions) {
              hadPermissions = hasPermissions;
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                  onHasPermissionsChanged(hasPermissions);
              }
          }
      }
  
      protected void onHasPermissionsChanged(boolean hasPermissions) {
          // implemented by sub classes
      }
  
      @Override
      public boolean dispatchKeyEvent(@NonNull KeyEvent event) {
          if (event.getKeyCode() == KeyEvent.KEYCODE_MENU && event.getAction() == KeyEvent.ACTION_UP) {
              showOverflowMenu();
              return true;
          }
          return super.dispatchKeyEvent(event);
      }
  
      protected void showOverflowMenu() {
  
      }
  
      @Nullable
      protected String[] getPermissionsToRequest() {
          return null;
      }
  
      protected View getSnackBarContainer() {
          return getWindow().getDecorView();
      }
  
      protected void setPermissionDeniedMessage(String message) {
          permissionDeniedMessage = message;
      }
  
      private String getPermissionDeniedMessage() {
          return permissionDeniedMessage == null ? getString(R.string.permissions_denied) : permissionDeniedMessage;
      }
  
      protected void requestPermissions() {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permissions != null) {
              requestPermissions(permissions, PERMISSION_REQUEST);
          }
      }
  
      protected boolean hasPermissions() {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && permissions != null) {
              for (String permission : permissions) {
                  if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
                      return false;
                  }
              }
          }
          return true;
      }
  
      @Override
      public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
          super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          if (requestCode == PERMISSION_REQUEST) {
              for (int grantResult : grantResults) {
                  if (grantResult != PackageManager.PERMISSION_GRANTED) {
                      if (ActivityCompat.shouldShowRequestPermissionRationale(AbsBaseActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                          //User has deny from permission dialog
                          Snackbar.make(getSnackBarContainer(), getPermissionDeniedMessage(),
                                  Snackbar.LENGTH_INDEFINITE)
                                  .setAction(R.string.action_grant, new View.OnClickListener() {
                                      @Override
                                      public void onClick(View view) {
                                          requestPermissions();
                                      }
                                  })
                                  .setActionTextColor(ThemeStore.accentColor(this))
                                  .show();
                      } else {
                          // User has deny permission and checked never show permission dialog so you can redirect to Application settings page
                          Snackbar.make(getSnackBarContainer(), getPermissionDeniedMessage(),
                                  Snackbar.LENGTH_INDEFINITE)
                                  .setAction(R.string.action_settings, new View.OnClickListener() {
                                      @Override
                                      public void onClick(View view) {
                                          Intent intent = new Intent();
                                          intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                          Uri uri = Uri.fromParts("package", AbsBaseActivity.this.getPackageName(), null);
                                          intent.setData(uri);
                                          startActivity(intent);
                                      }
                                  })
                                  .setActionTextColor(ThemeStore.accentColor(this))
                                  .show();
                      }
                      return;
                  }
              }
              hadPermissions = true;
              onHasPermissionsChanged(true);
          }
      }
  }
  