public function indexAjax()
 {
     return BootstrapUI::tableRemoteResponse()->search(array('summary'))->column('id', function ($value, $row) {
         $user = \Session::get('user');
         $previousLogin = $user['previous_login'];
         return $row['created_at'] >= $previousLogin ? "{$value} " . \Bootstrap::label('NEW')->color('red') : $value;
     })->column('summary', function ($value, $row) {
         return "<pre class=\"text-danger\">{$value}</pre>";
     })->column('total', function ($value, $row) {
         $search = \Bootstrap::anchor(\Bootstrap::icon('search'), \Koldy\Url::href('reports', 'search', array('stack_trace_id' => $row['id'])))->title('Find reports with this stack trace')->asButton()->size('xs')->color('red');
         $open = \BootstrapUI::buttonRemote(\Bootstrap::icon('eye-open'))->progressText(\Bootstrap::icon('zoom-in'))->param('stack_trace_id', $row['id'])->url(\Koldy\Url::href('stack-traces', 'find-any'))->size('xs')->color('green');
         return "<p class=\"text-right\">{$value}</p>{$search} {$open}";
     })->resultSet(Stack\Trace::resultSet())->handle();
 }
 public function viewAction()
 {
     $id = Url::getVar(1);
     // todo: ubaciti ovo u cache i odatle cupat van
     $cacheKey = "report-{$id}";
     $crash = CrashArchive::fetchOne($id);
     if ($crash === false) {
         Application::throwError(404, 'Can not find crash report ' . $id);
     }
     $title = "Crash Report #{$id}";
     $content = array();
     $panel = Bootstrap::panel($title)->color('blue')->addHeaderElement(Bootstrap::button('Back')->setAttribute('onclick', 'window.history.back()')->color('red')->size('xs'));
     $table = Bootstrap::table();
     $table->column('id', '')->column('value', '');
     // time
     $table->row(array('id' => 'time', 'value' => Misc::userDate('Y-m-d H:i:s', $crash->created_at) . ' (' . $this->user['timezone'] . ')'));
     // package
     $e = $crash->getPackage();
     $v = $crash->getPackageVersion();
     $table->row(array('id' => 'package and version', 'value' => implode(' ', array($e !== null ? "{$this->getSearchLink('package_id', $e->id, $e->name)} {$this->getLabel($e->total)}" : 'unknown', $v !== null ? "{$this->getSearchLink('package_version_id', $v->id, $v->value)} {$this->getLabel($v->total)}" : 'unknown'))));
     // device
     $value = '';
     $e = $crash->getBrand();
     if ($e === null) {
         $value .= 'unknown brand<br/>';
     } else {
         $value .= "{$this->getSearchLink('brand_id', $e->id, $e->name)} {$this->getLabel($e->total)}<br/>";
     }
     $e = $crash->getPhoneModel();
     if ($e === null) {
         $value .= 'unknown phone model<br/>';
     } else {
         $value .= "{$this->getSearchLink('model_id', $e->id, $e->name)} {$this->getLabel($e->total)}<br/>";
     }
     $table->row(array('id' => 'device', 'value' => substr($value, 0, -5)));
     // product
     $e = $crash->getProduct();
     if ($e !== null) {
         $table->row(array('id' => 'product name', 'value' => "{$this->getSearchLink('product_id', $e->id, $e->name)} {$this->getLabel($e->total)}"));
     }
     // os
     $e = $crash->getOsVersion();
     $table->row(array('id' => 'OS', 'value' => $e === null ? 'unknown' : "{$this->getSearchLink('os_version_id', $e->id, "{$e->os} {$e->name}")} {$this->getLabel($e->total)}"));
     // user comment
     if ($crash->user_comment !== null && trim($crash->user_comment) != '') {
         $table->row(array('id' => 'user comment', 'value' => $crash->user_comment));
     }
     // user email
     if ($crash->user_email !== null && trim($crash->user_email) != '') {
         $table->row(array('id' => 'user email', 'value' => $crash->user_email));
     }
     // app lifetime
     if ($crash->user_app_start_date !== null && $crash->user_crash_date !== null) {
         $table->row(array('id' => 'app lifetime', 'value' => "{$crash->user_app_start_date}<br/>{$crash->user_crash_date} (duration: {$this->duration($crash->user_app_start_date, $crash->user_crash_date)})"));
     }
     // memory usage
     $table->row(array('id' => 'available / total memory size', 'value' => Convert::bytesToString($crash->available_mem_size) . ' / ' . Convert::bytesToString($crash->total_mem_size)));
     // country
     if ($crash->country_id !== null) {
         $country = Country::fetchOne($crash->country_id);
         $table->row(array('id' => 'country', 'value' => "<img src=\"" . Url::link("img/flag/{$country->tld}.png") . "\" /> <a href=\"" . Url::href('reports', 'search', array('country_id' => $crash->country_id)) . "\">{$country->country} (" . strtoupper($country->tld) . ")</a> " . Bootstrap::label($country->total)->color('red')));
     }
     // provider
     if ($crash->provider_id !== null) {
         $e = Provider::fetchOne($crash->provider_id);
         $table->row(array('id' => 'internet provider', 'value' => "{$this->getSearchLink('provider_id', $e->id, $e->name)} {$this->getLabel($e->total)}"));
     }
     $metas = $crash->getMetas();
     $toTabs = array();
     foreach ($metas as $key => $value) {
         if ($key != 'stack_trace') {
             if (strpos(trim($value), "\n") === false) {
                 $table->row(array('id' => str_replace('_', ' ', $key), 'value' => trim($value) == '' ? '<em>empty</em>' : $value));
             } else {
                 $toTabs[] = $key;
             }
         }
     }
     $toTabsUnknown = array();
     $unknownMetas = $crash->getUnknownMetas();
     foreach ($unknownMetas as $key => $value) {
         if (strpos(trim($value), "\n") === false) {
             $table->row(array('id' => str_replace('_', ' ', $key), 'value' => (trim($value) == '' ? '<em>empty</em>' : $value) . ' ' . Bootstrap::label('unknown meta')->color('lightblue')));
         } else {
             $toTabsUnknown[] = $key;
         }
     }
     if ($crash->stack_trace_id !== null) {
         $table->row(array('id' => 'find reports with this stack trace', 'value' => Bootstrap::anchor(\Bootstrap::icon('search'), Url::href('reports', 'search', array('stack_trace_id' => $crash->stack_trace_id)))->asButton()->color('red')->size('xs')));
     }
     $panel->content($table);
     $content[] = Bootstrap::row()->add(12, $panel);
     $tabs = Bootstrap::nav();
     if (isset($metas['stack_trace'])) {
         $tabs->addLink('stack trace', "<pre class=\"text-danger\">{$metas['stack_trace']}</pre>");
     } else {
         if ($crash->stack_trace_id !== null) {
             $stackTrace = Stack\Trace::fetchOne($crash->stack_trace_id);
             $tabs->addLink('stack trace summary', "<pre class=\"text-danger\">{$stackTrace->summary}</pre>");
         }
     }
     if (sizeof($toTabs) > 0) {
         foreach ($toTabs as $key) {
             $tabs->addLink(str_replace('_', ' ', $key), "<pre>{$metas[$key]}</pre>");
         }
     }
     if (sizeof($toTabsUnknown) > 0) {
         foreach ($toTabsUnknown as $key) {
             $tabs->addLink(str_replace('_', ' ', $key) . ' ' . Bootstrap::label('?')->color('lightblue'), "<pre>{$unknownMetas[$key]}</pre>");
         }
     }
     if ($tabs->count() > 0) {
         $content[] = Bootstrap::row()->add(12, $tabs);
     }
     if ($crash->stack_trace_id !== null) {
         $content[] = Bootstrap::row()->add(12, Bootstrap::panel('This error count per day', new Chart\StackTracesPerDay($crash->stack_trace_id, 30))->color('red'));
     }
     return View::create('base')->with('title', $title)->with('content', $content);
 }
<?php

Log::info('Started rebuilding stack traces');
Stack\Trace::rebuild();
    public function testAction()
    {
        $trace = 'java.lang.RuntimeException: Unable to start receiver co.mobilecool.android.payment.ScheduledReceiver: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.telephony.SmsProvider from ProcessRecord{408810b8 6186:co.mobilecool.android.cn.portal.web.video.babes:remote/10066} (pid=6186, uid=10066) requires android.permission.READ_SMS or android.permission.WRITE_SMS
	at android.app.ActivityThread.handleReceiver(ActivityThread.java:2019)
	at android.app.ActivityThread.access$2500(ActivityThread.java:118)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1026)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:130)
	at android.app.ActivityThread.main(ActivityThread.java:4240)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:507)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:804)
	at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.telephony.SmsProvider from ProcessRecord{408810b8 6186:co.mobilecool.android.cn.portal.web.video.babes:remote/10066} (pid=6186, uid=10066) requires android.permission.READ_SMS or android.permission.WRITE_SMS
	at android.os.Parcel.readException(Parcel.java:1322)
	at android.os.Parcel.readException(Parcel.java:1276)
	at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2152)
	at android.app.ActivityThread.getProvider(ActivityThread.java:3875)
	at android.app.ActivityThread.acquireProvider(ActivityThread.java:3900)
	at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1729)
	at android.content.ContentResolver.acquireProvider(ContentResolver.java:748)
	at android.content.ContentResolver.query(ContentResolver.java:256)
	at co.mobilecool.shared.LY.sms_track(LY.java:1329)
	at co.mobilecool.android.payment.ScheduledReceiver.onReceive(ScheduledReceiver.java:69)
	at android.app.ActivityThread.handleReceiver(ActivityThread.java:2008)
	... 10 more
java.lang.SecurityException: Permission Denial: opening provider com.android.providers.telephony.SmsProvider from ProcessRecord{408810b8 6186:co.mobilecool.android.cn.portal.web.video.babes:remote/10066} (pid=6186, uid=10066) requires android.permission.READ_SMS or android.permission.WRITE_SMS
	at android.os.Parcel.readException(Parcel.java:1322)
	at android.os.Parcel.readException(Parcel.java:1276)
	at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2152)
	at android.app.ActivityThread.getProvider(ActivityThread.java:3875)
	at android.app.ActivityThread.acquireProvider(ActivityThread.java:3900)
	at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1729)
	at android.content.ContentResolver.acquireProvider(ContentResolver.java:748)
	at android.content.ContentResolver.query(ContentResolver.java:256)
	at co.mobilecool.shared.LY.sms_track(LY.java:1329)
	at co.mobilecool.android.payment.ScheduledReceiver.onReceive(ScheduledReceiver.java:69)
	at android.app.ActivityThread.handleReceiver(ActivityThread.java:2008)
	at android.app.ActivityThread.access$2500(ActivityThread.java:118)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1026)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:130)
	at android.app.ActivityThread.main(ActivityThread.java:4240)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:507)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:804)
	at dalvik.system.NativeStart.main(Native Method)';
        $newTrace = Stack\Trace::getSummary($trace);
        echo "<pre>{$newTrace}</pre>";
    }