content: /*
    This file is part of Subsonic.
      Subsonic is free software: you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published by
      the Free Software Foundation, either version 3 of the License, or
      (at your option) any later version.
      Subsonic is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
      GNU General Public License for more details.
      You should have received a copy of the GNU General Public License
      along with Subsonic. If not, see <http://www.gnu.org/licenses/>.
      Copyright 2015 (C) Scott Jackson
  */
  package net.nullsum.audinaut.view;
  
  import android.content.Context;
  import android.os.Build;
  import android.os.Environment;
  import android.preference.EditTextPreference;
  import android.util.AttributeSet;
  import android.util.Log;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.LinearLayout;
  
  import androidx.core.content.ContextCompat;
  
  import net.nullsum.audinaut.R;
  
  import java.io.File;
  
  public class CacheLocationPreference extends EditTextPreference {
      private static final String TAG = CacheLocationPreference.class.getSimpleName();
      private final Context context;
  
      public CacheLocationPreference(Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
          this.context = context;
      }
  
      public CacheLocationPreference(Context context, AttributeSet attrs) {
          super(context, attrs);
          this.context = context;
      }
  
      public CacheLocationPreference(Context context) {
          super(context);
          this.context = context;
      }
  
      @Override
      protected void onBindDialogView(View view) {
          super.onBindDialogView(view);
  
          view.setLayoutParams(new ViewGroup.LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
  
          final EditText editText = view.findViewById(android.R.id.edit);
          ViewGroup vg = (ViewGroup) editText.getParent();
  
          LinearLayout cacheButtonsWrapper = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.cache_location_buttons, vg, true);
          Button internalLocation = cacheButtonsWrapper.findViewById(R.id.location_internal);
          Button externalLocation = cacheButtonsWrapper.findViewById(R.id.location_external);
  
          File[] dirs;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              dirs = context.getExternalMediaDirs();
          } else {
              dirs = ContextCompat.getExternalFilesDirs(context, null);
          }
  
          // Past 5.0 we can query directly for SD Card
          File internalDir = null, externalDir = null;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              for (File dir : dirs) {
                  try {
                      if (dir != null) {
                          if (!Environment.isExternalStorageRemovable(dir)) {
                              internalDir = dir;
                          }
                      }
                  } catch (Exception e) {
                      Log.e(TAG, "Failed to check if is external", e);
                  }
              }
          }
  
          // Before 5.0, we have to guess.  Most of the time the SD card is last
          for (int i = dirs.length - 1; i >= 0; i--) {
              if (dirs[i] != null) {
                  externalDir = dirs[i];
                  break;
              }
          }
          if (internalDir == null) {
              for (File dir : dirs) {
                  if (dir != null) {
                      internalDir = dir;
                      break;
                  }
              }
          }
          final File finalInternalDir = new File(internalDir, "music");
          final File finalExternalDir = new File(externalDir, "music");
  
          if (finalInternalDir.exists() || finalInternalDir.mkdirs()) {
              internalLocation.setOnClickListener(v -> {
                  String path = finalInternalDir.getPath();
                  editText.setText(path);
              });
          } else {
              internalLocation.setEnabled(false);
          }
  
          if (!finalInternalDir.equals(finalExternalDir) && (finalExternalDir.exists() || finalExternalDir.mkdirs())) {
              externalLocation.setOnClickListener(v -> {
                  String path = finalExternalDir.getPath();
                  editText.setText(path);
              });
          } else {
              externalLocation.setEnabled(false);
          }
      }
  }
  