content: package com.android.launcher3.model;
  
  import android.content.ContentValues;
  import android.content.Context;
  import android.content.Intent;
  import android.database.sqlite.SQLiteDatabase;
  
  import com.android.launcher3.LauncherProvider;
  import com.android.launcher3.LauncherSettings;
  import com.android.launcher3.util.TestLauncherProvider;
  
  import org.junit.Before;
  import org.robolectric.Robolectric;
  import org.robolectric.RuntimeEnvironment;
  import org.robolectric.shadows.ShadowContentResolver;
  import org.robolectric.shadows.ShadowLog;
  
  public abstract class BaseGridChangesTestCase {
  
  
      public static final int DESKTOP = LauncherSettings.Favorites.CONTAINER_DESKTOP;
      public static final int HOTSEAT = LauncherSettings.Favorites.CONTAINER_HOTSEAT;
  
      public static final int APP_ICON = LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
      public static final int SHORTCUT = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT;
      public static final int NO__ICON = -1;
  
      public static final String TEST_PACKAGE = "com.android.launcher3.validpackage";
  
      public Context mContext;
      public TestLauncherProvider mProvider;
      public SQLiteDatabase mDb;
  
      @Before
      public void setUpBaseCase() {
          ShadowLog.stream = System.out;
  
          mContext = RuntimeEnvironment.application;
          mProvider = Robolectric.setupContentProvider(TestLauncherProvider.class);
          ShadowContentResolver.registerProviderInternal(LauncherProvider.AUTHORITY, mProvider);
          mDb = mProvider.getDb();
      }
  
      /**
       * Adds a dummy item in the DB.
       * @param type {@link #APP_ICON} or {@link #SHORTCUT} or >= 2 for
       *             folder (where the type represents the number of items in the folder).
       */
      public int addItem(int type, int screen, int container, int x, int y) {
          int id = LauncherSettings.Settings.call(mContext.getContentResolver(),
                  LauncherSettings.Settings.METHOD_NEW_ITEM_ID)
                  .getInt(LauncherSettings.Settings.EXTRA_VALUE);
  
          ContentValues values = new ContentValues();
          values.put(LauncherSettings.Favorites._ID, id);
          values.put(LauncherSettings.Favorites.CONTAINER, container);
          values.put(LauncherSettings.Favorites.SCREEN, screen);
          values.put(LauncherSettings.Favorites.CELLX, x);
          values.put(LauncherSettings.Favorites.CELLY, y);
          values.put(LauncherSettings.Favorites.SPANX, 1);
          values.put(LauncherSettings.Favorites.SPANY, 1);
  
          if (type == APP_ICON || type == SHORTCUT) {
              values.put(LauncherSettings.Favorites.ITEM_TYPE, type);
              values.put(LauncherSettings.Favorites.INTENT,
                      new Intent(Intent.ACTION_MAIN).setPackage(TEST_PACKAGE).toUri(0));
          } else {
              values.put(LauncherSettings.Favorites.ITEM_TYPE,
                      LauncherSettings.Favorites.ITEM_TYPE_FOLDER);
              // Add folder items.
              for (int i = 0; i < type; i++) {
                  addItem(APP_ICON, 0, id, 0, 0);
              }
          }
  
          mContext.getContentResolver().insert(LauncherSettings.Favorites.CONTENT_URI, values);
          return id;
      }
  
      public int[][][] createGrid(int[][][] typeArray) {
          return createGrid(typeArray, 1);
      }
  
      /**
       * Initializes the DB with dummy elements to represent the provided grid structure.
       * @param typeArray A 3d array of item types. {@see #addItem(int, long, long, int, int)} for
       *                  type definitions. The first dimension represents the screens and the next
       *                  two represent the workspace grid.
       * @param startScreen First screen id from where the icons will be added.
       * @return the same grid representation where each entry is the corresponding item id.
       */
      public int[][][] createGrid(int[][][] typeArray, int startScreen) {
          LauncherSettings.Settings.call(mContext.getContentResolver(),
                  LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB);
          int[][][] ids = new int[typeArray.length][][];
  
          for (int i = 0; i < typeArray.length; i++) {
              // Add screen to DB
              int screenId = startScreen + i;
  
              // Keep the screen id counter up to date
              LauncherSettings.Settings.call(mContext.getContentResolver(),
                      LauncherSettings.Settings.METHOD_NEW_SCREEN_ID);
  
              ids[i] = new int[typeArray[i].length][];
              for (int y = 0; y < typeArray[i].length; y++) {
                  ids[i][y] = new int[typeArray[i][y].length];
                  for (int x = 0; x < typeArray[i][y].length; x++) {
                      if (typeArray[i][y][x] < 0) {
                          // Empty cell
                          ids[i][y][x] = -1;
                      } else {
                          ids[i][y][x] = addItem(typeArray[i][y][x], screenId, DESKTOP, x, y);
                      }
                  }
              }
          }
  
          return ids;
      }
  }
  