From 7b37864ce4a9cc338c8ffab508d45a2aa7e830be Mon Sep 17 00:00:00 2001 From: Dan Egnor Date: Tue, 19 Jan 2010 23:08:56 -0800 Subject: [PATCH] Bug report uploader utility. This version is very bare-bones -- it just makes a list of filenames, you tap on one and it makes a gmail (or whatever) message with the file attached to it (and a default subject/body). But it's a start, and I think much better than nothing. --- apps/BugReportSender/Android.mk | 23 ++++ apps/BugReportSender/AndroidManifest.xml | 38 ++++++ .../res/drawable-hdpi/icon.png | Bin 0 -> 5141 bytes .../res/drawable-mdpi/icon.png | Bin 0 -> 3133 bytes .../BugReportListActivity.java | 118 ++++++++++++++++++ 5 files changed, 179 insertions(+) create mode 100644 apps/BugReportSender/Android.mk create mode 100644 apps/BugReportSender/AndroidManifest.xml create mode 100755 apps/BugReportSender/res/drawable-hdpi/icon.png create mode 100644 apps/BugReportSender/res/drawable-mdpi/icon.png create mode 100644 apps/BugReportSender/src/com/android/bugreportsender/BugReportListActivity.java diff --git a/apps/BugReportSender/Android.mk b/apps/BugReportSender/Android.mk new file mode 100644 index 000000000..b94f8026d --- /dev/null +++ b/apps/BugReportSender/Android.mk @@ -0,0 +1,23 @@ +# Copyright (C) 2009 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_CERTIFICATE := platform +LOCAL_MODULE_TAGS := eng +LOCAL_PACKAGE_NAME := BugReportSender +LOCAL_SDK_VERSION := current +LOCAL_SRC_FILES := $(call all-subdir-java-files) +include $(BUILD_PACKAGE) diff --git a/apps/BugReportSender/AndroidManifest.xml b/apps/BugReportSender/AndroidManifest.xml new file mode 100644 index 000000000..39c1d7e04 --- /dev/null +++ b/apps/BugReportSender/AndroidManifest.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/BugReportSender/res/drawable-hdpi/icon.png b/apps/BugReportSender/res/drawable-hdpi/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..60fbdf5d04036e99aba75594abbf79692a5fd7e8 GIT binary patch literal 5141 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 DL2cLQ literal 0 HcmV?d00001 diff --git a/apps/BugReportSender/res/drawable-mdpi/icon.png b/apps/BugReportSender/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cb40a1988b52c2df592789d7b1b886208dbcab83 GIT binary patch literal 3133 zcmV-D48rq?P)1!!0#xO!$?fgV?!3>u zAI~$hS+=;iNdL>9W&gJT%KOSAlo2CB&@Gmg9U+p3hSm*@e&hj^o-XxDqMFDE8^)6m zS+XpmD8j{7bYJl+#oZqyfaRBZgKW_**lkk=KQcla-{LEgx>jP(d{jL!{Zy%!GSU+n zn`~Q9KA$JCGE3n?gBm9TctDbrvJM~vn{OKr&-a|l!D_#?f~GJ5^(c}%ilamI4+Mbs zy7v%f{)hRVJYt7KrhRSpg;@%v0suG3hc|y?^Nx;z@WEJ%<^7crk)ge`%CaroA4EY& zl6H*UI=1KX=Rk`Bm}o1*Go1j!rUZzJ0-!=lMu!*>a6S)@?7Q=h?MG%xGhY`%Orjz5 zEaXk3?!!%Zu-t=tc5M63w(v3oK>QUIB8Cx#YSoMKU7o2mru&u@VN0>~R== z9fzLdILh!wqoIuF<46X4I45N|x^u_Q@Ny;bFWG3J)4844${UiLz5?;=%9j4E`XJGD z!qatJwbtCQhQW~2o2LSR$QFA{s(S#qA0Rd$+LohTVZN8Wp8)n~(?!Qg!Gpt4K3iO0 zq(YxV`PEKhyoJA&~y?;#I`BiJE99(NN;(-)LtSy9~~p2iPvOk<>hIhxap$dowt-2JLEtk^%e`?Suhx z3f?%A29a56_A$WLRP5?d!1I`T9fU`E7TZU9)^$Fl65IeZB$!mM$N=CY4zb2UaH_Je z^fpfPp?wPN3bfCdW6RvhU{0Z(A3$;a@KzqEak8NXLRHXVi=Jx+)}W%;+PIeNx)a7X zaZlaVVU+_{^f<;l8jeVTv6A~xPVwg+sRiW&m5ec%V}6?^H1-STKwuK6 zU1g+BI;bC=uw6HV2PTQ0z8@F-BqtOXz!TQcIML`Pq8p1QyhH+CXW~jd^}}5&$e$2_lyVLP3J&&dFo#( zqm}DTtSh}^0#EMWM!5ov&$X|Mu6XBb`E~eiRw=pzWpw^%=d(d_tZ1QR$zEyq7DtQg z5T;j}u;FN^oAwsk>Fz4j?EzMj2ha5YnfW(<;3QqBkf?rH46s5<{2b2rFy9OP;VE7;~N!`4dn5%={L&yi)4>h4B#$P=~>2-l)yX2gx zYHbsHYz5CP6lN6l%S=8Yv!y9ib2Imenh`Uz8cS&?tQ{cot}-&?CbZ9^^`L#?f&jd_ zw*g5zrPvM2#zcj370Qjb%Oyv}TB5;YljPK9wCgjeMGp+I=gSERiZ~)WSXn8fHfzVM zigD>Q0Qrr`u<|t~ls?HRkjw*^_8<_C=!#-iRdKvaOXEnL;qH$YRzpc%fdQe2=gAL&PQbrm=Pisd1u?V$s%HS_!zW=Noy!pLdNq zJ(DpVdfE77A!2qJC_^2Zhm|PDCX)|)L9Rt5S->Ku8R}UR+7mXUL6%FbrxRAJrZ!(> z3`?)ymPm<+t4%y+hfI|5!jmG zUNDd|%S}SvLMf4Eb?HUpN3668Mh~SND;(8KX=g3+H*@=0ztBgdtTl3C~9yfCqIwjnmz zz1gKb(DX>u5jrl^sc&TUX=8)~!wXxWO2^dw%J^2KJiz-(&_MU0WWH%c+ndjppUvZA z;n}wEGJlvs)daL03CiXyUH3-@eNs-1*w>=k;I*OEW(q8N+!LOG%-!7or;#A z_Chn|kuKmo1{)8;BhPd9Ly7(xr(ZK6qGmW2Z)x^DSBc^gmB|BnW z9CoPBl=HoLpWI`$q+~KvPCqrRt~t&c)sR$c@jdQ&p5uXVA>6I@fy^w4PEt?Ejs=#DidDF= zpw;8b_C7$=go^ZiC`kXFiAN@WJhX1$Tl@wmoy2-IW|{X2BCNht+it4Qzb?fC9V;@- z7R!l)T24eN$zpjS>VAFW&Jm zJTM0kFQZ&Pe*F#CAL=fVmmER}jgfc(A9blimBc8s=Dm_So3*ecJWX9ShOY$yjQ_n6 zUFwtTu|t2s9{|X$icwq9q1IFv!fLWA4=UPs}Y==>7{886c#1^F1%G9e@ zOmUFug}-Fh&JOes^ws8SRihdWh#c#g_w^mx@-Dry2aFgVb&sZU!bgHB<6V@>KJ+PK z7J11D>i0vgBqGhaW_z(PFxYQ)nJ??7!vkZtj@3(hOQVQatPPIZLd7n0d^32ia-gye z?f7$leC{vt&c%a|OrQegcAfK7-a5yGvo4KaEq!2bDaSXC&%tm92|dTgL)86l`**i* z1hC`XhM?cW?4ejn2UvD`br)RW@zlhdQ6J7*O0Y3kjovMrx4g2{hElSd{m8@=`fW|5 zZ%e+7>b1|U9sUtO|NTPuekA^@0qQ(fbF@bpF6D23cJJNKTnZ6={C_1r2Jj(&{v*Hu XgA!vre^nAl00000NkvXXu0mjf#gX_f literal 0 HcmV?d00001 diff --git a/apps/BugReportSender/src/com/android/bugreportsender/BugReportListActivity.java b/apps/BugReportSender/src/com/android/bugreportsender/BugReportListActivity.java new file mode 100644 index 000000000..6a66eb0aa --- /dev/null +++ b/apps/BugReportSender/src/com/android/bugreportsender/BugReportListActivity.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.bugreportsender; + +import android.app.ListActivity; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.FileObserver; +import android.os.Handler; +import android.util.Log; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import java.io.File; +import java.util.ArrayList; +import java.util.Comparator; + +/** + * Shows a list of bug reports currently in /sdcard/bugreports + */ +public class BugReportListActivity extends ListActivity { + private static final String TAG = "BugReportListActivity"; + private static final File REPORT_DIR = new File("/sdcard/bugreports"); + + private ArrayAdapter mAdapter = null; + private ArrayList mFiles = null; + private Handler mHandler = null; + private FileObserver mObserver = null; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1); + mFiles = new ArrayList(); + mHandler = new Handler(); + + int flags = FileObserver.CREATE | FileObserver.MOVED_TO; + mObserver = new FileObserver(REPORT_DIR.getPath(), flags) { + public void onEvent(int event, String path) { + mHandler.post(new Runnable() { public void run() { scanDirectory(); } }); + } + }; + + setListAdapter(mAdapter); + } + + @Override + public void onStart() { + super.onStart(); + mObserver.startWatching(); + scanDirectory(); + } + + @Override + public void onStop() { + super.onStop(); + mObserver.stopWatching(); + } + + @Override + protected void onListItemClick(ListView l, View v, int position, long id) { + super.onListItemClick(l, v, position, id); + if (position < mFiles.size()) { + File file = mFiles.get(position); + Intent intent = new Intent(Intent.ACTION_SEND); + intent.putExtra("subject", file.getName()); + intent.putExtra("body", "Build: " + Build.DISPLAY + "\n(Sent by BugReportSender)"); + intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); + if (file.getName().endsWith(".gz")) { + intent.setType("application/x-gzip"); + } else if (file.getName().endsWith(".txt")) { + intent.setType("text/plain"); + } else { + intent.setType("application/octet-stream"); + } + startActivity(intent); + } + } + + private void scanDirectory() { + File[] files = REPORT_DIR.listFiles(); + mAdapter.clear(); + mFiles.clear(); + for (int i = 0; i < files.length; i++) { + String name = files[i].getName(); + if (name.endsWith(".gz")) name = name.substring(0, name.length() - 3); + if (!name.startsWith("bugreport-") || !name.endsWith(".txt")) { + Log.w(TAG, "Ignoring non-bugreport: " + files[i]); + continue; + } + + mAdapter.add(name.substring(10, name.length() - 4)); + mFiles.add(files[i]); + } + + // Reverse sort order: newest first. + mAdapter.sort(new Comparator() { + public int compare(String a, String b) { return b.compareTo(a); } + }); + } +}