ReportUploader.java 9.85 KB
package com.crashlytics.android.core;

import io.fabric.sdk.android.Fabric;
import io.fabric.sdk.android.Logger;
import io.fabric.sdk.android.services.common.BackgroundPriorityRunnable;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;

class ReportUploader
{
  private static final String CLS_FILE_EXT = ".cls";
  static final Map<String, String> HEADER_INVALID_CLS_FILE = Collections.singletonMap("X-CRASHLYTICS-INVALID-SESSION", "1");
  private static final short[] RETRY_INTERVALS = { 10, 20, 30, 60, 120, 300 };
  private static final FilenameFilter crashFileFilter = new FilenameFilter()
  {
    public final boolean accept(File paramAnonymousFile, String paramAnonymousString)
    {
      return (paramAnonymousString.endsWith(".cls")) && (!paramAnonymousString.contains("Session"));
    }
  };
  private final String apiKey;
  private final CreateReportSpiCall createReportCall;
  private final Object fileAccessLock = new Object();
  private Thread uploadThread;
  
  public ReportUploader(String paramString, CreateReportSpiCall paramCreateReportSpiCall)
  {
    if (paramCreateReportSpiCall == null) {
      throw new IllegalArgumentException("createReportCall must not be null.");
    }
    this.createReportCall = paramCreateReportSpiCall;
    this.apiKey = paramString;
  }
  
  List<Report> findReports()
  {
    Fabric.getLogger().d("CrashlyticsCore", "Checking for crash reports...");
    Object localObject2 = CrashlyticsCore.getInstance().getController();
    int j;
    int i;
    Object localObject5;
    synchronized (this.fileAccessLock)
    {
      localObject4 = ((CrashlyticsController)localObject2).getFilesDir().listFiles(crashFileFilter);
      localObject2 = ((CrashlyticsController)localObject2).getInvalidFilesDir().listFiles();
      ??? = new LinkedList();
      j = localObject4.length;
      i = 0;
      if (i < j)
      {
        localObject5 = localObject4[i];
        Fabric.getLogger().d("CrashlyticsCore", "Found crash report " + ((File)localObject5).getPath());
        ((List)???).add(new SessionReport((File)localObject5));
        i += 1;
      }
    }
    Object localObject4 = new HashMap();
    Object localObject6;
    if (localObject3 != null)
    {
      j = localObject3.length;
      i = 0;
      while (i < j)
      {
        localObject5 = localObject3[i];
        localObject6 = CrashlyticsController.getSessionIdFromSessionFile((File)localObject5);
        if (!((Map)localObject4).containsKey(localObject6)) {
          ((Map)localObject4).put(localObject6, new LinkedList());
        }
        ((List)((Map)localObject4).get(localObject6)).add(localObject5);
        i += 1;
      }
    }
    Iterator localIterator = ((Map)localObject4).keySet().iterator();
    while (localIterator.hasNext())
    {
      localObject5 = (String)localIterator.next();
      Fabric.getLogger().d("CrashlyticsCore", "Found invalid session: " + (String)localObject5);
      localObject6 = (List)((Map)localObject4).get(localObject5);
      ((List)???).add(new InvalidSessionReport((String)localObject5, (File[])((List)localObject6).toArray(new File[((List)localObject6).size()])));
    }
    if (((List)???).isEmpty()) {
      Fabric.getLogger().d("CrashlyticsCore", "No reports found.");
    }
    return (List<Report>)???;
  }
  
  boolean forceUpload(Report paramReport)
  {
    boolean bool2 = false;
    synchronized (this.fileAccessLock)
    {
      try
      {
        localObject1 = new CreateReportRequest(this.apiKey, paramReport);
        boolean bool3 = this.createReportCall.invoke((CreateReportRequest)localObject1);
        Logger localLogger = Fabric.getLogger();
        StringBuilder localStringBuilder = new StringBuilder("Crashlytics report upload ");
        if (!bool3) {
          break label111;
        }
        localObject1 = "complete: ";
        localLogger.i("CrashlyticsCore", (String)localObject1 + paramReport.getIdentifier());
        bool1 = bool2;
        if (bool3)
        {
          paramReport.remove();
          bool1 = true;
        }
      }
      catch (Exception localException)
      {
        for (;;)
        {
          Object localObject1;
          label111:
          Fabric.getLogger().e("CrashlyticsCore", "Error occurred sending report " + paramReport, localException);
          boolean bool1 = bool2;
        }
      }
      return bool1;
      localObject1 = "FAILED: ";
    }
  }
  
  boolean isUploading()
  {
    return this.uploadThread != null;
  }
  
  /* Error */
  public void uploadReports(float paramFloat, SendCheck paramSendCheck)
  {
    // Byte code:
    //   0: aload_0
    //   1: monitorenter
    //   2: aload_0
    //   3: getfield 80	com/crashlytics/android/core/ReportUploader:uploadThread	Ljava/lang/Thread;
    //   6: ifnull +19 -> 25
    //   9: invokestatic 90	io/fabric/sdk/android/Fabric:getLogger	()Lio/fabric/sdk/android/Logger;
    //   12: ldc 92
    //   14: ldc_w 270
    //   17: invokeinterface 100 3 0
    //   22: aload_0
    //   23: monitorexit
    //   24: return
    //   25: aload_0
    //   26: new 272	java/lang/Thread
    //   29: dup
    //   30: new 14	com/crashlytics/android/core/ReportUploader$Worker
    //   33: dup
    //   34: aload_0
    //   35: fload_1
    //   36: aload_2
    //   37: invokespecial 275	com/crashlytics/android/core/ReportUploader$Worker:<init>	(Lcom/crashlytics/android/core/ReportUploader;FLcom/crashlytics/android/core/ReportUploader$SendCheck;)V
    //   40: ldc_w 277
    //   43: invokespecial 280	java/lang/Thread:<init>	(Ljava/lang/Runnable;Ljava/lang/String;)V
    //   46: putfield 80	com/crashlytics/android/core/ReportUploader:uploadThread	Ljava/lang/Thread;
    //   49: aload_0
    //   50: getfield 80	com/crashlytics/android/core/ReportUploader:uploadThread	Ljava/lang/Thread;
    //   53: invokevirtual 283	java/lang/Thread:start	()V
    //   56: goto -34 -> 22
    //   59: astore_2
    //   60: aload_0
    //   61: monitorexit
    //   62: aload_2
    //   63: athrow
    // Local variable table:
    //   start	length	slot	name	signature
    //   0	64	0	this	ReportUploader
    //   0	64	1	paramFloat	float
    //   0	64	2	paramSendCheck	SendCheck
    // Exception table:
    //   from	to	target	type
    //   2	22	59	finally
    //   25	56	59	finally
  }
  
  static final class AlwaysSendCheck
    implements ReportUploader.SendCheck
  {
    public final boolean canSendReports()
    {
      return true;
    }
  }
  
  static abstract interface SendCheck
  {
    public abstract boolean canSendReports();
  }
  
  class Worker
    extends BackgroundPriorityRunnable
  {
    private final float delay;
    private final ReportUploader.SendCheck sendCheck;
    
    Worker(float paramFloat, ReportUploader.SendCheck paramSendCheck)
    {
      this.delay = paramFloat;
      this.sendCheck = paramSendCheck;
    }
    
    private void attemptUploadWithRetry()
    {
      Fabric.getLogger().d("CrashlyticsCore", "Starting report processing in " + this.delay + " second(s)...");
      if (this.delay > 0.0F) {}
      for (;;)
      {
        CrashlyticsController localCrashlyticsController;
        try
        {
          Thread.sleep((this.delay * 1000.0F));
          localCrashlyticsController = CrashlyticsCore.getInstance().getController();
          List localList = ReportUploader.this.findReports();
          if (localCrashlyticsController.isHandlingException()) {
            return;
          }
        }
        catch (InterruptedException localInterruptedException1)
        {
          Thread.currentThread().interrupt();
          return;
        }
        Object localObject;
        if ((!localInterruptedException1.isEmpty()) && (!this.sendCheck.canSendReports()))
        {
          Fabric.getLogger().d("CrashlyticsCore", "User declined to send. Removing " + localInterruptedException1.size() + " Report(s).");
          localObject = localInterruptedException1.iterator();
          while (((Iterator)localObject).hasNext()) {
            ((Report)((Iterator)localObject).next()).remove();
          }
        }
        else
        {
          int i = 0;
          while ((!((List)localObject).isEmpty()) && (!localCrashlyticsController.isHandlingException()))
          {
            Fabric.getLogger().d("CrashlyticsCore", "Attempting to send " + ((List)localObject).size() + " report(s)");
            localObject = ((List)localObject).iterator();
            while (((Iterator)localObject).hasNext())
            {
              Report localReport = (Report)((Iterator)localObject).next();
              ReportUploader.this.forceUpload(localReport);
            }
            localObject = ReportUploader.this.findReports();
            if (!((List)localObject).isEmpty())
            {
              long l = ReportUploader.RETRY_INTERVALS[Math.min(i, ReportUploader.RETRY_INTERVALS.length - 1)];
              Fabric.getLogger().d("CrashlyticsCore", "Report submisson: scheduling delayed retry in " + l + " seconds");
              try
              {
                Thread.sleep(l * 1000L);
                i += 1;
              }
              catch (InterruptedException localInterruptedException2)
              {
                Thread.currentThread().interrupt();
                return;
              }
            }
          }
        }
      }
    }
    
    public void onRun()
    {
      try
      {
        attemptUploadWithRetry();
        ReportUploader.access$002(ReportUploader.this, null);
        return;
      }
      catch (Exception localException)
      {
        for (;;)
        {
          Fabric.getLogger().e("CrashlyticsCore", "An unexpected error occurred while attempting to upload crash reports.", localException);
        }
      }
    }
  }
}


/* Location:              /home/merong/decompile/hackery-dex2jar.jar!/com/crashlytics/android/core/ReportUploader.class
 * Java compiler version: 6 (50.0)
 * JD-Core Version:       0.7.1
 */