From b2ad9d680ad85fe3b4f9d2c3a94f6c69cc7eb94e Mon Sep 17 00:00:00 2001 From: Matthias Goebl Date: Sun, 20 Sep 2015 17:29:08 +0200 Subject: [PATCH] initial release of working version (with less than 100 lines of code) --- .classpath | 7 ++ .project | 33 +++++++ AndroidManifest.xml | 21 +++++ README.md | 8 +- build.xml | 84 ++++++++++++++++++ default.properties | 11 +++ icon.xcf | Bin 0 -> 8815 bytes res/drawable-mdpi/icon.png | Bin 0 -> 1094 bytes res/layout/prefs.xml | 8 ++ res/values/strings.xml | 16 ++++ .../matgoebl/send2url/PrefsActivity.java | 15 ++++ .../matgoebl/send2url/SendActivity.java | 79 ++++++++++++++++ 12 files changed, 280 insertions(+), 2 deletions(-) create mode 100644 .classpath create mode 100644 .project create mode 100644 AndroidManifest.xml create mode 100644 build.xml create mode 100644 default.properties create mode 100644 icon.xcf create mode 100644 res/drawable-mdpi/icon.png create mode 100644 res/layout/prefs.xml create mode 100644 res/values/strings.xml create mode 100644 src/com/github/matgoebl/send2url/PrefsActivity.java create mode 100644 src/com/github/matgoebl/send2url/SendActivity.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..6efcbb7 --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..d9516df --- /dev/null +++ b/.project @@ -0,0 +1,33 @@ + + + Send2URL + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..e4e6a9d --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index 46a1c1b..14a8657 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ -# Send2URL -This app adds an entry to the android share menu. When you share any content (e.g. a picture from the gallery) with "Send2URL" it will be uploaded to the configured server URL using a HTTP POST request. +Send2URL +======== + +This app adds an entry to the android share menu. +When you share any content (e.g. a picture from the gallery) with "Send2URL" +it will be uploaded to the configured server URL using a HTTP POST request. diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..195bf8b --- /dev/null +++ b/build.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/default.properties b/default.properties new file mode 100644 index 0000000..0b9250e --- /dev/null +++ b/default.properties @@ -0,0 +1,11 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "build.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-8 diff --git a/icon.xcf b/icon.xcf new file mode 100644 index 0000000000000000000000000000000000000000..f55b6ef231f701ecca24d9ad1fac54af0c512063 GIT binary patch literal 8815 zcmeHNc~n!^*1tDE29glwc?e+)BwkWos_&PUdm5Oh?mC*jlE^D(FyShiF|Kr5+}wkj^g`E{Hg05 zivXQU2#+p)$D?{Z|IZib(X^!HQPFZmEI&ZM7YJ9qOQ@5HQxx)KzFZLw30tQisGQV@Q*Oe2x7=;!7%Owi1kRl24)@%9~da6hE03+!9>Lx#hiq} zgn`yb&(f`7!cgpy99_mR^lNsXHK)&-+h>jTWRfJ=12cM-(MQ+!yzO;z8qDat$H1&T z?__COvN%3!l{67V)Oq`OFN;cCnzEcP2-PlzghEIad|5)GG&V6IMG^DC0)ZPkZkcR> zU6h3H8(A1rS_Wf+CqOm>H!=(%*@by zwIn4eSuR_}kC)1l;dXICns`}4jFca1Rt!R|AqlXgA=Gp=t^uJj=n2@4Ak^>)OK^g~ z(y=@k;FJ@(UyhtQDnzIo1sDy}2;Asy>gHQQWGN?)o~Qn;tpKgB+@#;^>>@#dwY1UO zIyEH7F#@@J#}4bJ+@65-z^wjdECycp?6$z_p3t9k_K?jpF|1%KeQW1Sau=lQ_(}9h z>Ytlufmx=x`q^$P<^8@wY4F98w zWcWh((WOrls7S_8tw=9pOhxzU*mevjjbIpH1|(Dn0UV5zj9wv~1d+iXL^z3KJ+CxS zqHoG+n7Zx##bBlVZ7W73p=r}uhUzVZ`coHzQ5t3l8nw zqN*OWh(>7OI}PiBWd^loVC}FbT3ZQ34La>z{hEOh4>Tm&=`N)+zv29qo0ZTjn5K?tp&Ahim8u3=>AQ*Q0$(wJ<;VrDl&UcG{ zeM<~hZ1OwLEz z2(p^eLP%4{8k|}~NE66^&9ShU`wOYiYmM%au{te5uSOxgWJKLVNJo(`?Q|jSV6FYW z$e_)J}-{;0{rV5fF|> z(+qiv=5F1L$O{n>;#lo$1l*x+gs5!M;JtFEi5C`h{(F$3*Yy~v5-Urqji zth5I!~rc@Dwgs4wO*WXoVXg^d>@2WFYf2htvVE(f@bMZ!fJoMY(zrNr8U)p`k;8y_p znTZ;JzaaH_BOr|E(w{qooi|4-(#v=T1{~3^Ew?=gbn=W>s)aDW!J+z9^^25LmPkg+pj8EVI8i;ZNKg?CP_%K zo_pjvOGr%uKM2-3@0dV-l1E4y*&PqR;vd68eT)KX=8`zs^YHL|=vAR|d`0ff;0(Gz-o>ye@>vX@#qg9~Mq7fH$l$BjFG9!YBtgss z2Q(joXRkLU`Ua?x}O{kg)gkukw>0%zq(W4*K3dl5iee4$58EcOIn1C*w%-j~;q+>PMqrowY z7cH1EK2+l2>geF;=-}Yw%y;wh^&d2B>fFd^X(-0U>Jl^8tx1iUJ0V2k<>u=q8!%*x5bKXlvzMZuxVPdn7t0QGy?>Um>= zg|3d)<~+7B3um<$vw4>G0!i?Mg~{8F*ZkC_g{@4TH)f!Zo1+!LSWKMR!ZPNV+qy{x zPKnF>yyEJM&hGD!wUw(EPYm_*aI!WxVKW&xqlL+0o7oBcheo7qJbdtT^%!hcz++tnlTF;vv81%i%QJdS$O%$@A&UTJ2KX^V{dlC!tp}_ zJe_RKO-;BaJR83M_=tqHTlb!A_>F?q0POLh!dFK;>F9~o?RPaSoo%`wD`O?on%uI|8pE-TX^m#MJOqvz5 zT9v=CU`zG$ma`YGX<_GEp5CiIbzsNFb*YOM%a+QQB z`{mh_`!yAZKi{60wIm{DW~6*|PHz6;!u`%=G&A&I*-MxM7&ffI&Or=tlN6Twh=3T$G zRaw7(V{>ZhPF+Q2%3Y){$Ksl)1FrHr0Wf$G~FIT~(461Ak|E-q>_DBj>A~ zs@z;vcH!NFxvE?|w`YCD?qw9D`7!hH?$>V|j$ZjP zrmR{R& zF(W%Wy>NR*Hb*ZntA9X$(D7)0R(AG=>MSIu?DVYvX!GVxMw>JRb7*tatJ7xBVa>s3 z6LY5mvtHJ+>+}uE_34Q*Gl%sPdwF%!vGGILe4fL&WRAK1TVXXc89 zz${`P+y@sv7m5A*4;nglYPc+I^X@OdJp2(jU03|wH!MuBo-1lcy*&Bz)$g)V$*rXFow(E>8^`87!oTf`fB@ zVRJbqmiCSwlELHWFHG5ZsOE=%*^4-{jZHkut@K^v}w^s{>s3yZCj+v?i(Dqu{`aipneBR^pW% zr^_3E{_5j`Hwkv{zCFqv`-)1-D=I50Dl1Q)x!cfq_Rtzgx4r~>tKzF;MJG;`RnRKh z%TL$VR+cwis@#r1y#!l#|73CX*QKY*Y2|GdmmYpwR$hL!u40!K0|bjVcHJl{xqS9i z8D7?N@|%a3$_!w>e*R+$f%vui>dCTFr0y>N_Q$VF%M8oZr+=i>K(Ne4;z~&=t+c27 z`t7PxW+`#23_VC`+OHRvmY%Gvy-{)!X(~@4jh0;N%8D!Re{+I!f+*caNhxw|sQ&iH z)5Wi)6uIJ$h=%eKUI}sXLxj|E>+MV5Uo0vy(My3_=?^>qd90}T-r1sJZZUCUD*^+x z(jRnH9xp2T`c9Ea5mCIEl2XKaH=yA?*qG%Ik8lj2$b47R&QF0UT8U%mM ztBJHkB4>RfJ5imSvZR+)+jtH(wl>fYaac@-5d&wovW(dro~fm^t*xUeqSOHc`vv+7 z-JESLpx-dy;wCS7rsmK?I`Tcm0YO272f{9O!6Sx-_zT?~tj*1Uwm4j_iK&^nm5rSf zAGk1dNN z6Q&Uz;q0wUY^GT|x(fXQ`}qJ0cYEYyGkmxW+gZRiGBu-fERAjXOdE5j4;EV4yMSkb zzQ~q~vz_@^djZ3P$6*+A40&9pwWX=8^&sJVOFL&bv0ng%vasaw2D=N5Z48a+Moa^? zff0{wVrda%ISZOiI~P|sXJl*q#9)7swY!ZChs)$}7;GlX!q(i$wg2d_(23zoGx7>h z=ia*RKlQ6O0QG;oUk!gRI-T$Tesn4eevf`NA|WZHprpC&KlG~$XASjq_UgCv=<^qU z-miuaceJ&4_4f7=iwAu668QA`Tm9s-p%X&a+EBXo zRDwXn(+PD=>nc|t@9IdOUaYoft)Jy7@{Kz$d@Zi4HL88};E0DvBv?JeL&Vjardrmg zOMFGX0VO_qv6fj4HxZlj9C61UJ86`IBgawWKvAm`{67$ahGU~K4UP#hH4bYR3`xY8 kh6W!v9*I=x2C-N-Zo)P~sBYZeFWw3kJvh@4>B_Nx1AOwTvH$=8 literal 0 HcmV?d00001 diff --git a/res/drawable-mdpi/icon.png b/res/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..30b10cb76d693a490d3396578e7d779efe5f8cc0 GIT binary patch literal 1094 zcmV-M1iAZ(P)JBX&_5uJ7A!>+X^IvFK@=>uvC{UTP!UD+L432&2Om@r)R&q-p;RoTRWZKkV?s2f zEv2<43awyFLPDd5iMgC6x!v{Q=4Acd-sN}sU23k}!0?0Fnc4l$&dl!qJYF1m*4GG^ zXsT$-D+patj!#(^H-JK()yK=>h`ETn#( zbvxjvE>XA&tOVu(wLl}#S_}Z5h{EDLoPH+Yh9%|h0LOs^Stfr8_!bxe9soxj-Q{)Q z5)c=iZ^Uj&0JlWpE1)JoOFNe%-MWC69RPlI=v*;%(L2sF*&+Gw(+z)%^KnwIu-29*H=cafPT~WB=AxvuG!Sy zUiE0j3VjN=U*KO0^MN%U{Geb?8JrE_OCNX0cY{|3rU@bk?Wl;6mn~|palbqPb@Sku z2cH|b5rKDt`f>sI(|vjK=7RYPCO?7b?Lq<|bwbt7ham&wk<`<5S^xkOcd(WejDtQ= zs2Z?kaj2Dgco3!r@YR=tbr+1)6%xQ0ysF`Q0dQ`H0T>OFn+w^6EXN&jSQG|8koQ0g zJZ0zQPY%1ZEMU|ysaATV5{AP5YMCm9nju*YpkY`FBO_{Kuvnt{Fjq8tAgW-eh9?@v zC*a+%Db(-aNwFUQ_3T=qp~HYtslOD@kxI2hqv3jx#V9x=`kh}pI!zt`^eG1qOZ1x{ zSz}FlKqehh&^QX!qfo72hlcwCZhw%)bVIp@TVk_21OT-qll8w6{f}(Te_*bL>p6<@ zT6gCEqpXWb!bY(hPC#9d!gu&ezLLp$P;$T4Kj{EeC^)R)riRBF5*ltQI6RPg6X%uB z8qN!di_-+)blc{Sevw_L%@r_hMf@UD4MqN>R0~Sa>JpWxME?mr1$!BxS*sgTkpKVy M07*qoM6N<$g2=(}GXMYp literal 0 HcmV?d00001 diff --git a/res/layout/prefs.xml b/res/layout/prefs.xml new file mode 100644 index 0000000..d7032a0 --- /dev/null +++ b/res/layout/prefs.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml new file mode 100644 index 0000000..6aaae06 --- /dev/null +++ b/res/values/strings.xml @@ -0,0 +1,16 @@ + + + Send2URL + Send2URL Settings + Sending to URL... + Enter the server URL + Set server URL + https://user:pass@server.example.com:1234/path/ + Successfully sent to URL + Error sending to URL + About + + This app adds an entry to the android share menu. + When you share any content (e.g. a picture from the gallery) with "Send2URL" it will be uploaded to the configured server URL using a HTTP POST request. + + diff --git a/src/com/github/matgoebl/send2url/PrefsActivity.java b/src/com/github/matgoebl/send2url/PrefsActivity.java new file mode 100644 index 0000000..53eca18 --- /dev/null +++ b/src/com/github/matgoebl/send2url/PrefsActivity.java @@ -0,0 +1,15 @@ +package com.github.matgoebl.send2url; + +import com.github.matgoebl.send2url.R; +import android.os.Bundle; +import android.preference.PreferenceActivity; + +public class PrefsActivity extends PreferenceActivity +{ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.layout.prefs); + } +} diff --git a/src/com/github/matgoebl/send2url/SendActivity.java b/src/com/github/matgoebl/send2url/SendActivity.java new file mode 100644 index 0000000..118b541 --- /dev/null +++ b/src/com/github/matgoebl/send2url/SendActivity.java @@ -0,0 +1,79 @@ +package com.github.matgoebl.send2url; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.InputStreamEntity; +import org.apache.http.impl.client.DefaultHttpClient; + +import android.app.Activity; +import android.content.ContentResolver; +import android.content.Intent; +import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.Base64; +import android.widget.Toast; + +public class SendActivity extends Activity +{ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + String serverUrl = prefs.getString("serverurl", ""); + + Intent intent = getIntent(); + if (intent != null && intent.getAction().equals(Intent.ACTION_SEND)) { + Bundle extras = intent.getExtras(); + if(extras != null && extras.containsKey(Intent.EXTRA_STREAM)) { + Uri uri = (Uri) extras.getParcelable(Intent.EXTRA_STREAM); + ContentResolver contentResolver = getContentResolver(); + try { + InputStream stream = contentResolver.openInputStream(uri); + httpPost( serverUrl,stream); + Toast.makeText(getBaseContext(), getString(R.string.SendSuccess), + Toast.LENGTH_LONG).show(); + setResult(Activity.RESULT_OK); + } catch (Exception e) { + Toast.makeText(getBaseContext(), getString(R.string.SendFailed) + ":\n" + e.toString(), + Toast.LENGTH_LONG).show(); + setResult(Activity.RESULT_CANCELED); + } + } + } + finish(); + } + + public static void httpPost(String serverUrl, InputStream dataStream) throws ClientProtocolException, IOException, Exception { + DefaultHttpClient httpclient = new DefaultHttpClient(); + HttpPost httppost = new HttpPost(serverUrl); + + URL url = new URL(serverUrl); + String userInfo = url.getUserInfo(); + if( userInfo != null ) { + httppost.addHeader("Authorization", "Basic " + Base64.encodeToString(userInfo.getBytes(), Base64.NO_WRAP)); + } + + InputStreamEntity requestEntity = new InputStreamEntity(dataStream,-1); + requestEntity.setContentType("binary/octet-stream"); + requestEntity.setChunked(true); + httppost.setEntity(requestEntity); + + HttpResponse response = httpclient.execute(httppost); + response.getEntity().getContent().close(); + httpclient.getConnectionManager().shutdown(); + + int status = response.getStatusLine().getStatusCode(); + if ( status < 200 || status > 299 ) { + throw new Exception(response.getStatusLine().toString()); + } + } +} +