boolean resizeCameras() {
    try {
      int screen_width = readScreenWidth(this);
      camerasPerRow = recalculateCameraPerRow();

      io.evercam.androidapp.custom.FlowLayout camsLineView =
          (io.evercam.androidapp.custom.FlowLayout) this.findViewById(R.id.cameras_flow_layout);
      for (int i = 0; i < camsLineView.getChildCount(); i++) {
        LinearLayout pview = (LinearLayout) camsLineView.getChildAt(i);
        CameraLayout cameraLayout = (CameraLayout) pview.getChildAt(0);

        LinearLayout.LayoutParams params =
            new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
        params.width =
            ((i + 1 % camerasPerRow == 0)
                ? (screen_width - (i % camerasPerRow) * (screen_width / camerasPerRow))
                : screen_width / camerasPerRow);
        params.width = params.width - 1; // 1 pixels spacing between cameras
        params.height = (int) (params.width / (1.25));
        params.setMargins(1, 1, 0, 0); // 1 pixels spacing between cameras
        cameraLayout.setLayoutParams(params);
      }
      return true;
    } catch (Exception e) {
      Log.e(TAG, e.toString() + "::" + Log.getStackTraceString(e));

      sendToMint(e);

      EvercamPlayApplication.sendCaughtException(this, e);
      CustomedDialog.showUnexpectedErrorDialog(CamerasActivity.this);
    }
    return false;
  }
    @Override
    protected void onPostExecute(Boolean hasNetwork) {
      if (hasNetwork) {
        if (type == InternetCheckType.START) {
          updateNavDrawerUserInfo();
          startLoadingCameras();
        } else if (type == InternetCheckType.RESTART) {
          if (reloadCameraList) {
            removeAllCameraViews();
            startLoadingCameras();
            reloadCameraList = false;
          } else {
            // Re-calculate camera per row because screen size
            // could change because of screen rotation.
            int camsOldValue = camerasPerRow;
            camerasPerRow = recalculateCameraPerRow();
            if (camsOldValue != camerasPerRow) {
              removeAllCameraViews();
              addAllCameraViews(true, true);
            }

            // Refresh camera names in case it's changed from camera
            // live view
            updateCameraNames();
          }
        }
      } else {
        CustomedDialog.showInternetNotConnectDialog(CamerasActivity.this);
      }
    }
 private void startCameraLoadingTask() {
   if (Commons.isOnline(this)) {
     LoadCameraListTask loadTask =
         new LoadCameraListTask(AppData.defaultUser, CamerasActivity.this);
     loadTask.reload = true; // be default do not refresh until there
     // is
     // any change in cameras in database
     loadTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
   } else {
     CustomedDialog.showInternetNotConnectDialog(CamerasActivity.this);
   }
 }
 private void showSignOutDialog() {
   CustomedDialog.getConfirmLogoutDialog(
           this,
           new DialogInterface.OnClickListener() {
             @Override
             public void onClick(DialogInterface dialog, int which) {
               EvercamPlayApplication.sendEventAnalytics(
                   CamerasActivity.this,
                   R.string.category_menu,
                   R.string.action_logout,
                   R.string.label_user_logout);
               logOutDefaultUser(CamerasActivity.this);
             }
           })
       .show();
 }
 @Override
 protected void onPostExecute(Boolean hasNetwork) {
   if (hasNetwork) {
     if (isUserLogged(MainActivity.this)) {
       AppUser defaultUser = AppData.defaultUser;
       new CheckKeyExpirationTaskMain(
               defaultUser.getUsername(), defaultUser.getApiKey(), defaultUser.getApiId())
           .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     } else {
       finish();
       Intent slideIntent = new Intent(MainActivity.this, SlideActivity.class);
       startActivity(slideIntent);
     }
   } else {
     CustomedDialog.showInternetNotConnectDialog(MainActivity.this);
   }
 }
  // Remove all the cameras so that all activities being performed can be
  // stopped
  public boolean removeAllCameraViews() {
    try {
      stopAllCameraViews();

      io.evercam.androidapp.custom.FlowLayout camsLineView =
          (io.evercam.androidapp.custom.FlowLayout) this.findViewById(R.id.cameras_flow_layout);
      camsLineView.removeAllViews();

      return true;
    } catch (Exception e) {
      Log.e(TAG, e.toString() + "::" + Log.getStackTraceString(e));

      sendToMint(e);

      EvercamPlayApplication.sendCaughtException(this, e);
      CustomedDialog.showUnexpectedErrorDialog(CamerasActivity.this);
    }
    return false;
  }
  /**
   * Add all camera views to the main grid page
   *
   * @param reloadImages reload camera images or not
   * @param showThumbnails show thumbnails that returned by Evercam or not, if true and if thumbnail
   *     not available, it will request latest snapshot instead. If false, it will request neither
   *     thumbnail nor latest snapshot.
   */
  public boolean addAllCameraViews(final boolean reloadImages, final boolean showThumbnails) {
    try {
      // Recalculate camera per row
      camerasPerRow = recalculateCameraPerRow();

      io.evercam.androidapp.custom.FlowLayout camsLineView =
          (io.evercam.androidapp.custom.FlowLayout) this.findViewById(R.id.cameras_flow_layout);

      int screen_width = readScreenWidth(this);

      int index = 0;

      for (final EvercamCamera evercamCamera : AppData.evercamCameraList) {
        // Don't show offline camera
        if (!PrefsManager.showOfflineCameras(this) && !evercamCamera.isActive()) {
          continue;
        }

        final LinearLayout cameraListLayout = new LinearLayout(this);

        int indexPlus = index + 1;

        if (reloadImages) evercamCamera.loadingStatus = ImageLoadingStatus.not_started;

        final CameraLayout cameraLayout = new CameraLayout(this, evercamCamera, showThumbnails);

        LinearLayout.LayoutParams params =
            new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
        params.width =
            ((indexPlus % camerasPerRow == 0)
                ? (screen_width - (index % camerasPerRow) * (screen_width / camerasPerRow))
                : screen_width / camerasPerRow);
        params.width = params.width - 1; // 1 pixels spacing between cameras
        params.height = (int) (params.width / (1.25));
        params.setMargins(0, 0, 0, 0); // No spacing between cameras
        cameraLayout.setLayoutParams(params);

        cameraListLayout.addView(cameraLayout);

        camsLineView.addView(
            cameraListLayout, new io.evercam.androidapp.custom.FlowLayout.LayoutParams(0, 0));

        index++;

        new Handler()
            .postDelayed(
                new Runnable() {
                  @Override
                  public void run() {

                    Rect cameraBounds = new Rect();
                    cameraListLayout.getHitRect(cameraBounds);

                    Rect offlineIconBounds = cameraLayout.getOfflineIconBounds();
                    int layoutWidth = cameraBounds.right - cameraBounds.left;
                    int offlineStartsAt = offlineIconBounds.left;
                    int offlineIconWidth = offlineIconBounds.right - offlineIconBounds.left;

                    if (layoutWidth > offlineStartsAt + offlineIconWidth * 2) {
                      cameraLayout.showOfflineIconAsFloat = false;
                    } else {
                      cameraLayout.showOfflineIconAsFloat = true;
                    }
                  }
                },
                200);
      }

      if (refresh != null) refresh.setActionView(null);

      return true;
    } catch (Exception e) {
      Log.e(TAG, e.toString(), e);

      sendToMint(e);

      EvercamPlayApplication.sendCaughtException(this, e);
      CustomedDialog.showUnexpectedErrorDialog(CamerasActivity.this);
    }
    return false;
  }