parent
77a051c9ce
commit
ffb9abf5fc
|
@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 25
|
compileSdkVersion 25
|
||||||
buildToolsVersion "24.0.3"
|
buildToolsVersion "25.0.2"
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "fr.mobdev.goblim"
|
applicationId "fr.mobdev.goblim"
|
||||||
|
@ -22,6 +22,6 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile fileTree(dir: 'libs', include: ['*.jar'])
|
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
compile 'com.android.support:appcompat-v7:25.0.0'
|
compile 'com.android.support:appcompat-v7:25.1.0'
|
||||||
compile 'com.android.support:design:25.0.0'
|
compile 'com.android.support:design:25.1.0'
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="fr.mobdev.goblim" >
|
package="fr.mobdev.goblim">
|
||||||
|
|
||||||
<uses-sdk android:minSdkVersion="11"/>
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
|
@ -15,37 +13,46 @@
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/AppTheme">
|
android:theme="@style/AppTheme">
|
||||||
<activity
|
<activity
|
||||||
android:name="fr.mobdev.goblim.activity.UploadActivity"
|
android:name=".activity.UploadActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/AppTheme.NoActionBar"
|
android:theme="@style/AppTheme.NoActionBar">
|
||||||
>
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.SEND"/>
|
<action android:name="android.intent.action.SEND" />
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
<data android:mimeType="image/*"/>
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
|
||||||
|
<data android:mimeType="image/*" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
|
||||||
|
<data android:mimeType="image/*" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name="fr.mobdev.goblim.activity.HistoryActivity"
|
android:name=".activity.HistoryActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/AppTheme.NoActionBar"
|
android:theme="@style/AppTheme.NoActionBar">
|
||||||
>
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity
|
<activity
|
||||||
android:name="fr.mobdev.goblim.activity.LinkActivity"
|
android:name=".activity.LinkActivity"
|
||||||
android:label="@string/title_activity_link"
|
android:label="@string/title_activity_link"
|
||||||
android:theme="@style/AppTheme.NoActionBar"
|
android:theme="@style/AppTheme.NoActionBar"/>
|
||||||
>
|
|
||||||
</activity>
|
|
||||||
<activity
|
<activity
|
||||||
android:name="fr.mobdev.goblim.activity.ServersActivity"
|
android:name=".activity.ServersActivity"
|
||||||
android:label="@string/title_activity_servers"
|
android:label="@string/title_activity_servers"
|
||||||
android:theme="@style/AppTheme.NoActionBar"
|
android:theme="@style/AppTheme.NoActionBar"/>
|
||||||
>
|
<activity
|
||||||
</activity>
|
android:name=".activity.MultiLinkActivity"
|
||||||
|
android:label="@string/title_share_links"
|
||||||
|
android:theme="@style/AppTheme.NoActionBar"/>
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
|
||||||
|
</manifest>
|
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Anthony Chomienne, anthony@mob-dev.fr
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 3
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package fr.mobdev.goblim;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ImageListAdapter extends RecyclerView.Adapter<ImageViewHolder> {
|
||||||
|
|
||||||
|
private OnImageClickListener listener;
|
||||||
|
private LinkedHashMap<Uri,Bitmap> datas;
|
||||||
|
private ImageLoader loader;
|
||||||
|
private ImageLoader.ImageLoaderListener loaderListener;
|
||||||
|
|
||||||
|
public ImageListAdapter(OnImageClickListener listener, ImageLoader.ImageLoaderListener loaderListener){
|
||||||
|
datas = new LinkedHashMap<>();
|
||||||
|
this.listener = listener;
|
||||||
|
this.loaderListener = loaderListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBitmapsForUris(Context context, List<Uri> imageUris, List<Bitmap> bitmaps) {
|
||||||
|
int i = 0;
|
||||||
|
if(bitmaps.size() != imageUris.size())
|
||||||
|
return;
|
||||||
|
for(Uri imUri : imageUris) {
|
||||||
|
setBitmapForUri(imUri,bitmaps.get(i));
|
||||||
|
if(bitmaps.get(i) == null) {
|
||||||
|
ImageLoader.Message mes = new ImageLoader.Message();
|
||||||
|
mes.context = context;
|
||||||
|
mes.uri = imUri;
|
||||||
|
addMessageToQueue(mes);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBitmapForUri(Uri imageUri, Bitmap thumb) {
|
||||||
|
if(datas.containsKey(imageUri)) {
|
||||||
|
datas.put(imageUri, thumb);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addUris(Context context, List<Uri> uris, boolean loadImg) {
|
||||||
|
for(Uri imUri : uris) {
|
||||||
|
if(loadImg) {
|
||||||
|
addUri(context,imUri);
|
||||||
|
} else {
|
||||||
|
datas.put(imUri,null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addUri(Context context, Uri imUri) {
|
||||||
|
datas.put(imUri,null);
|
||||||
|
ImageLoader.Message mes = new ImageLoader.Message();
|
||||||
|
mes.context = context;
|
||||||
|
mes.uri = imUri;
|
||||||
|
addMessageToQueue(mes);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addMessageToQueue(ImageLoader.Message mes) {
|
||||||
|
if(loader == null || loader.getState() == Thread.State.TERMINATED) {
|
||||||
|
loader = new ImageLoader(loaderListener);
|
||||||
|
loader.start();
|
||||||
|
}
|
||||||
|
loader.addMessageToQueue(mes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getForUri(Uri imUri) {
|
||||||
|
return datas.get(imUri);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ImageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.thumb_items,parent,false);
|
||||||
|
return new ImageViewHolder(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(ImageViewHolder holder, int position) {
|
||||||
|
List<Uri> uris = new ArrayList<>(datas.keySet());
|
||||||
|
final Uri imUri = uris.get(position);
|
||||||
|
Bitmap bt = datas.get(imUri);
|
||||||
|
if(bt != null) {
|
||||||
|
holder.thumb.setVisibility(View.VISIBLE);
|
||||||
|
holder.thumb.setImageBitmap(bt);
|
||||||
|
holder.progressLoad.setVisibility(View.GONE);
|
||||||
|
} else {
|
||||||
|
holder.thumb.setVisibility(View.GONE);
|
||||||
|
holder.progressLoad.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
holder.resetBt.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
datas.remove(imUri);
|
||||||
|
listener.onRemove(imUri);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
holder.thumb.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
listener.OnImageClick(imUri);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return datas.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayList<Bitmap> getBitmaps() {
|
||||||
|
return new ArrayList<>(datas.values());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
datas.clear();
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnImageClickListener{
|
||||||
|
void OnImageClick(Uri imageUri);
|
||||||
|
void onRemove(Uri imageUri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ImageViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
ProgressBar progressLoad;
|
||||||
|
ImageView resetBt;
|
||||||
|
ImageView thumb;
|
||||||
|
ImageViewHolder(View v) {
|
||||||
|
super(v);
|
||||||
|
resetBt = (ImageView) v.findViewById(R.id.reset_img);
|
||||||
|
thumb = (ImageView) v.findViewById(R.id.thumbnail_item);
|
||||||
|
progressLoad = (ProgressBar) v.findViewById(R.id.progress_thumb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Anthony Chomienne, anthony@mob-dev.fr
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 3
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package fr.mobdev.goblim;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.util.DisplayMetrics;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
|
public class ImageLoader extends Thread {
|
||||||
|
|
||||||
|
private Semaphore sem;
|
||||||
|
private List<Message> messages;
|
||||||
|
private ImageLoaderListener listener;
|
||||||
|
|
||||||
|
ImageLoader(ImageLoaderListener listener) {
|
||||||
|
sem = new Semaphore(0,true);
|
||||||
|
messages = new ArrayList<>();
|
||||||
|
this.listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addMessageToQueue(Message mes) {
|
||||||
|
messages.add(mes);
|
||||||
|
sem.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(){
|
||||||
|
boolean isRunning = true;
|
||||||
|
while (isRunning){
|
||||||
|
try {
|
||||||
|
sem.acquire();
|
||||||
|
if (messages.size() > 0) {
|
||||||
|
Message mes = messages.get(0);
|
||||||
|
Bitmap thumb = loadThumb(mes);
|
||||||
|
if(thumb != null) {
|
||||||
|
listener.thumbLoaded(mes.uri, thumb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch(InterruptedException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
isRunning = false;
|
||||||
|
}
|
||||||
|
messages.remove(0);
|
||||||
|
if(messages.isEmpty())
|
||||||
|
listener.allThumbLoaded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap loadThumb(Message mes) {
|
||||||
|
Bitmap thumb = null;
|
||||||
|
try {
|
||||||
|
BitmapFactory.Options opts = new BitmapFactory.Options();
|
||||||
|
opts.inScaled = true;
|
||||||
|
opts.inDensity = 640;
|
||||||
|
opts.inTargetDensity = DisplayMetrics.DENSITY_MEDIUM;
|
||||||
|
thumb = BitmapFactory.decodeStream(mes.context.getContentResolver().openInputStream(mes.uri), null, opts);
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return thumb;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Message {
|
||||||
|
Context context;
|
||||||
|
Uri uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ImageLoaderListener{
|
||||||
|
void thumbLoaded(Uri imageUri, Bitmap thumb);
|
||||||
|
void allThumbLoaded();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Anthony Chomienne, anthony@mob-dev.fr
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 3
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package fr.mobdev.goblim;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.CheckBox;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class MultiLinkAdapter extends RecyclerView.Adapter<MultiLinkViewHolder>{
|
||||||
|
|
||||||
|
private List<Bitmap> bitmaps;
|
||||||
|
private List<Integer> selecteds;
|
||||||
|
|
||||||
|
public MultiLinkAdapter(int length) {
|
||||||
|
bitmaps = new ArrayList<>();
|
||||||
|
selecteds = new ArrayList<>();
|
||||||
|
for(int i = 0; i < length; i++) {
|
||||||
|
bitmaps.add(null);
|
||||||
|
selecteds.add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBitmap(Bitmap bt, int position) {
|
||||||
|
bitmaps.set(position,bt);
|
||||||
|
notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Integer> getSelecteds() {
|
||||||
|
return selecteds;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MultiLinkViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||||
|
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.link_item,parent,false);
|
||||||
|
final MultiLinkViewHolder holder = new MultiLinkViewHolder(v);
|
||||||
|
View.OnClickListener listener = new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
CheckBox box;
|
||||||
|
if(v instanceof CheckBox) {
|
||||||
|
box = (CheckBox) v;
|
||||||
|
} else {
|
||||||
|
box = (CheckBox) v.findViewById(R.id.selected);
|
||||||
|
}
|
||||||
|
if(box.isChecked() && !selecteds.contains(holder.index)) {
|
||||||
|
selecteds.add(holder.index);
|
||||||
|
} else {
|
||||||
|
selecteds.remove(holder.index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CheckBox box = (CheckBox) v.findViewById(R.id.selected);
|
||||||
|
box.setOnClickListener(listener);
|
||||||
|
v.setOnClickListener(listener);
|
||||||
|
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBindViewHolder(MultiLinkViewHolder holder, int position) {
|
||||||
|
Bitmap bt = bitmaps.get(position);
|
||||||
|
if(bt != null) {
|
||||||
|
holder.progress.setVisibility(View.GONE);
|
||||||
|
holder.thumb.setImageBitmap(bt);
|
||||||
|
holder.thumb.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
holder.progress.setVisibility(View.VISIBLE);
|
||||||
|
holder.thumb.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
holder.box.setChecked(selecteds.contains(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getItemCount() {
|
||||||
|
return bitmaps.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MultiLinkViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
|
||||||
|
int index;
|
||||||
|
CheckBox box;
|
||||||
|
ImageView thumb;
|
||||||
|
ProgressBar progress;
|
||||||
|
|
||||||
|
MultiLinkViewHolder(View itemView) {
|
||||||
|
super(itemView);
|
||||||
|
box = (CheckBox) itemView.findViewById(R.id.selected);
|
||||||
|
thumb = (ImageView) itemView.findViewById(R.id.thumbnail_link);
|
||||||
|
progress = (ProgressBar) itemView.findViewById(R.id.progress);
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,7 +26,10 @@ import java.io.InputStreamReader;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
@ -43,288 +46,384 @@ import fr.mobdev.goblim.listener.NetworkListener;
|
||||||
import fr.mobdev.goblim.objects.Img;
|
import fr.mobdev.goblim.objects.Img;
|
||||||
|
|
||||||
public class NetworkManager {
|
public class NetworkManager {
|
||||||
|
|
||||||
private NetworkListener listener;
|
|
||||||
private static NetworkManager instance;
|
|
||||||
|
|
||||||
private NetworkManager(NetworkListener listener)
|
private NetworkListener listener;
|
||||||
{
|
private static NetworkManager instance;
|
||||||
this.listener = listener;
|
private NetworkThread thread;
|
||||||
}
|
|
||||||
|
|
||||||
public static NetworkManager getInstance(NetworkListener listener) {
|
|
||||||
if (instance == null)
|
|
||||||
instance = new NetworkManager(listener);
|
|
||||||
if(listener != null && listener != instance.getListener())
|
|
||||||
instance.setListener(listener);
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
private NetworkListener getListener()
|
|
||||||
{
|
|
||||||
return listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setListener(NetworkListener listener)
|
|
||||||
{
|
|
||||||
this.listener = listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void upload(final Context context, final String siteUrl, final int nbDays, final Uri imageUri)
|
|
||||||
{
|
|
||||||
if(!isConnectedToInternet(context)) {
|
|
||||||
listener.fileUploadError(context.getString(R.string.no_network));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
new Thread(new Runnable() {
|
|
||||||
|
|
||||||
@Override
|
private NetworkManager(NetworkListener listener) {
|
||||||
public void run() {
|
this.listener = listener;
|
||||||
Img img = uploadImage(context, siteUrl, nbDays,imageUri);
|
}
|
||||||
if(img != null)
|
|
||||||
listener.fileUploaded(img);
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
private Img uploadImage(Context context, String siteUrl, int nbDays, Uri imageUri) {
|
public static NetworkManager getInstance(NetworkListener listener) {
|
||||||
|
if (instance == null)
|
||||||
|
instance = new NetworkManager(listener);
|
||||||
|
if (listener != null && listener != instance.getListener())
|
||||||
|
instance.setListener(listener);
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
URL url = null;
|
private NetworkListener getListener() {
|
||||||
Img imgOutput = null;
|
return listener;
|
||||||
try {
|
}
|
||||||
url = new URL(siteUrl);
|
|
||||||
} catch (MalformedURLException e1) {
|
|
||||||
e1.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
HttpURLConnection conn = null;
|
private void setListener(NetworkListener listener) {
|
||||||
InputStream stream = null;
|
this.listener = listener;
|
||||||
DataOutputStream request = null;
|
if(thread != null)
|
||||||
try {
|
thread.setListener(listener);
|
||||||
if(isConnectedToInternet(context))
|
}
|
||||||
{
|
|
||||||
String crlf = "\r\n";
|
public void delete(Context context, String deleteUrl) {
|
||||||
String hyphens = "--";
|
if (!isConnectedToInternet(context)) {
|
||||||
String boundary = "------------------------dd8a045fcc22b35c";
|
listener.fileUploadError(null, context.getString(R.string.no_network));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
NetworkThread.Message mes = new NetworkThread.Message();
|
||||||
|
mes.type = NetworkThread.Message_Type.DELETE_IMG;
|
||||||
|
mes.url = deleteUrl;
|
||||||
|
mes.context = context;
|
||||||
|
addMessageToQueue(mes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void upload(Context context, String siteUrl, int nbDays, List<Uri> imageUris) {
|
||||||
|
int i = 1;
|
||||||
|
for(Uri uri : imageUris) {
|
||||||
|
NetworkThread.Message mes = new NetworkThread.Message();
|
||||||
|
mes.type = NetworkThread.Message_Type.UPLOAD_IMG;
|
||||||
|
mes.context = context;
|
||||||
|
mes.url = siteUrl;
|
||||||
|
mes.nbDays = nbDays;
|
||||||
|
mes.imageUri = uri;
|
||||||
|
mes.fileNb = imageUris.size();
|
||||||
|
mes.fileNo = i++;
|
||||||
|
addMessageToQueue(mes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addMessageToQueue(NetworkThread.Message mes){
|
||||||
|
|
||||||
|
if(thread == null || thread.getState() == Thread.State.TERMINATED) {
|
||||||
|
thread = new NetworkThread();
|
||||||
|
thread.setListener(listener);
|
||||||
|
thread.start();
|
||||||
|
}
|
||||||
|
thread.addMessageQueue(mes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private boolean isConnectedToInternet(Context context) {
|
||||||
|
//verify the connectivity
|
||||||
|
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
|
||||||
|
if (networkInfo != null) {
|
||||||
|
State networkState = networkInfo.getState();
|
||||||
|
if (networkState.equals(State.CONNECTED)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteMultiple(Context context, List<String> urls) {
|
||||||
|
for(String url : urls) {
|
||||||
|
delete(context,url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NetworkThread extends Thread{
|
||||||
|
|
||||||
|
private Semaphore sem;
|
||||||
|
private List<Message> messages;
|
||||||
|
private NetworkListener listener;
|
||||||
|
|
||||||
|
NetworkThread() {
|
||||||
|
sem = new Semaphore(0,true);
|
||||||
|
messages = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setListener(NetworkListener lst){
|
||||||
|
listener = lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addMessageQueue(Message mes) {
|
||||||
|
messages.add(mes);
|
||||||
|
sem.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(){
|
||||||
|
boolean isRunning = true;
|
||||||
|
while(isRunning) {
|
||||||
|
try {
|
||||||
|
sem.acquire();
|
||||||
|
Message mes = messages.get(0);
|
||||||
|
switch (mes.type){
|
||||||
|
case DELETE_IMG:
|
||||||
|
deleteImage(mes.context,mes.url);
|
||||||
|
break;
|
||||||
|
case UPLOAD_IMG:
|
||||||
|
uploadImage(mes.context,mes.url,mes.nbDays,mes.imageUri,mes.fileNo,mes.fileNb);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
isRunning = false;
|
||||||
|
}
|
||||||
|
messages.remove(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteImage(final Context context, final String deleteUrl) {
|
||||||
|
if (!isConnectedToInternet(context))
|
||||||
|
listener.deleteError(context.getString(R.string.no_network));
|
||||||
|
URL url = null;
|
||||||
|
try {
|
||||||
|
url = new URL(deleteUrl);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (url != null) {
|
||||||
|
try {
|
||||||
|
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
|
||||||
|
if (urlConnection != null) {
|
||||||
|
InputStream stream = urlConnection.getInputStream();
|
||||||
|
stream.close();
|
||||||
|
} else {
|
||||||
|
listener.deleteError(context.getString(R.string.network_error));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
listener.deleteSucceed(deleteUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void uploadImage(Context context, String siteUrl, int nbDays, Uri imageUri, int fileNo, int fileNb) {
|
||||||
|
if (!isConnectedToInternet(context)) {
|
||||||
|
listener.fileUploadError(imageUri,context.getString(R.string.no_network));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
URL url = null;
|
||||||
|
Img imgOutput = null;
|
||||||
|
try {
|
||||||
|
url = new URL(siteUrl);
|
||||||
|
} catch (MalformedURLException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpURLConnection conn = null;
|
||||||
|
InputStream stream = null;
|
||||||
|
DataOutputStream request = null;
|
||||||
|
try {
|
||||||
|
if (isConnectedToInternet(context)) {
|
||||||
|
String crlf = "\r\n";
|
||||||
|
String hyphens = "--";
|
||||||
|
String boundary = "------------------------dd8a045fcc22b35c";
|
||||||
//check if there is a HTTP 301 Error
|
//check if there is a HTTP 301 Error
|
||||||
if(url != null) {
|
if (url != null) {
|
||||||
conn = (HttpURLConnection) url.openConnection();
|
conn = (HttpURLConnection) url.openConnection();
|
||||||
|
} else {
|
||||||
|
listener.fileUploadError(imageUri, context.getString(R.string.connection_failed));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else {
|
String location = conn.getHeaderField("Location");
|
||||||
listener.fileUploadError(context.getString(R.string.connection_failed));
|
if (location != null) {
|
||||||
return null;
|
|
||||||
}
|
|
||||||
String location = conn.getHeaderField("Location");
|
|
||||||
if(location != null) {
|
|
||||||
//if there is follow the new destination
|
//if there is follow the new destination
|
||||||
siteUrl = location;
|
siteUrl = location;
|
||||||
url = new URL(location);
|
url = new URL(location);
|
||||||
}
|
}
|
||||||
conn = (HttpURLConnection) url.openConnection();
|
conn = (HttpURLConnection) url.openConnection();
|
||||||
//prepare the connection for upload
|
//prepare the connection for upload
|
||||||
conn.setRequestMethod("POST");
|
conn.setRequestMethod("POST");
|
||||||
conn.setUseCaches(false);
|
conn.setUseCaches(false);
|
||||||
conn.setDoInput(true);
|
conn.setDoInput(true);
|
||||||
conn.setDoOutput(true);
|
conn.setDoOutput(true);
|
||||||
|
|
||||||
conn.setRequestProperty("User-Agent", "Goblim");
|
conn.setRequestProperty("User-Agent", "Goblim");
|
||||||
|
|
||||||
conn.setRequestProperty("Expect", "100-continue");
|
conn.setRequestProperty("Expect", "100-continue");
|
||||||
conn.setRequestProperty("Accept", "*/*");
|
conn.setRequestProperty("Accept", "*/*");
|
||||||
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
|
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
|
||||||
|
|
||||||
int request_size = 0;
|
int request_size = 0;
|
||||||
|
|
||||||
//ask for JSON answer
|
//ask for JSON answer
|
||||||
String answer = hyphens + boundary + crlf;
|
String answer = hyphens + boundary + crlf;
|
||||||
answer += "Content-Disposition: form-data; name=\"format\"" + crlf;
|
answer += "Content-Disposition: form-data; name=\"format\"" + crlf;
|
||||||
answer += crlf;
|
answer += crlf;
|
||||||
answer += "json" + crlf;
|
answer += "json" + crlf;
|
||||||
request_size += answer.length();
|
request_size += answer.length();
|
||||||
|
|
||||||
//ask for storage duration
|
//ask for storage duration
|
||||||
String duration = hyphens + boundary + crlf;
|
String duration = hyphens + boundary + crlf;
|
||||||
duration += "Content-Disposition: form-data; name=\"delete-day\"" + crlf;
|
duration += "Content-Disposition: form-data; name=\"delete-day\"" + crlf;
|
||||||
duration += crlf;
|
duration += crlf;
|
||||||
duration += nbDays + crlf;
|
duration += nbDays + crlf;
|
||||||
request_size += duration.length();
|
request_size += duration.length();
|
||||||
String[] proj = {OpenableColumns.DISPLAY_NAME,OpenableColumns.SIZE};
|
String[] proj = {OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE};
|
||||||
Cursor cursor = context.getContentResolver().query(imageUri,proj,null,null,null);
|
Cursor cursor = context.getContentResolver().query(imageUri, proj, null, null, null);
|
||||||
String fileName = null;
|
String fileName = null;
|
||||||
long size = 0;
|
long size = 0;
|
||||||
if(cursor != null && cursor.moveToFirst()) {
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
fileName = cursor.getString(0);
|
fileName = cursor.getString(0);
|
||||||
size = cursor.getLong(1);
|
size = cursor.getLong(1);
|
||||||
cursor.close();
|
cursor.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
//setup filename and say that octets follow
|
//setup filename and say that octets follow
|
||||||
String outputInformations = hyphens + boundary + crlf;
|
String outputInformations = hyphens + boundary + crlf;
|
||||||
outputInformations += "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"" + crlf;
|
outputInformations += "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"" + crlf;
|
||||||
outputInformations += "Content-Type: application/octet-stream" + crlf;
|
outputInformations += "Content-Type: application/octet-stream" + crlf;
|
||||||
outputInformations += crlf;
|
outputInformations += crlf;
|
||||||
request_size += outputInformations.length();
|
request_size += outputInformations.length();
|
||||||
|
|
||||||
request_size += size;
|
request_size += size;
|
||||||
|
|
||||||
//finish the format http post packet
|
//finish the format http post packet
|
||||||
String endHttp = crlf;
|
String endHttp = crlf;
|
||||||
endHttp += hyphens + boundary + hyphens + crlf;
|
endHttp += hyphens + boundary + hyphens + crlf;
|
||||||
request_size += endHttp.length();
|
request_size += endHttp.length();
|
||||||
|
|
||||||
conn.setFixedLengthStreamingMode(request_size);
|
conn.setFixedLengthStreamingMode(request_size);
|
||||||
|
|
||||||
//write data
|
//write data
|
||||||
request = new DataOutputStream(conn.getOutputStream());
|
request = new DataOutputStream(conn.getOutputStream());
|
||||||
request.writeBytes(answer);
|
request.writeBytes(answer);
|
||||||
request.writeBytes(duration);
|
request.writeBytes(duration);
|
||||||
request.writeBytes(outputInformations);
|
request.writeBytes(outputInformations);
|
||||||
request.flush();
|
request.flush();
|
||||||
InputStream streamIn = null;
|
InputStream streamIn = null;
|
||||||
try{
|
|
||||||
streamIn = context.getContentResolver().openInputStream(imageUri);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
//read data from the file and write it
|
|
||||||
if(streamIn != null) {
|
|
||||||
int readed = 0;
|
|
||||||
int byteWriten = 0;
|
|
||||||
int blockSize = 1024;
|
|
||||||
byte[] buffer = new byte[blockSize];
|
|
||||||
while(readed != -1) {
|
|
||||||
try {
|
|
||||||
readed = streamIn.read(buffer);
|
|
||||||
if(readed != -1) {
|
|
||||||
request.write(buffer, 0, readed);
|
|
||||||
byteWriten+=readed;
|
|
||||||
listener.uploadProgress(byteWriten,(int)size);
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
readed = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
request.writeBytes(endHttp);
|
|
||||||
request.flush();
|
|
||||||
|
|
||||||
//get answer
|
|
||||||
stream = conn.getInputStream();
|
|
||||||
}
|
|
||||||
} catch (IOException e1) {
|
|
||||||
if(conn != null) {
|
|
||||||
stream = conn.getErrorStream();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
e1.printStackTrace();
|
|
||||||
listener.fileUploadError(context.getString(R.string.network_error));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(stream != null) {
|
|
||||||
//prepare JSON reading
|
|
||||||
InputStreamReader isr = new InputStreamReader(stream);
|
|
||||||
BufferedReader br = new BufferedReader(isr);
|
|
||||||
boolean isReading = true;
|
|
||||||
String data;
|
|
||||||
String jsonStr = "";
|
|
||||||
//get all data in a String
|
|
||||||
do {
|
|
||||||
try {
|
|
||||||
data = br.readLine();
|
|
||||||
if (data != null)
|
|
||||||
jsonStr += data;
|
|
||||||
else
|
|
||||||
isReading = false;
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
isReading = false;
|
|
||||||
}
|
|
||||||
} while (isReading);
|
|
||||||
//parse JSON answer
|
|
||||||
try {
|
|
||||||
if(request != null)
|
|
||||||
request.close();
|
|
||||||
stream.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// Parse the JSON to a JSONObject
|
|
||||||
JSONObject rootObject = new JSONObject(jsonStr);
|
|
||||||
// Get msg (root) element
|
|
||||||
String msgStr = rootObject.getString("msg");
|
|
||||||
// is there an error?
|
|
||||||
if(!msgStr.contains("{")) {
|
|
||||||
listener.fileUploadError(msgStr);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else if(rootObject.has("msg")){
|
|
||||||
//retrieve useful data
|
|
||||||
JSONObject msg = rootObject.getJSONObject("msg");
|
|
||||||
String hashOutput = msg.getString("short");
|
|
||||||
String realHashOutput = msg.getString("real_short");
|
|
||||||
String token = msg.getString("token");
|
|
||||||
imgOutput = new Img(0, siteUrl, hashOutput, realHashOutput, Calendar.getInstance(), nbDays, null,token);
|
|
||||||
}
|
|
||||||
} catch (JSONException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
listener.fileUploadError(context.getString(R.string.unreadable_json));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return imgOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deleteImage(final Context context, final String deleteUrl) {
|
|
||||||
new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
|
|
||||||
if (!isConnectedToInternet(context))
|
|
||||||
listener.deleteError(context.getString(R.string.no_network));
|
|
||||||
URL url = null;
|
|
||||||
try {
|
try {
|
||||||
url = new URL(deleteUrl);
|
streamIn = context.getContentResolver().openInputStream(imageUri);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
//read data from the file and write it
|
||||||
if (url != null) {
|
if (streamIn != null) {
|
||||||
try {
|
int readed = 0;
|
||||||
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
|
int byteWriten = 0;
|
||||||
if(urlConnection != null) {
|
int blockSize = 1024;
|
||||||
InputStream stream = urlConnection.getInputStream();
|
byte[] buffer = new byte[blockSize];
|
||||||
stream.close();
|
while (readed != -1) {
|
||||||
|
try {
|
||||||
|
readed = streamIn.read(buffer);
|
||||||
|
if (readed != -1) {
|
||||||
|
request.write(buffer, 0, readed);
|
||||||
|
byteWriten += readed;
|
||||||
|
listener.uploadProgress(byteWriten, (int) size, fileNo, fileNb);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
readed = -1;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
listener.deleteError(context.getString(R.string.network_error));
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
listener.deleteSucceed();
|
|
||||||
}
|
}
|
||||||
|
request.writeBytes(endHttp);
|
||||||
|
request.flush();
|
||||||
|
|
||||||
|
//get answer
|
||||||
|
stream = conn.getInputStream();
|
||||||
}
|
}
|
||||||
}).start();
|
} catch (IOException e1) {
|
||||||
|
if (conn != null) {
|
||||||
|
stream = conn.getErrorStream();
|
||||||
|
} else {
|
||||||
|
e1.printStackTrace();
|
||||||
|
listener.fileUploadError(imageUri, context.getString(R.string.network_error));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stream != null) {
|
||||||
|
//prepare JSON reading
|
||||||
|
InputStreamReader isr = new InputStreamReader(stream);
|
||||||
|
BufferedReader br = new BufferedReader(isr);
|
||||||
|
boolean isReading = true;
|
||||||
|
String data;
|
||||||
|
String jsonStr = "";
|
||||||
|
//get all data in a String
|
||||||
|
do {
|
||||||
|
try {
|
||||||
|
data = br.readLine();
|
||||||
|
if (data != null)
|
||||||
|
jsonStr += data;
|
||||||
|
else
|
||||||
|
isReading = false;
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
isReading = false;
|
||||||
|
}
|
||||||
|
} while (isReading);
|
||||||
|
//parse JSON answer
|
||||||
|
try {
|
||||||
|
if (request != null)
|
||||||
|
request.close();
|
||||||
|
stream.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// Parse the JSON to a JSONObject
|
||||||
|
JSONObject rootObject = new JSONObject(jsonStr);
|
||||||
|
// Get msg (root) element
|
||||||
|
String msgStr = rootObject.getString("msg");
|
||||||
|
// is there an error?
|
||||||
|
if (!msgStr.contains("{")) {
|
||||||
|
listener.fileUploadError(imageUri, msgStr);
|
||||||
|
return;
|
||||||
|
} else if (rootObject.has("msg")) {
|
||||||
|
//retrieve useful data
|
||||||
|
JSONObject msg = rootObject.getJSONObject("msg");
|
||||||
|
String hashOutput = msg.getString("short");
|
||||||
|
String realHashOutput = msg.getString("real_short");
|
||||||
|
String token = msg.getString("token");
|
||||||
|
imgOutput = new Img(0, siteUrl, hashOutput, realHashOutput, Calendar.getInstance(), nbDays, null, token);
|
||||||
|
}
|
||||||
|
} catch (JSONException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
listener.fileUploadError(imageUri, context.getString(R.string.unreadable_json));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(imgOutput != null) {
|
||||||
|
listener.fileUploaded(imageUri,imgOutput);
|
||||||
|
} else {
|
||||||
|
listener.fileUploadError(imageUri, context.getString(R.string.network_error));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isConnectedToInternet(Context context)
|
|
||||||
{
|
|
||||||
//verify the connectivity
|
|
||||||
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
|
||||||
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
|
|
||||||
if (networkInfo != null)
|
|
||||||
{
|
|
||||||
State networkState = networkInfo.getState();
|
|
||||||
if (networkState.equals(State.CONNECTED))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
private boolean isConnectedToInternet(Context context) {
|
||||||
|
//verify the connectivity
|
||||||
|
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
|
||||||
|
if (networkInfo != null) {
|
||||||
|
NetworkInfo.State networkState = networkInfo.getState();
|
||||||
|
if (networkState.equals(NetworkInfo.State.CONNECTED)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Message{
|
||||||
|
Message_Type type;
|
||||||
|
Context context;
|
||||||
|
int nbDays;
|
||||||
|
String url;
|
||||||
|
Uri imageUri;
|
||||||
|
int fileNo;
|
||||||
|
int fileNb;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Message_Type{
|
||||||
|
DELETE_IMG,
|
||||||
|
UPLOAD_IMG
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -102,7 +102,7 @@ public class LinkActivity extends AppCompatActivity {
|
||||||
final NetworkAdapter listener = new NetworkAdapter() {
|
final NetworkAdapter listener = new NetworkAdapter() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteSucceed()
|
public void deleteSucceed(String deleteUrl)
|
||||||
{
|
{
|
||||||
List<Img> images = new ArrayList<>();
|
List<Img> images = new ArrayList<>();
|
||||||
images.add(image);
|
images.add(image);
|
||||||
|
@ -145,10 +145,10 @@ public class LinkActivity extends AppCompatActivity {
|
||||||
long days = millis / (24*60*60*1000);
|
long days = millis / (24*60*60*1000);
|
||||||
//storage duration has ended or not?
|
//storage duration has ended or not?
|
||||||
if(storageDuration == 0 || storageDuration - days >= 0)
|
if(storageDuration == 0 || storageDuration - days >= 0)
|
||||||
NetworkManager.getInstance(listener).deleteImage(LinkActivity.this, deleteUrl);
|
NetworkManager.getInstance(listener).delete(LinkActivity.this, deleteUrl);
|
||||||
else {
|
else {
|
||||||
//image is no more on the server, delete is only local now
|
//image is no more on the server, delete is only local now
|
||||||
listener.deleteSucceed();
|
listener.deleteSucceed(deleteUrl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,220 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2017 Anthony Chomienne, anthony@mob-dev.fr
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 3
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package fr.mobdev.goblim.activity;
|
||||||
|
|
||||||
|
import android.content.ClipboardManager;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
|
import android.support.v7.widget.Toolbar;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.ImageButton;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import fr.mobdev.goblim.Database;
|
||||||
|
import fr.mobdev.goblim.MultiLinkAdapter;
|
||||||
|
import fr.mobdev.goblim.NetworkManager;
|
||||||
|
import fr.mobdev.goblim.R;
|
||||||
|
import fr.mobdev.goblim.listener.NetworkAdapter;
|
||||||
|
import fr.mobdev.goblim.objects.Img;
|
||||||
|
|
||||||
|
public class MultiLinkActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
private ArrayList<String> sharedUrls;
|
||||||
|
private List<String> deleteUrls;
|
||||||
|
private MultiLinkAdapter adapter;
|
||||||
|
private List<Img> images;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.multilink);
|
||||||
|
|
||||||
|
Toolbar toolbar = (Toolbar) findViewById(R.id.link_toolbar);
|
||||||
|
setSupportActionBar(toolbar);
|
||||||
|
|
||||||
|
//get url information
|
||||||
|
Intent receiveIntent = getIntent();
|
||||||
|
Object[] extra = (Object[]) receiveIntent.getSerializableExtra("imageIds");
|
||||||
|
|
||||||
|
final Long[] ids = Arrays.copyOf(extra,extra.length,Long[].class);
|
||||||
|
|
||||||
|
//setup Adapter
|
||||||
|
adapter = new MultiLinkAdapter(ids.length);
|
||||||
|
RecyclerView listView = (RecyclerView) findViewById(R.id.link_list);
|
||||||
|
listView.setAdapter(adapter);
|
||||||
|
|
||||||
|
sharedUrls = new ArrayList<>();
|
||||||
|
deleteUrls = new ArrayList<>();
|
||||||
|
images = new ArrayList<>();
|
||||||
|
|
||||||
|
final ImageButton shareButton = (ImageButton) findViewById(R.id.share_button);
|
||||||
|
final ImageButton copyClipboardButton = (ImageButton) findViewById(R.id.copy_clipboard_button);
|
||||||
|
final ImageButton deleteImageButton = (ImageButton) findViewById(R.id.delete_button);
|
||||||
|
shareButton.setEnabled(false);
|
||||||
|
copyClipboardButton.setEnabled(false);
|
||||||
|
deleteImageButton.setEnabled(false);
|
||||||
|
|
||||||
|
//TODO Save For Rotation
|
||||||
|
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
int i = 0;
|
||||||
|
for(Long id : ids) {
|
||||||
|
Img image = Database.getInstance(getApplicationContext()).getImage(id);
|
||||||
|
images.add(image);
|
||||||
|
String url = image.getUrl();
|
||||||
|
String shortHash = image.getShortHash();
|
||||||
|
String realShortHash = image.getRealShortHash();
|
||||||
|
String token = image.getToken();
|
||||||
|
final Bitmap bt = image.getThumb();
|
||||||
|
final int index = i;
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
adapter.setBitmap(bt,index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//add a / at the end of the url before adding the hash
|
||||||
|
if(!url.endsWith("/"))
|
||||||
|
url = url.concat("/");
|
||||||
|
String sharedUrl = url.concat(shortHash);
|
||||||
|
String deleteUrl = url.concat("d/"+realShortHash+"/"+token);
|
||||||
|
|
||||||
|
sharedUrls.add(sharedUrl);
|
||||||
|
deleteUrls.add(deleteUrl);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
shareButton.setEnabled(true);
|
||||||
|
copyClipboardButton.setEnabled(true);
|
||||||
|
deleteImageButton.setEnabled(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//manage the sharing button
|
||||||
|
shareButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
Intent sendIntent = new Intent();
|
||||||
|
sendIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
|
||||||
|
List<Integer> selected = adapter.getSelecteds();
|
||||||
|
String output = "";
|
||||||
|
for(Integer index : selected) {
|
||||||
|
output += sharedUrls.get(index)+"\n";
|
||||||
|
}
|
||||||
|
sendIntent.putExtra(Intent.EXTRA_TEXT, output);
|
||||||
|
sendIntent.setType("text/plain");
|
||||||
|
startActivity(sendIntent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//manage the clipboard button
|
||||||
|
copyClipboardButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
|
||||||
|
List<Integer> selected = adapter.getSelecteds();
|
||||||
|
String output = "";
|
||||||
|
for(Integer index : selected) {
|
||||||
|
output += sharedUrls.get(index)+"\n";
|
||||||
|
}
|
||||||
|
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied URL", output);
|
||||||
|
clipboard.setPrimaryClip(clip);
|
||||||
|
Toast.makeText(MultiLinkActivity.this,getString(R.string.copy_to_clipboard),Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final NetworkAdapter listener = new NetworkAdapter() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteSucceed(String deleteUrl)
|
||||||
|
{
|
||||||
|
List<Img> imgs = new ArrayList<>();
|
||||||
|
int idx = deleteUrls.indexOf(deleteUrl);
|
||||||
|
if(idx < 0 || idx >= images.size())
|
||||||
|
return;
|
||||||
|
imgs.add(images.get(idx));
|
||||||
|
Database.getInstance(getApplicationContext()).deleteImg(imgs);
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Toast.makeText(MultiLinkActivity.this, R.string.delete_succeed, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteError(final String error)
|
||||||
|
{
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Toast.makeText(MultiLinkActivity.this, error, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
deleteImageButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(MultiLinkActivity.this);
|
||||||
|
builder.setMessage(getString(R.string.delete_selected_image))
|
||||||
|
.setCancelable(false)
|
||||||
|
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
List<Integer> selected = adapter.getSelecteds();
|
||||||
|
List<String> urls = new ArrayList<>();
|
||||||
|
for(Integer index : selected) {
|
||||||
|
urls.add(deleteUrls.get(index));
|
||||||
|
}
|
||||||
|
NetworkManager.getInstance(listener).deleteMultiple(MultiLinkActivity.this, urls);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
dialog.cancel();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AlertDialog alert = builder.create();
|
||||||
|
alert.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,32 +19,39 @@
|
||||||
package fr.mobdev.goblim.activity;
|
package fr.mobdev.goblim.activity;
|
||||||
|
|
||||||
import android.app.ProgressDialog;
|
import android.app.ProgressDialog;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.ActivityInfo;
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.database.Cursor;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.provider.OpenableColumns;
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.support.v7.widget.GridLayoutManager;
|
||||||
|
import android.support.v7.widget.RecyclerView;
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
import android.util.DisplayMetrics;
|
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import android.widget.ImageButton;
|
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.ProgressBar;
|
|
||||||
import android.widget.Spinner;
|
import android.widget.Spinner;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import fr.mobdev.goblim.Database;
|
import fr.mobdev.goblim.Database;
|
||||||
|
import fr.mobdev.goblim.ImageListAdapter;
|
||||||
|
import fr.mobdev.goblim.ImageLoader;
|
||||||
import fr.mobdev.goblim.listener.NetworkAdapter;
|
import fr.mobdev.goblim.listener.NetworkAdapter;
|
||||||
import fr.mobdev.goblim.NetworkManager;
|
import fr.mobdev.goblim.NetworkManager;
|
||||||
import fr.mobdev.goblim.objects.Img;
|
import fr.mobdev.goblim.objects.Img;
|
||||||
|
@ -60,11 +67,11 @@ import fr.mobdev.goblim.R;
|
||||||
public class UploadActivity extends AppCompatActivity {
|
public class UploadActivity extends AppCompatActivity {
|
||||||
|
|
||||||
private NetworkAdapter listener;
|
private NetworkAdapter listener;
|
||||||
private Uri imageUri;
|
private ArrayList<Uri> uris;
|
||||||
private List<String> urls;
|
private List<String> urls;
|
||||||
private List<Integer> deletedDays;
|
private List<Integer> deletedDays;
|
||||||
private ProgressDialog progressDialog;
|
private ProgressDialog progressDialog;
|
||||||
private Bitmap bt;
|
private ImageListAdapter adapter;
|
||||||
|
|
||||||
//static value to handle storage durations options
|
//static value to handle storage durations options
|
||||||
private static final int NEVER = 0;
|
private static final int NEVER = 0;
|
||||||
|
@ -82,9 +89,10 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
|
|
||||||
setTitle(R.string.upload_pict);
|
setTitle(R.string.upload_pict);
|
||||||
|
hideImage();
|
||||||
|
|
||||||
//prepare data used for upload
|
//prepare data used for upload
|
||||||
imageUri = null;
|
uris = new ArrayList<>();
|
||||||
urls = new ArrayList<>();
|
urls = new ArrayList<>();
|
||||||
deletedDays = new ArrayList<>();
|
deletedDays = new ArrayList<>();
|
||||||
deletedDays.add(NEVER);
|
deletedDays.add(NEVER);
|
||||||
|
@ -92,27 +100,68 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
deletedDays.add(SEVEN);
|
deletedDays.add(SEVEN);
|
||||||
deletedDays.add(THIRTY);
|
deletedDays.add(THIRTY);
|
||||||
deletedDays.add(YEAR);
|
deletedDays.add(YEAR);
|
||||||
|
ImageView imView = (ImageView) findViewById(R.id.thumbnail_main);
|
||||||
updateServerList();
|
imView.setOnClickListener(new View.OnClickListener() {
|
||||||
ImageButton resetButton = (ImageButton) findViewById(R.id.reset_button);
|
|
||||||
resetButton.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
resetImage();
|
hideImage();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ProgressBar thumbProgress = (ProgressBar) findViewById(R.id.progress_thumb);
|
|
||||||
thumbProgress.setVisibility(View.GONE);
|
ImageListAdapter.OnImageClickListener onClickListener = new ImageListAdapter.OnImageClickListener() {
|
||||||
|
@Override
|
||||||
|
public void OnImageClick(Uri imageUri) {
|
||||||
|
displayImage(adapter.getForUri(imageUri));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRemove(Uri imageUri) {
|
||||||
|
resetImage(imageUri);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ImageLoader.ImageLoaderListener loaderListener = new ImageLoader.ImageLoaderListener() {
|
||||||
|
@Override
|
||||||
|
public void thumbLoaded(final Uri imageUri, final Bitmap thumb) {
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
adapter.setBitmapForUri(imageUri,thumb);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void allThumbLoaded() {
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Button send = (Button) findViewById(R.id.upload_button);
|
||||||
|
send.setEnabled(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
adapter = new ImageListAdapter(onClickListener,loaderListener);
|
||||||
|
|
||||||
|
updateServerList();
|
||||||
|
RecyclerView th = (RecyclerView) findViewById(R.id.imageList);
|
||||||
|
th.setAdapter(adapter);
|
||||||
|
Button uploadBt = (Button) findViewById(R.id.upload_button);
|
||||||
//retrieve previous state if it exist
|
//retrieve previous state if it exist
|
||||||
if(savedInstanceState != null) {
|
if(savedInstanceState != null) {
|
||||||
int selectedServer = savedInstanceState.getInt("selectedServer");
|
int selectedServer = savedInstanceState.getInt("selectedServer");
|
||||||
imageUri = savedInstanceState.getParcelable("imageURI");
|
uris = savedInstanceState.getParcelableArrayList("imageURI");
|
||||||
bt = savedInstanceState.getParcelable("thumb");
|
ArrayList<String> cacheUris = savedInstanceState.getStringArrayList("thumb");
|
||||||
if(bt != null) {
|
List<Bitmap> bitmaps = loadFromCache(cacheUris);
|
||||||
ImageView th = (ImageView) findViewById(R.id.thumbnail_main);
|
if(bitmaps != null) {
|
||||||
th.setImageBitmap(bt);
|
adapter.addUris(this,uris,false);
|
||||||
} else {
|
adapter.setBitmapsForUris(this,uris,bitmaps);
|
||||||
displayImage();
|
boolean allLoaded = true;
|
||||||
|
for(Bitmap bitmap : bitmaps){
|
||||||
|
if(bitmap == null)
|
||||||
|
allLoaded = false;
|
||||||
|
}
|
||||||
|
uploadBt.setEnabled(allLoaded);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectedServer < urls.size()) {
|
if (selectedServer < urls.size()) {
|
||||||
|
@ -120,62 +169,140 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
servers.setSelection(selectedServer);
|
servers.setSelection(selectedServer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
deleteCache();
|
||||||
|
|
||||||
//prepare the listener that handle upload result
|
//prepare the listener that handle upload result
|
||||||
listener = new NetworkAdapter() {
|
listener = new NetworkAdapter() {
|
||||||
|
|
||||||
|
List<Long> results = new ArrayList<>();
|
||||||
|
List<Uri> fileInError = new ArrayList<>();
|
||||||
|
List<String> errorMsg = new ArrayList<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fileUploaded(final Img image) {
|
public void fileUploaded(final Uri imageUri,final Img image) {
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
bt.compress(Bitmap.CompressFormat.JPEG,70,outputStream);
|
adapter.getForUri(imageUri).compress(Bitmap.CompressFormat.JPEG,70,outputStream);
|
||||||
image.setThumbData(outputStream.toByteArray());
|
image.setThumbData(outputStream.toByteArray());
|
||||||
|
|
||||||
//add uploaded img to history
|
//add uploaded img to history
|
||||||
Long id = Database.getInstance(getApplicationContext()).addImage(image);
|
Long id = Database.getInstance(getApplicationContext()).addImage(image);
|
||||||
//dismiss progressDialog
|
results.add(id);
|
||||||
if(progressDialog!=null)
|
if(results.size() + fileInError.size() == uris.size())
|
||||||
progressDialog.dismiss();
|
allFileUploaded();
|
||||||
resetImage();
|
|
||||||
//launch LinkActivity
|
|
||||||
Intent linkIntent = new Intent(UploadActivity.this,LinkActivity.class);
|
|
||||||
linkIntent.putExtra("imageId", id);
|
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
|
|
||||||
startActivity(linkIntent);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fileUploadError(final String error) {
|
public void fileUploadError(final Uri imageUri, final String error) {
|
||||||
|
fileInError.add(imageUri);
|
||||||
|
errorMsg.add(error);
|
||||||
|
if(results.size() + fileInError.size() == uris.size())
|
||||||
|
allFileUploaded();
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
//display toast error
|
//display toast error
|
||||||
Toast.makeText(UploadActivity.this, error, Toast.LENGTH_SHORT).show();
|
Toast.makeText(UploadActivity.this, error, Toast.LENGTH_SHORT).show();
|
||||||
if(progressDialog != null) {
|
|
||||||
progressDialog.dismiss();
|
|
||||||
progressDialog = null;
|
|
||||||
}
|
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void uploadProgress(final int progress, final int length) {
|
public void uploadProgress(final int progress, final int length, final int fileNo, final int nbFiles) {
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
progressDialog.setProgress(progress*100/length);
|
if(progressDialog != null) {
|
||||||
|
progressDialog.setMessage(getString(R.string.uploading_files)+" "+fileNo+"/"+nbFiles);
|
||||||
|
progressDialog.setProgress(progress * 100 / length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void allFileUploaded() {
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if(progressDialog != null) {
|
||||||
|
progressDialog.dismiss();
|
||||||
|
progressDialog = null;
|
||||||
|
}
|
||||||
|
if(!fileInError.isEmpty()) {
|
||||||
|
String failed = "";
|
||||||
|
String[] proj = {OpenableColumns.DISPLAY_NAME};
|
||||||
|
for(int i = 0; i < fileInError.size(); i++) {
|
||||||
|
Cursor cursor = getContentResolver().query(fileInError.get(i), proj, null, null, null);
|
||||||
|
String fileName = null;
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
fileName = cursor.getString(0);
|
||||||
|
cursor.close();
|
||||||
|
}
|
||||||
|
if(fileName == null)
|
||||||
|
fileName="File "+i;
|
||||||
|
failed += fileName;
|
||||||
|
failed += "\n\t";
|
||||||
|
failed += errorMsg.get(i);
|
||||||
|
failed += "\n";
|
||||||
|
}
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(UploadActivity.this);
|
||||||
|
String message;
|
||||||
|
if(fileInError.size() > 1)
|
||||||
|
message = getString(R.string.retry_failed_uploads);
|
||||||
|
else
|
||||||
|
message = getString(R.string.retry_failed_upload);
|
||||||
|
builder.setMessage(message+"\n"+failed)
|
||||||
|
.setCancelable(false)
|
||||||
|
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
uploadImages(fileInError);
|
||||||
|
fileInError.clear();
|
||||||
|
errorMsg.clear();
|
||||||
|
dialog.dismiss();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int id) {
|
||||||
|
startLinkActivity(true);
|
||||||
|
fileInError.clear();
|
||||||
|
errorMsg.clear();
|
||||||
|
dialog.cancel();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
AlertDialog alert = builder.create();
|
||||||
|
alert.show();
|
||||||
|
} else {
|
||||||
|
startLinkActivity(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startLinkActivity(boolean force) {
|
||||||
|
Intent linkIntent = null;
|
||||||
|
if(results.size() == 1 && (fileInError.isEmpty() || force)) {
|
||||||
|
//launch LinkActivity
|
||||||
|
linkIntent = new Intent(UploadActivity.this, LinkActivity.class);
|
||||||
|
linkIntent.putExtra("imageId", results.get(0));
|
||||||
|
} else if(results.size() > 1 && (fileInError.isEmpty() || force)) {
|
||||||
|
linkIntent = new Intent(UploadActivity.this,MultiLinkActivity.class);
|
||||||
|
linkIntent.putExtra("imageIds", results.toArray());
|
||||||
|
}
|
||||||
|
if(linkIntent != null) {
|
||||||
|
resetImages();
|
||||||
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
|
||||||
|
startActivity(linkIntent);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
//prepare for upload
|
//prepare for upload
|
||||||
Button uploadBt = (Button) findViewById(R.id.upload_button);
|
|
||||||
uploadBt.setOnClickListener(new View.OnClickListener() {
|
uploadBt.setOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
|
@ -183,36 +310,39 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
|
||||||
uploadImage();
|
uploadImages(uris);
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//prepare for asking user the image he want share
|
|
||||||
Button selectBt = (Button) findViewById(R.id.select_button);
|
|
||||||
selectBt.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
requestFile();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//have we receive image from share or do you need to ask it to the user if we haven't ask for it before (screen rotation)
|
//have we receive image from share or do you need to ask it to the user if we haven't ask for it before (screen rotation)
|
||||||
Intent receiveIntent = getIntent();
|
Intent receiveIntent = getIntent();
|
||||||
if((receiveIntent == null || receiveIntent.getType() == null || !receiveIntent.getType().contains("image/")) && imageUri == null) {
|
if((receiveIntent == null || receiveIntent.getType() == null || !receiveIntent.getType().contains("image/")) && uris.isEmpty()) {
|
||||||
uploadBt.setVisibility(View.GONE);
|
uploadBt.setEnabled(false);
|
||||||
resetButton.setVisibility(View.GONE);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
selectBt.setVisibility(View.GONE);
|
if(receiveIntent != null && receiveIntent.getAction() != null) {
|
||||||
if(receiveIntent != null && imageUri == null) {
|
if(receiveIntent.getAction().equals(Intent.ACTION_SEND)) {
|
||||||
imageUri = receiveIntent.getParcelableExtra(Intent.EXTRA_STREAM);
|
Uri imUri = receiveIntent.getParcelableExtra(Intent.EXTRA_STREAM);
|
||||||
|
uris.add(imUri);
|
||||||
|
adapter.addUri(this,imUri);
|
||||||
|
uploadBt.setEnabled(false);
|
||||||
|
} else if(receiveIntent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
|
||||||
|
ArrayList<Uri> imUris = receiveIntent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
|
||||||
|
if(imUris != null) {
|
||||||
|
uris.addAll(imUris);
|
||||||
|
adapter.addUris(this,imUris,true);
|
||||||
|
uploadBt.setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
displayImage();
|
|
||||||
}
|
}
|
||||||
|
updateSpanCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
@ -223,14 +353,64 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
@Override
|
@Override
|
||||||
protected void onSaveInstanceState(Bundle savedInstanceState) {
|
protected void onSaveInstanceState(Bundle savedInstanceState) {
|
||||||
//save imageURI and selected server position
|
//save imageURI and selected server position
|
||||||
savedInstanceState.putParcelable("imageURI", imageUri);
|
|
||||||
Spinner selectedServer = (Spinner) findViewById(R.id.servers_spinner);
|
Spinner selectedServer = (Spinner) findViewById(R.id.servers_spinner);
|
||||||
int pos = selectedServer.getSelectedItemPosition();
|
int pos = selectedServer.getSelectedItemPosition();
|
||||||
savedInstanceState.putInt("selectedServer", pos);
|
savedInstanceState.putInt("selectedServer", pos);
|
||||||
savedInstanceState.putParcelable("thumb",bt);
|
savedInstanceState.putParcelableArrayList("imageURI", uris);
|
||||||
|
ArrayList<String> cacheUris = writesToCache(adapter.getBitmaps());
|
||||||
|
savedInstanceState.putStringArrayList("thumb",cacheUris);
|
||||||
super.onSaveInstanceState(savedInstanceState);
|
super.onSaveInstanceState(savedInstanceState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ArrayList<String> writesToCache(List<Bitmap> bitmaps){
|
||||||
|
ArrayList<String> paths = new ArrayList<>();
|
||||||
|
File thumbDir = new File(getCacheDir(),"thumbs");
|
||||||
|
boolean exist = thumbDir.exists();
|
||||||
|
if(!exist) {
|
||||||
|
exist = thumbDir.mkdir();
|
||||||
|
}
|
||||||
|
if(exist)
|
||||||
|
{
|
||||||
|
for(Bitmap bt : bitmaps) {
|
||||||
|
if(bt == null) {
|
||||||
|
paths.add(null);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
File thumb = File.createTempFile("File","tmp",thumbDir);
|
||||||
|
if(thumb.exists()) {
|
||||||
|
paths.add(thumb.getPath());
|
||||||
|
FileOutputStream stream = new FileOutputStream(thumb);
|
||||||
|
bt.compress(Bitmap.CompressFormat.PNG,100,stream);
|
||||||
|
}
|
||||||
|
}catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Bitmap> loadFromCache(List<String> paths) {
|
||||||
|
List<Bitmap> bitmaps = new ArrayList<>();
|
||||||
|
for(String path : paths) {
|
||||||
|
if(path != null) {
|
||||||
|
Bitmap bt = BitmapFactory.decodeFile(path);
|
||||||
|
bitmaps.add(bt);
|
||||||
|
} else {
|
||||||
|
bitmaps.add(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bitmaps;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||||||
|
private void deleteCache() {
|
||||||
|
File thumbDir = new File(getCacheDir()+"thumb");
|
||||||
|
if(thumbDir.exists())
|
||||||
|
thumbDir.delete();
|
||||||
|
}
|
||||||
|
|
||||||
private void updateServerList() {
|
private void updateServerList() {
|
||||||
Spinner serversSpinner = (Spinner) findViewById(R.id.servers_spinner);
|
Spinner serversSpinner = (Spinner) findViewById(R.id.servers_spinner);
|
||||||
//retrieve the selected server name in case it change his place in list
|
//retrieve the selected server name in case it change his place in list
|
||||||
|
@ -254,34 +434,21 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
serversSpinner.setSelection(pos);
|
serversSpinner.setSelection(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displayImage() {
|
private void displayImage(Bitmap bt) {
|
||||||
if(imageUri != null) {
|
if(bt != null) {
|
||||||
//display it in the imageView
|
//display it in the imageView
|
||||||
final ProgressBar thumbProgress = (ProgressBar) findViewById(R.id.progress_thumb);
|
|
||||||
thumbProgress.setVisibility(View.VISIBLE);
|
|
||||||
final ImageView view = (ImageView) findViewById(R.id.thumbnail_main);
|
final ImageView view = (ImageView) findViewById(R.id.thumbnail_main);
|
||||||
view.setVisibility(View.GONE);
|
view.setVisibility(View.VISIBLE);
|
||||||
final Button send = (Button) findViewById(R.id.upload_button);
|
view.setImageBitmap(bt);
|
||||||
send.setEnabled(false);
|
|
||||||
new Thread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
bt = generateThumb(imageUri);
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
view.setVisibility(View.VISIBLE);
|
|
||||||
view.setImageBitmap(bt);
|
|
||||||
thumbProgress.setVisibility(View.GONE);
|
|
||||||
send.setEnabled(true);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}).start();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void uploadImage() {
|
private void hideImage() {
|
||||||
|
final ImageView view = (ImageView) findViewById(R.id.thumbnail_main);
|
||||||
|
view.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void uploadImages(List<Uri> imageUris) {
|
||||||
//what server we use
|
//what server we use
|
||||||
Spinner urlSpinner = (Spinner)findViewById(R.id.servers_spinner);
|
Spinner urlSpinner = (Spinner)findViewById(R.id.servers_spinner);
|
||||||
int pos = urlSpinner.getSelectedItemPosition();
|
int pos = urlSpinner.getSelectedItemPosition();
|
||||||
|
@ -315,20 +482,30 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
progressDialog.show();
|
progressDialog.show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
NetworkManager.getInstance(listener).upload(this,url, delete, imageUri);
|
NetworkManager.getInstance(listener).upload(this,url, delete, imageUris);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetImage(){
|
private void resetImage(Uri imageUri) {
|
||||||
imageUri = null;
|
uris.remove(imageUri);
|
||||||
bt = null;
|
|
||||||
ImageView view = (ImageView) findViewById(R.id.thumbnail_main);
|
ImageView view = (ImageView) findViewById(R.id.thumbnail_main);
|
||||||
view.setImageBitmap(null);
|
view.setImageBitmap(null);
|
||||||
ImageButton resetButton = (ImageButton) findViewById(R.id.reset_button);
|
view.setVisibility(View.GONE);
|
||||||
resetButton.setVisibility(View.GONE);
|
Button bt = (Button) findViewById(R.id.upload_button);
|
||||||
Button selectButton = (Button) findViewById(R.id.select_button);
|
if (bt.isEnabled() && uris.size() == 0) {
|
||||||
selectButton.setVisibility(View.VISIBLE);
|
bt.setEnabled(false);
|
||||||
Button uploadButton = (Button) findViewById(R.id.upload_button);
|
}
|
||||||
uploadButton.setVisibility(View.GONE);
|
updateSpanCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetImages(){
|
||||||
|
uris.clear();
|
||||||
|
adapter.clear();
|
||||||
|
ImageView view = (ImageView) findViewById(R.id.thumbnail_main);
|
||||||
|
view.setImageBitmap(null);
|
||||||
|
view.setVisibility(View.GONE);
|
||||||
|
Button bt = (Button) findViewById(R.id.upload_button);
|
||||||
|
bt.setEnabled(false);
|
||||||
|
updateSpanCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void requestFile() {
|
private void requestFile() {
|
||||||
|
@ -339,37 +516,27 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Bitmap generateThumb(Uri imageUri){
|
|
||||||
|
|
||||||
Bitmap thumb = null;
|
|
||||||
try {
|
|
||||||
BitmapFactory.Options opts = new BitmapFactory.Options();
|
|
||||||
opts.inScaled = true;
|
|
||||||
opts.inDensity = 640;
|
|
||||||
opts.inTargetDensity = DisplayMetrics.DENSITY_MEDIUM;
|
|
||||||
thumb = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri),null,opts);
|
|
||||||
System.out.println("thumb "+thumb.getWidth()+"x"+thumb.getHeight());
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return thumb;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActivityResult(int requestCode, int resultCode,Intent returnIntent) {
|
public void onActivityResult(int requestCode, int resultCode,Intent returnIntent) {
|
||||||
if(resultCode == RESULT_OK){
|
if(resultCode == RESULT_OK){
|
||||||
//retrieve uri from the request image activity and prepare
|
//retrieve uri from the request image activity and prepare
|
||||||
imageUri = returnIntent.getData();
|
Uri imageUri = returnIntent.getData();
|
||||||
|
uris.add(imageUri);
|
||||||
|
updateSpanCount();
|
||||||
|
adapter.addUri(this,imageUri);
|
||||||
|
|
||||||
Button uploadBt = (Button) findViewById(R.id.upload_button);
|
Button uploadBt = (Button) findViewById(R.id.upload_button);
|
||||||
uploadBt.setVisibility(View.VISIBLE);
|
uploadBt.setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Button selectButton = (Button) findViewById(R.id.select_button);
|
private void updateSpanCount() {
|
||||||
selectButton.setVisibility(View.GONE);
|
RecyclerView view = (RecyclerView) findViewById(R.id.imageList);
|
||||||
|
GridLayoutManager manager = (GridLayoutManager) view.getLayoutManager();
|
||||||
ImageButton resetButton = (ImageButton) findViewById(R.id.reset_button);
|
if(uris.size() > 1) {
|
||||||
resetButton.setVisibility(View.VISIBLE);
|
manager.setSpanCount(2);
|
||||||
displayImage();
|
} else {
|
||||||
|
manager.setSpanCount(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,6 +552,10 @@ public class UploadActivity extends AppCompatActivity {
|
||||||
Intent newIntent = null;
|
Intent newIntent = null;
|
||||||
if (id == R.id.action_manage_server) {
|
if (id == R.id.action_manage_server) {
|
||||||
newIntent = new Intent(this,ServersActivity.class);
|
newIntent = new Intent(this,ServersActivity.class);
|
||||||
|
} else if(id == R.id.action_add_image) {
|
||||||
|
requestFile();
|
||||||
|
} else if(id == R.id.action_clear) {
|
||||||
|
resetImages();
|
||||||
}
|
}
|
||||||
if(newIntent != null)
|
if(newIntent != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,22 +18,24 @@
|
||||||
|
|
||||||
package fr.mobdev.goblim.listener;
|
package fr.mobdev.goblim.listener;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
import fr.mobdev.goblim.objects.Img;
|
import fr.mobdev.goblim.objects.Img;
|
||||||
|
|
||||||
public class NetworkAdapter implements NetworkListener{
|
public class NetworkAdapter implements NetworkListener{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fileUploaded(Img image) {
|
public void fileUploaded(Uri imageUri, Img image) {
|
||||||
//do nothing
|
//do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fileUploadError(String error) {
|
public void fileUploadError(Uri imageUri, String error) {
|
||||||
//do nothing
|
//do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteSucceed() {
|
public void deleteSucceed(String deleteUrl) {
|
||||||
//do nothing
|
//do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +45,12 @@ public class NetworkAdapter implements NetworkListener{
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void uploadProgress(int byteWriten, int length) {
|
public void uploadProgress(int byteWriten, int length, int fileNo, int nbFiles) {
|
||||||
|
//do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void allFileUploaded() {
|
||||||
|
//do nothing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,14 +18,17 @@
|
||||||
|
|
||||||
package fr.mobdev.goblim.listener;
|
package fr.mobdev.goblim.listener;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
import java.util.EventListener;
|
import java.util.EventListener;
|
||||||
|
|
||||||
import fr.mobdev.goblim.objects.Img;
|
import fr.mobdev.goblim.objects.Img;
|
||||||
|
|
||||||
public interface NetworkListener extends EventListener{
|
public interface NetworkListener extends EventListener{
|
||||||
void fileUploaded(Img image);
|
void fileUploaded(Uri imageUri, Img image);
|
||||||
void fileUploadError(String error);
|
void fileUploadError(Uri imageUri, String error);
|
||||||
void deleteSucceed();
|
void deleteSucceed(String url);
|
||||||
void deleteError(String error);
|
void deleteError(String error);
|
||||||
void uploadProgress(int byteWriten, int length);
|
void uploadProgress(int byteWriten, int length, int fileNo, int fileNb);
|
||||||
|
void allFileUploaded();
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,20 +42,10 @@
|
||||||
android:layout_marginTop="25dp"
|
android:layout_marginTop="25dp"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Button
|
|
||||||
android:layout_above="@+id/upload_button"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/select_pict"
|
|
||||||
android:id="@+id/select_button"
|
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_marginTop="25dp"
|
|
||||||
/>
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/spinners_layout"
|
android:id="@+id/spinners_layout"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:layout_above="@+id/select_button"
|
android:layout_above="@+id/upload_button"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
<Spinner
|
<Spinner
|
||||||
|
@ -88,34 +78,26 @@
|
||||||
/>
|
/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
<ProgressBar
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
android:layout_above="@+id/spinners_layout"
|
android:layout_above="@+id/spinners_layout"
|
||||||
android:layout_below="@+id/reset_button"
|
|
||||||
android:id="@+id/progress_thumb"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_centerVertical="true"
|
|
||||||
/>
|
|
||||||
<ImageView
|
|
||||||
android:layout_above="@+id/spinners_layout"
|
|
||||||
android:layout_below="@+id/reset_button"
|
|
||||||
android:id="@+id/thumbnail_main"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_centerHorizontal="true"
|
android:layout_centerHorizontal="true"
|
||||||
/>
|
>
|
||||||
|
<android.support.v7.widget.RecyclerView
|
||||||
<ImageButton
|
android:id="@+id/imageList"
|
||||||
android:layout_width="20dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="20dp"
|
android:layout_height="match_parent"
|
||||||
android:layout_marginBottom="10dp"
|
app:layoutManager="android.support.v7.widget.GridLayoutManager"
|
||||||
android:src="@android:drawable/ic_delete"
|
/>
|
||||||
android:id="@+id/reset_button"
|
<ImageView
|
||||||
android:layout_alignParentRight="true"
|
android:id="@+id/thumbnail_main"
|
||||||
android:layout_alignParentTop="true"
|
android:layout_width="match_parent"
|
||||||
/>
|
android:layout_height="match_parent"
|
||||||
|
/>
|
||||||
|
</FrameLayout>
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
</android.support.design.widget.CoordinatorLayout>
|
</android.support.design.widget.CoordinatorLayout>
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_margin="5dp"
|
||||||
|
>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:id="@+id/selected"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progress"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/thumbnail_link"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
|
@ -0,0 +1,74 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.design.widget.CoordinatorLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:fitsSystemWindows="true"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
tools:context="fr.mobdev.goblim.activity.MultiLinkActivity"
|
||||||
|
>
|
||||||
|
|
||||||
|
<android.support.design.widget.AppBarLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:theme="@style/AppTheme.PopupOverlay">
|
||||||
|
|
||||||
|
<android.support.v7.widget.Toolbar
|
||||||
|
android:id="@+id/link_toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
app:popupTheme="@style/AppTheme.PopupOverlay"
|
||||||
|
/>
|
||||||
|
</android.support.design.widget.AppBarLayout>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
|
android:paddingBottom="@dimen/activity_vertical_margin"
|
||||||
|
android:paddingLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:paddingTop="@dimen/activity_vertical_margin"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<android.support.v7.widget.RecyclerView
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_above="@id/buttons_layout"
|
||||||
|
android:id="@+id/link_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layoutManager="android.support.v7.widget.GridLayoutManager"
|
||||||
|
app:spanCount="2"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:gravity="center"
|
||||||
|
android:id="@+id/buttons_layout"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
>
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/copy_clipboard_button"
|
||||||
|
android:src="@drawable/abc_ic_menu_copy_mtrl_am_alpha"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:src="@android:drawable/ic_menu_share"
|
||||||
|
android:id="@+id/share_button"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:src="@android:drawable/ic_menu_delete"
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:id="@+id/delete_button"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
</RelativeLayout>
|
||||||
|
</android.support.design.widget.CoordinatorLayout>
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent" android:layout_height="200dp"
|
||||||
|
android:layout_margin="5dp"
|
||||||
|
>
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progress_thumb"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
<ImageView
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_below="@+id/reset_img"
|
||||||
|
android:id="@+id/thumbnail_item"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
/>
|
||||||
|
<ImageButton
|
||||||
|
android:layout_width="20dp"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:layout_marginBottom="10dp"
|
||||||
|
android:src="@android:drawable/ic_delete"
|
||||||
|
android:id="@+id/reset_img"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
|
@ -42,19 +42,9 @@
|
||||||
android:layout_marginTop="25dp"
|
android:layout_marginTop="25dp"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Button
|
|
||||||
android:layout_above="@+id/upload_button"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/select_pict"
|
|
||||||
android:id="@+id/select_button"
|
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_marginTop="25dp"
|
|
||||||
/>
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:layout_above="@+id/select_button"
|
android:layout_above="@+id/upload_button"
|
||||||
android:id="@+id/layout_days"
|
android:id="@+id/layout_days"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -63,7 +53,6 @@
|
||||||
>
|
>
|
||||||
<TextView
|
<TextView
|
||||||
android:text="@string/duration"
|
android:text="@string/duration"
|
||||||
android:singleLine="false"
|
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginLeft="15dp"/>
|
android:layout_marginLeft="15dp"/>
|
||||||
|
@ -81,33 +70,24 @@
|
||||||
android:id="@+id/servers_spinner"
|
android:id="@+id/servers_spinner"
|
||||||
android:layout_marginTop="25dp"
|
android:layout_marginTop="25dp"
|
||||||
/>
|
/>
|
||||||
|
<FrameLayout
|
||||||
<ProgressBar
|
android:layout_alignParentTop="true"
|
||||||
android:layout_above="@+id/servers_spinner"
|
android:layout_above="@id/servers_spinner"
|
||||||
android:layout_below="@+id/reset_button"
|
|
||||||
android:id="@+id/progress_thumb"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_centerVertical="true"
|
|
||||||
/>
|
|
||||||
<ImageView
|
|
||||||
android:layout_above="@+id/servers_spinner"
|
|
||||||
android:layout_below="@+id/reset_button"
|
|
||||||
android:id="@+id/thumbnail_main"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_centerHorizontal="true"
|
android:layout_centerHorizontal="true"
|
||||||
|
>
|
||||||
|
<android.support.v7.widget.RecyclerView
|
||||||
|
android:id="@+id/imageList"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layoutManager="android.support.v7.widget.GridLayoutManager"
|
||||||
|
/>
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/thumbnail_main"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
/>
|
/>
|
||||||
|
</FrameLayout>
|
||||||
<ImageButton
|
|
||||||
android:layout_width="20dp"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_marginBottom="10dp"
|
|
||||||
android:src="@android:drawable/ic_delete"
|
|
||||||
android:id="@+id/reset_button"
|
|
||||||
android:layout_alignParentRight="true"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
/>
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
</android.support.design.widget.CoordinatorLayout>
|
</android.support.design.widget.CoordinatorLayout>
|
||||||
|
|
|
@ -1,6 +1,16 @@
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
|
xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
|
||||||
|
<item
|
||||||
|
android:icon="@android:drawable/ic_menu_add"
|
||||||
|
android:id="@+id/action_add_image"
|
||||||
|
android:title="@string/add_image"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
|
<item
|
||||||
|
android:icon="@android:drawable/ic_menu_close_clear_cancel"
|
||||||
|
android:id="@+id/action_clear"
|
||||||
|
android:title="@string/clear_image_selection"
|
||||||
|
app:showAsAction="ifRoom" />
|
||||||
<item
|
<item
|
||||||
android:icon="@android:drawable/ic_menu_manage"
|
android:icon="@android:drawable/ic_menu_manage"
|
||||||
android:id="@+id/action_manage_server"
|
android:id="@+id/action_manage_server"
|
||||||
|
|
|
@ -33,6 +33,11 @@
|
||||||
<string name="delete_succeed">Suppression Réussie</string>
|
<string name="delete_succeed">Suppression Réussie</string>
|
||||||
<string name="default_server">Appui long pour choisir votre serveur par défaut</string>
|
<string name="default_server">Appui long pour choisir votre serveur par défaut</string>
|
||||||
<string name="delete_this_image">Supprimer cette image ?</string>
|
<string name="delete_this_image">Supprimer cette image ?</string>
|
||||||
|
<string name="delete_selected_image">Supprimer les images séléctionnées ?</string>
|
||||||
|
<string name="title_share_links">Partager les liens</string>
|
||||||
|
<string name="uploading_files">Envoi Image </string>
|
||||||
|
<string name="retry_failed_uploads">Voulez vous retenter l\'envoi des fichiers listés?</string>
|
||||||
|
<string name="retry_failed_upload">Voulez vous retenter l\'envoi de ce fichier?</string>
|
||||||
<string-array name="deleted_days">
|
<string-array name="deleted_days">
|
||||||
<item>Pas de limitation</item>
|
<item>Pas de limitation</item>
|
||||||
<item>24 Heures</item>
|
<item>24 Heures</item>
|
||||||
|
|
|
@ -33,6 +33,13 @@
|
||||||
<string name="delete_succeed">Delete Succeed</string>
|
<string name="delete_succeed">Delete Succeed</string>
|
||||||
<string name="default_server">Long click to choose your default server</string>
|
<string name="default_server">Long click to choose your default server</string>
|
||||||
<string name="delete_this_image">Delete this image?</string>
|
<string name="delete_this_image">Delete this image?</string>
|
||||||
|
<string name="add_image">Add Image</string>
|
||||||
|
<string name="clear_image_selection">Clear Image Selection</string>
|
||||||
|
<string name="delete_selected_image">Delete Selected Images?</string>
|
||||||
|
<string name="title_share_links">Share Links</string>
|
||||||
|
<string name="uploading_files">Uploading Image </string>
|
||||||
|
<string name="retry_failed_uploads">Would you retry upload of listed files?</string>
|
||||||
|
<string name="retry_failed_upload">Would you retry upload of this file?</string>
|
||||||
<string-array name="deleted_days">
|
<string-array name="deleted_days">
|
||||||
<item>No limitation</item>
|
<item>No limitation</item>
|
||||||
<item>24 Hours</item>
|
<item>24 Hours</item>
|
||||||
|
|
|
@ -5,7 +5,7 @@ buildscript {
|
||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:2.2.2'
|
classpath 'com.android.tools.build:gradle:2.2.3'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
|
|
Loading…
Reference in New Issue