content: package com.moonpi.swiftnotes;
  
  import android.content.Context;
  import android.graphics.Color;
  import android.graphics.drawable.GradientDrawable;
  import android.graphics.drawable.LayerDrawable;
  import android.util.TypedValue;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.BaseAdapter;
  import android.widget.ImageButton;
  import android.widget.ListAdapter;
  import android.widget.RelativeLayout;
  import android.widget.TextView;
  
  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;
  
  import static com.moonpi.swiftnotes.DataUtils.*;
  import static com.moonpi.swiftnotes.MainActivity.*;
  
  
  /**
   * Adapter class for custom notes ListView
   */
  class NoteAdapter extends BaseAdapter implements ListAdapter {
      private Context context;
      private JSONArray adapterData;
      private LayoutInflater inflater;
  
      /**
       * Adapter constructor -> Sets class variables
       * @param context application context
       * @param adapterData JSONArray of notes
       */
      NoteAdapter(Context context, JSONArray adapterData) {
          this.context = context;
          this.adapterData = adapterData;
          this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      }
  
      // Return number of notes
      @Override
      public int getCount() {
          if (this.adapterData != null)
              return this.adapterData.length();
  
          else
              return 0;
      }
  
      // Return note at position
      @Override
      public JSONObject getItem(int position) {
          if (this.adapterData != null)
              return this.adapterData.optJSONObject(position);
  
          else
              return null;
      }
  
      @Override
      public long getItemId(int position) {
          return 0;
      }
  
  
      // View inflater
      @Override
      public View getView(final int position, View convertView, ViewGroup parent) {
          // Inflate custom note view if null
          if (convertView == null)
              convertView = this.inflater.inflate(R.layout.list_view_note, parent, false);
  
          // Initialize layout items
          RelativeLayout relativeLayout = (RelativeLayout) convertView.findViewById(R.id.relativeLayout);
          LayerDrawable roundedCard = (LayerDrawable) context.getResources().getDrawable(R.drawable.rounded_card);
          TextView titleView = (TextView) convertView.findViewById(R.id.titleView);
          TextView bodyView = (TextView) convertView.findViewById(R.id.bodyView);
          ImageButton favourite = (ImageButton) convertView.findViewById(R.id.favourite);
  
          // Get Note object at position
          JSONObject noteObject = getItem(position);
  
          if (noteObject != null) {
              // If noteObject not empty -> initialize variables
              String title = context.getString(R.string.note_title);
              String body = context.getString(R.string.note_body);
              String colour = String.valueOf(context.getResources().getColor(R.color.white));
              int fontSize = 18;
              Boolean hideBody = false;
              Boolean favoured = false;
  
              try {
                  // Get noteObject data and store in variables
                  title = noteObject.getString(NOTE_TITLE);
                  body = noteObject.getString(NOTE_BODY);
                  colour = noteObject.getString(NOTE_COLOUR);
  
                  if (noteObject.has(NOTE_FONT_SIZE))
                      fontSize = noteObject.getInt(NOTE_FONT_SIZE);
  
                  if (noteObject.has(NOTE_HIDE_BODY))
                      hideBody = noteObject.getBoolean(NOTE_HIDE_BODY);
  
                  favoured = noteObject.getBoolean(NOTE_FAVOURED);
  
              } catch (JSONException e) {
                  e.printStackTrace();
              }
  
              // Set favourite image resource
              if (favoured)
                  favourite.setImageResource(R.drawable.ic_fav);
  
              else
                  favourite.setImageResource(R.drawable.ic_unfav);
  
  
              // If search or delete modes are active -> hide favourite button; Show otherwise
              if (searchActive || deleteActive)
                  favourite.setVisibility(View.INVISIBLE);
  
              else
                  favourite.setVisibility(View.VISIBLE);
  
  
              titleView.setText(title);
  
              // If hidBody is true -> hide body of note
              if (hideBody)
                  bodyView.setVisibility(View.GONE);
  
              // Else -> set visible note body, text to normal and set text size to 'fontSize' as sp
              else {
                  bodyView.setVisibility(View.VISIBLE);
                  bodyView.setText(body);
                  bodyView.setTextSize(TypedValue.COMPLEX_UNIT_SP, fontSize);
              }
  
              // If current note is selected for deletion -> highlight
              if (checkedArray.contains(position)) {
                  ((GradientDrawable) roundedCard.findDrawableByLayerId(R.id.card))
                          .setColor(context.getResources().getColor(R.color.theme_primary));
              }
  
              // If current note is not selected -> set background colour to normal
              else {
                  ((GradientDrawable) roundedCard.findDrawableByLayerId(R.id.card))
                          .setColor(Color.parseColor(colour));
              }
  
              // Set note background style to rounded card
              relativeLayout.setBackground(roundedCard);
  
              final Boolean finalFavoured = favoured;
              favourite.setOnClickListener(new View.OnClickListener() {
                  // If favourite button was clicked -> change that note to favourite or un-favourite
                  @Override
                  public void onClick(View v) {
                      setFavourite(context, !finalFavoured, position);
                  }
              });
          }
  
          return convertView;
      }
  }
  