Skip to content

Instantly share code, notes, and snippets.

View mgp's full-sized avatar
🤗

Michael Parker mgp

🤗
View GitHub Profile
@mgp
mgp / gist:55a94fffa1700be10a69
Created August 18, 2015 00:15
No domains found stacktrace
08-17 20:05:50.136 7391-7391/org.khanacademy.android.debug I/art﹕ Late-enabling -Xcheck:jni
08-17 20:05:50.161 7391-7400/org.khanacademy.android.debug E/art﹕ Failed sending reply to debugger: Broken pipe
08-17 20:05:50.161 7391-7400/org.khanacademy.android.debug I/art﹕ Debugger is no longer active
08-17 20:05:50.193 7391-7391/org.khanacademy.android.debug V/AndroidDatabase﹕ ⇢ <init>(path="/data/data/org.khanacademy.android.debug/databases/bookmarks.db")
08-17 20:05:50.229 7391-7391/org.khanacademy.android.debug V/AndroidDatabase﹕ ⇠ <init> [35ms]
08-17 20:05:50.229 7391-7391/org.khanacademy.android.debug V/AndroidDatabase﹕ ⇢ fetchObjectsAndLog(query=SELECT MAX(version) AS version FROM MigrationVersion, transformer=MigrationVersionEntityTransformer)
08-17 20:05:50.229 7391-7391/org.khanacademy.android.debug E/SQLiteLog﹕ (1) no such table: MigrationVersion
08-17 20:05:50.230 7391-7391/org.khanacademy.android.debug V/AndroidDatabase﹕ ⇢ update(query=CREATE TABLE MigrationVersion (version UN
select GrandParentLevel.parent_id as parent_id, ParentLevel.child_id as child_id
from NodeToNode as ParentLevel
inner join NodeToNode as GrandParentLevel
on ParentLevel.parent_id = GrandParentLevel.child_id
where ParentLevel.child_id = 752;
package org.khanacademy.core.mylist;
import static com.google.common.base.Preconditions.checkNotNull;
import org.khanacademy.core.mylist.persistence.database.BookmarkDatabase;
import org.khanacademy.core.net.api.ApiBaseUrl;
import org.khanacademy.core.net.downloadmanager.FileDownloadManager;
import org.khanacademy.core.net.downloadmanager.KhanDownloadableResource;
import org.khanacademy.core.net.downloadmanager.KhanDownloadableResource.Key;
import org.khanacademy.core.net.downloadmanager.VideoDownloadManager;
@mgp
mgp / gist:3adc6c18dd7faf1c6298
Created July 14, 2015 21:00
DownloadEvent progress
DownloadEvent{
type=ADDED,
download=DownloadGroup{
resource=ContentItemIdentifier{
itemKind=VIDEO,
contentId=xb19b2406
},
progress=Progress{
completionPercentage=0
numBytesTotal=0,
package org.khanacademy.core.net.downloadmanager;
import org.khanacademy.core.net.downloadmanager.persistence.database.VideoDownloadManagerDatabase;
import org.khanacademy.core.net.downloadmanager.persistence.models.VideoDownloadEntity;
import org.khanacademy.core.topictree.identifiers.ContentItemIdentifier;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
package org.khanacademy.core.net.videodownloadmanager.okhttp;
import org.khanacademy.core.base.BaseTestCase;
import org.khanacademy.core.net.videodownloadmanager.OkHttpVideoDownloadManager;
import org.junit.Rule;
import org.junit.rules.TemporaryFolder;
/**
* Tests for {@link OkHttpVideoDownloadManager}.
package org.khanacademy.core.net.videodownloadmanager;
import org.khanacademy.core.net.downloadmanager.DownloadManager;
import org.khanacademy.core.net.downloadmanager.okhttp.OkHttpDownloadManager;
import org.khanacademy.core.net.downloadmanager.okhttp.OkHttpDownloadManager.ResourceFunctions;
import org.khanacademy.core.topictree.models.Video;
import org.khanacademy.core.topictree.models.Video.DownloadFormat;
import com.squareup.okhttp.OkHttpClient;
@mgp
mgp / android-development-best-practices.md
Created June 19, 2015 01:51
Android development best practices

Prefer Immutability

Our principal goal as programmers is to reduce complexity. At any point in a program, we can reason about the state of a constant trivially -- its state is the state upon assignment. By contrast, the state of a variable can change endlessly.

With judicious use, immutable objects can lead to quicker execution speed and lower memory usage. The hash value of a String, the query parameters of an immutable URL, and the distance traced by an immutable sequence of points are all immutable as well. We can cache their values for later use instead of recompute them on every access. We can also share an immutable object with clients without requiring those clients to defensively copy it.

An immutable value is safe in many ways. For example, String is immutable and so its hashCode value is immutable. Consequently, it is safe to use as a String as a key in a Map: The lower order bits of that hash will never change, and so an inserted key will never reside in the wrong bucket. An immutab

/**
* Describes the expected observed values by an observable, for testing that an observable
* emits those described values.
*/
public static final class ExpectedObservedEvents<E> {
public enum TerminalEvent {
COMPLETED,
ERROR
}
package org.khanacademy.android.ui.videos;
import org.khanacademy.android.logging.Logger;
import org.khanacademy.android.ui.videos.VideoViewActivity.VideoPlayer;
import org.khanacademy.core.progress.ProgressUpdater;
import org.khanacademy.core.progress.models.VideoUserProgress;
import org.khanacademy.core.topictree.identifiers.ContentItemIdentifier;
import org.khanacademy.core.util.ObservableUtils;
import com.google.common.base.Preconditions;