diff -r 162fec525764 -r 41b0a9955c47 project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/Downloader/DownloadFragment.java --- /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 + * + * 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; + } + }; + +}