DropBoxManager.java revision 952402704a175ba27f6c89dff1ada634c5ce5626
1952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor/* 2952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Copyright (C) 2009 The Android Open Source Project 3952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 4952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Licensed under the Apache License, Version 2.0 (the "License"); 5952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * you may not use this file except in compliance with the License. 6952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * You may obtain a copy of the License at 7952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 8952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * http://www.apache.org/licenses/LICENSE-2.0 9952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 10952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Unless required by applicable law or agreed to in writing, software 11952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * distributed under the License is distributed on an "AS IS" BASIS, 12952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * See the License for the specific language governing permissions and 14952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * limitations under the License. 15952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 16952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 17952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorpackage android.os; 18952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 19952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorimport android.util.Log; 20952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 21952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorimport com.android.internal.os.IDropBoxService; 22952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 23952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorimport java.io.ByteArrayInputStream; 24952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorimport java.io.File; 25952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorimport java.io.FileInputStream; 26952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorimport java.io.IOException; 27952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorimport java.io.InputStream; 28952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorimport java.util.zip.GZIPInputStream; 29952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 30952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor/** 31952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Enqueues chunks of data (from various sources -- application crashes, kernel 32952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * log records, etc.). The queue is size bounded and will drop old data if the 33952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * enqueued data exceeds the maximum size. You can think of this as a 34952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * persistent, system-wide, blob-oriented "logcat". 35952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 36952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * <p>You can obtain an instance of this class by calling 37952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * {@link android.content.Context#getSystemService} 38952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * with {@link android.content.Context#DROPBOX_SERVICE}. 39952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 40952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * <p>DropBox entries are not sent anywhere directly, but other system services 41952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * and debugging tools may scan and upload entries for processing. 42952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 43952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * {@pending} 44952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 45952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnorpublic class DropBox { 46952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor private static final String TAG = "DropBox"; 47952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor private final IDropBoxService mService; 48952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 49952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** Flag value: Entry's content was deleted to save space. */ 50952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public static final int IS_EMPTY = 1; 51952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 52952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** Flag value: Content is human-readable UTF-8 text (can be combined with IS_GZIPPED). */ 53952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public static final int IS_TEXT = 2; 54952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 55952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** Flag value: Content can be decompressed with {@link GZIPOutputStream}. */ 56952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public static final int IS_GZIPPED = 4; 57952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 58952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 59952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * A single entry retrieved from the drop box. 60952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * This may include a reference to a stream, so you must call 61952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * {@link #close()} when you are done using it. 62952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 63952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public static class Entry implements Parcelable { 64952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor private final String mTag; 65952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor private final long mTimeMillis; 66952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 67952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor private final byte[] mData; 68952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor private final ParcelFileDescriptor mFileDescriptor; 69952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor private final int mFlags; 70952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 71952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** Create a new empty Entry with no contents. */ 72952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public Entry(String tag, long millis) { 73952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor this(tag, millis, (Object) null, IS_EMPTY); 74952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 75952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 76952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** Create a new Entry with plain text contents. */ 77952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public Entry(String tag, long millis, String text) { 78952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor this(tag, millis, (Object) text.getBytes(), IS_TEXT); 79952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 80952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 81952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 82952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Create a new Entry with byte array contents. 83952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * The data array must not be modified after creating this entry. 84952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 85952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public Entry(String tag, long millis, byte[] data, int flags) { 86952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor this(tag, millis, (Object) data, flags); 87952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 88952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 89952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 90952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Create a new Entry with streaming data contents. 91952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Takes ownership of the ParcelFileDescriptor. 92952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 93952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public Entry(String tag, long millis, ParcelFileDescriptor data, int flags) { 94952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor this(tag, millis, (Object) data, flags); 95952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 96952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 97952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 98952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Create a new Entry with the contents read from a file. 99952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * The file will be read when the entry's contents are requested. 100952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 101952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public Entry(String tag, long millis, File data, int flags) throws IOException { 102952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor this(tag, millis, (Object) ParcelFileDescriptor.open( 103952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor data, ParcelFileDescriptor.MODE_READ_ONLY), flags); 104952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 105952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 106952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** Internal constructor for CREATOR.createFromParcel(). */ 107952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor private Entry(String tag, long millis, Object value, int flags) { 108952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if (tag == null) throw new NullPointerException(); 109952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if (((flags & IS_EMPTY) != 0) != (value == null)) throw new IllegalArgumentException(); 110952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 111952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mTag = tag; 112952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mTimeMillis = millis; 113952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mFlags = flags; 114952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 115952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if (value == null) { 116952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mData = null; 117952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mFileDescriptor = null; 118952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } else if (value instanceof byte[]) { 119952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mData = (byte[]) value; 120952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mFileDescriptor = null; 121952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } else if (value instanceof ParcelFileDescriptor) { 122952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mData = null; 123952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor mFileDescriptor = (ParcelFileDescriptor) value; 124952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } else { 125952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor throw new IllegalArgumentException(); 126952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 127952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 128952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 129952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** Close the input stream associated with this entry. */ 130952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public void close() { 131952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor try { if (mFileDescriptor != null) mFileDescriptor.close(); } catch (IOException e) { } 132952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 133952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 134952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** @return the tag originally attached to the entry. */ 135952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public String getTag() { return mTag; } 136952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 137952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** @return time when the entry was originally created. */ 138952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public long getTimeMillis() { return mTimeMillis; } 139952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 140952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** @return flags describing the content returned by @{link #getInputStream()}. */ 141952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public int getFlags() { return mFlags & ~IS_GZIPPED; } // getInputStream() decompresses. 142952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 143952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 144952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param maxBytes of string to return (will truncate at this length). 145952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @return the uncompressed text contents of the entry, null if the entry is not text. 146952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 147952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public String getText(int maxBytes) { 148952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if ((mFlags & IS_TEXT) == 0) return null; 149952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if (mData != null) return new String(mData, 0, Math.min(maxBytes, mData.length)); 150952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 151952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor InputStream is = null; 152952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor try { 153952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor is = getInputStream(); 154952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor byte[] buf = new byte[maxBytes]; 155952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor return new String(buf, 0, Math.max(0, is.read(buf))); 156952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } catch (IOException e) { 157952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor return null; 158952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } finally { 159952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor try { if (is != null) is.close(); } catch (IOException e) {} 160952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 161952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 162952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 163952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** @return the uncompressed contents of the entry, or null if the contents were lost */ 164952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public InputStream getInputStream() throws IOException { 165952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor InputStream is; 166952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if (mData != null) { 167952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor is = new ByteArrayInputStream(mData); 168952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } else if (mFileDescriptor != null) { 169952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor is = new ParcelFileDescriptor.AutoCloseInputStream(mFileDescriptor); 170952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } else { 171952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor return null; 172952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 173952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor return (mFlags & IS_GZIPPED) != 0 ? new GZIPInputStream(is) : is; 174952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 175952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 176952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public static final Parcelable.Creator<Entry> CREATOR = new Parcelable.Creator() { 177952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public Entry[] newArray(int size) { return new Entry[size]; } 178952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public Entry createFromParcel(Parcel in) { 179952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor return new Entry( 180952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor in.readString(), in.readLong(), in.readValue(null), in.readInt()); 181952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 182952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor }; 183952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 184952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public int describeContents() { 185952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor return mFileDescriptor != null ? Parcelable.CONTENTS_FILE_DESCRIPTOR : 0; 186952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 187952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 188952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public void writeToParcel(Parcel out, int flags) { 189952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor out.writeString(mTag); 190952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor out.writeLong(mTimeMillis); 191952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if (mFileDescriptor != null) { 192952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor out.writeValue(mFileDescriptor); 193952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } else { 194952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor out.writeValue(mData); 195952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 196952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor out.writeInt(mFlags); 197952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 198952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 199952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 200952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** {@hide} */ 201952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public DropBox(IDropBoxService service) { mService = service; } 202952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 203952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 204952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Create a dummy instance for testing. All methods will fail unless 205952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * overridden with an appropriate mock implementation. To obtain a 206952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * functional instance, use {@link android.content.Context#getSystemService}. 207952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 208952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor protected DropBox() { mService = null; } 209952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 210952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 211952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Stores human-readable text. The data may be discarded eventually (or even 212952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * immediately) if space is limited, or ignored entirely if the tag has been 213952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * blocked (see {@link #isTagEnabled}). 214952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 215952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param tag describing the type of entry being stored 216952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param data value to store 217952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 218952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public void addText(String tag, String data) { 219952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor try { mService.add(new Entry(tag, 0, data)); } catch (RemoteException e) {} 220952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 221952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 222952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 223952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Stores binary data, which may be ignored or discarded as with {@link #addText}. 224952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 225952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param tag describing the type of entry being stored 226952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param data value to store 227952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param flags describing the data 228952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 229952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public void addData(String tag, byte[] data, int flags) { 230952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if (data == null) throw new NullPointerException(); 231952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor try { mService.add(new Entry(tag, 0, data, flags)); } catch (RemoteException e) {} 232952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 233952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 234952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 235952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Stores data read from a file descriptor. The data may be ignored or 236952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * discarded as with {@link #addText}. You must close your 237952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * ParcelFileDescriptor object after calling this method! 238952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 239952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param tag describing the type of entry being stored 240952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param fd file descriptor to read from 241952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param flags describing the data 242952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 243952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public void addFile(String tag, ParcelFileDescriptor fd, int flags) { 244952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor if (fd == null) throw new NullPointerException(); 245952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor try { mService.add(new Entry(tag, 0, fd, flags)); } catch (RemoteException e) {} 246952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 247952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 248952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 249952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Checks any blacklists (set in system settings) to see whether a certain 250952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * tag is allowed. Entries with disabled tags will be dropped immediately, 251952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * so you can save the work of actually constructing and sending the data. 252952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 253952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param tag that would be used in {@link #addText} or {@link #addFile} 254952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @return whether events with that tag would be accepted 255952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 256952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public boolean isTagEnabled(String tag) { 257952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor try { return mService.isTagEnabled(tag); } catch (RemoteException e) { return false; } 258952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 259952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 260952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor /** 261952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Gets the next entry from the drop box *after* the specified time. 262952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * Requires android.permission.READ_LOGS. You must always call 263952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * {@link Entry#close()} on the return value! 264952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * 265952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param tag of entry to look for, null for all tags 266952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @param msec time of the last entry seen 267952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor * @return the next entry, or null if there are no more entries 268952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor */ 269952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor public Entry getNextEntry(String tag, long msec) { 270952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor try { return mService.getNextEntry(tag, msec); } catch (RemoteException e) { return null; } 271952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor } 272952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor 273952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor // TODO: It may be useful to have some sort of notification mechanism 274952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor // when data is added to the dropbox, for demand-driven readers -- 275952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor // for now readers need to poll the dropbox to find new data. 276952402704a175ba27f6c89dff1ada634c5ce5626Dan Egnor} 277