project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/Downloader/DownloadFragment.java
branchhedgeroid
changeset 6350 41b0a9955c47
child 6434 bf8bfc6ceca0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/Downloader/DownloadFragment.java	Thu Nov 24 13:44:30 2011 +0100
@@ -0,0 +1,216 @@
+/*
+ * Hedgewars for Android. An Android port of Hedgewars, a free turn based strategy game
+ * Copyright (c) 2011 Richard Deurwaarder <xeli@xelification.com>
+ *
+ * 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; version 2 of the License
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+
+package org.hedgewars.hedgeroid.Downloader;
+
+import org.hedgewars.hedgeroid.R;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.os.RemoteException;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+
+public class DownloadFragment extends Fragment{
+	public static final String EXTRA_TASK = "task";
+
+	public static final int MSG_START = 0;
+	public static final int MSG_UPDATE = 1;
+	public static final int MSG_DONE = 2;
+	public static final int MSG_FAILED = 3;
+
+	private boolean boundToService = false;
+
+	private TextView progress_sub;
+	private ProgressBar progress;
+	private Button positive, negative;
+
+	private DownloadPackage pack;
+
+	private Handler messageHandler;
+	private Messenger messenger, messengerService;
+
+	public static DownloadFragment getInstance(DownloadPackage task){
+		DownloadFragment df = new DownloadFragment();
+		Bundle args = new Bundle();
+		args.putParcelable(DownloadFragment.EXTRA_TASK, task);
+		
+		df.setArguments(args);
+		
+		return df;
+	}
+	
+	public void onActivityCreated(Bundle savedInstanceState){
+		super.onActivityCreated(savedInstanceState);
+		
+		messageHandler = new Handler(messageCallback);
+		messenger = new Messenger(messageHandler);
+		 Intent i = new Intent(getActivity(), DownloadService.class);
+         getActivity().startService(i);
+         getActivity().bindService(new Intent(getActivity(), DownloadService.class), connection, Context.BIND_AUTO_CREATE);
+	}
+	
+	public View onCreateView(LayoutInflater inflater, ViewGroup viewgroup, Bundle savedInstanceState){
+		View v = inflater.inflate(R.layout.download_progress, viewgroup, false);
+		progress_sub = (TextView)v.findViewById(R.id.progressbar_sub);
+		progress = (ProgressBar)v.findViewById(R.id.progressbar);
+
+		positive = (Button) v.findViewById(R.id.background);
+		negative = (Button) v.findViewById(R.id.cancelDownload);
+		positive.setOnClickListener(backgroundClicker);
+		negative.setOnClickListener(cancelClicker);
+
+		pack = getArguments().getParcelable(DownloadFragment.EXTRA_TASK);
+
+		return v;
+	}
+
+	private OnClickListener backgroundClicker = new OnClickListener(){
+		public void onClick(View v){
+			getActivity().finish();
+		}
+	};
+	private OnClickListener cancelClicker = new OnClickListener(){
+		public void onClick(View v){
+			if(messenger != null){
+				Message message = Message.obtain(messageHandler, DownloadService.MSG_CANCEL, pack);
+				try {
+					messengerService.send(message);
+				} catch (RemoteException e) {}
+			}
+			getActivity().finish();
+		}
+	};
+	private OnClickListener doneClicker = new OnClickListener(){
+		public void onClick(View v){
+			getActivity().finish();
+		}
+	};
+
+	private OnClickListener tryAgainClicker = new OnClickListener(){
+		public void onClick(View v){
+			if(messenger != null){
+				Message message = Message.obtain(messageHandler, DownloadService.MSG_ADDTASK, pack);
+				message.replyTo = messenger;
+				try {
+					messengerService.send(message);
+				} catch (RemoteException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	};
+
+	public void onStop(){
+		super.onStop();
+		unBindFromService();
+	}
+
+	private ServiceConnection connection = new ServiceConnection(){
+
+		public void onServiceConnected(ComponentName name, IBinder service) {
+			messengerService = new Messenger(service);
+
+			try{
+				//give the service a task
+				if(messenger != null){
+					Message message = Message.obtain(messageHandler, DownloadService.MSG_ADDTASK, pack);
+					message.replyTo = messenger;
+					messengerService.send(message);
+				}
+
+			}catch (RemoteException e){}
+		}
+
+		public void onServiceDisconnected(ComponentName name) {
+			messengerService = null;
+		}
+
+	};
+
+	private void unBindFromService(){
+		if(boundToService){
+			if(messenger != null){
+				try {
+					Message message = Message.obtain(messageHandler, DownloadService.MSG_UNREGISTER_CLIENT, pack);
+					message.replyTo = messenger;
+					messengerService.send(message);
+				} catch (RemoteException e) {
+					e.printStackTrace();
+				}
+			}
+			
+			boundToService = false;
+			getActivity().unbindService(connection);
+		}	
+	}
+
+	private Handler.Callback messageCallback = new Handler.Callback() {
+
+		public boolean handleMessage(Message msg) {
+			switch(msg.what){
+			case MSG_START:
+				progress.setMax(msg.arg1);
+				progress_sub.setText(String.format("%dkb/%dkb\n%s", 0, msg.arg1, ""));
+				positive.setText(R.string.download_background);
+				positive.setOnClickListener(backgroundClicker);
+				negative.setText(R.string.download_cancel);
+				negative.setOnClickListener(cancelClicker);
+				break;
+			case MSG_UPDATE:
+				progress_sub.setText(String.format("%d%% - %dkb/%dkb\n%s",(msg.arg1*100)/msg.arg2, msg.arg1, msg.arg2, msg.obj));
+				progress.setProgress(msg.arg1);
+				break;
+			case MSG_DONE:
+				progress.setProgress(progress.getMax());
+				progress_sub.setText(R.string.download_done);
+
+				positive.setText(R.string.download_back);
+				positive.setOnClickListener(doneClicker);
+
+				negative.setVisibility(View.INVISIBLE);
+				break;
+			case MSG_FAILED:
+				progress.setProgress(progress.getMax());
+				progress_sub.setText(R.string.download_failed);
+				positive.setText(R.string.download_back);
+				positive.setOnClickListener(doneClicker);
+
+				negative.setText(R.string.download_tryagain);
+				negative.setOnClickListener(tryAgainClicker);
+				break;
+			}
+			return false;
+		}
+	};
+
+}