package com.android.iliConnect; import java.io.File; import java.util.Date; import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.webkit.MimeTypeMap; import android.widget.EditText; import android.widget.Toast; import com.android.iliConnect.Exceptions.NetworkException; import com.android.iliConnect.dataproviders.DataDownloadThread; import com.android.iliConnect.dataproviders.FileDownloadProvider; import com.android.iliConnect.dataproviders.LocalDataProvider; import com.android.iliConnect.dataproviders.NotificationWatchThread; import com.android.iliConnect.dataproviders.RemoteDataProvider; import com.android.iliConnect.handler.AndroidNotificationBuilder; import com.android.iliConnect.models.Item; public class MainActivity extends Activity { public static MainActivity instance; public static Activity currentActivity; public RemoteDataProvider remoteDataProvider; public ProgressDialog progressDialog; public static Object syncObject = new Object(); public LocalDataProvider localDataProvider; public FileDownloadProvider download; public DataDownloadThread watchThread = new DataDownloadThread(); public NotificationWatchThread notificationThread = new NotificationWatchThread(); private EditText etUrl; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); currentActivity = this; instance = this; localDataProvider = LocalDataProvider.getInstance(); localDataProvider.init(R.xml.config); localDataProvider.init(R.xml.modification); localDataProvider.localdata.load(); localDataProvider.auth = localDataProvider.localdata.Static.auth; localDataProvider.settings = localDataProvider.localdata.Static.settings; // localDataProvider.updateLocalData(); remoteDataProvider = new RemoteDataProvider(); View login = findViewById(R.id.button1); EditText etUserID = (EditText) findViewById(R.id.editText1); EditText etPassword = (EditText) findViewById(R.id.editText2); etUrl = (EditText) findViewById(R.id.urlText); if (!localDataProvider.auth.user_id.equals("")) etUserID.setText(localDataProvider.auth.user_id); if (!localDataProvider.auth.user_id.equals("")) etPassword.setText(localDataProvider.auth.password); if (!localDataProvider.auth.url_src.equals("")) etUrl.setText(localDataProvider.auth.url_src); final File remoteDataFile = new File(MainActivity.instance.getFilesDir() + "/" + localDataProvider.remoteDataFileName); if (localDataProvider.auth.autologin && remoteDataFile.exists()) { // falls AutoLogin true ist kann eine Anmeldung ohne Sync. durchgeführt werden try { autologin(); } catch (NetworkException e) { MessageBuilder.exception_message(MainTabView.instance, e.getMessage()); e.printStackTrace(); } } login.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { EditText etUserID = (EditText) findViewById(R.id.editText1); localDataProvider.auth.user_id = etUserID.getText().toString(); EditText etPassword = (EditText) findViewById(R.id.editText2); localDataProvider.auth.password = etPassword.getText().toString(); // Prüfen, ob / an Url-Ende vorhaden und ggf. hinzufügen String url = etUrl.getText().toString(); if (!url.endsWith("/")) { url = url + "/"; } localDataProvider.auth.url_src = url; localDataProvider.auth.setLogin(true, etUserID.getText().toString(), etPassword.getText().toString(), url); localDataProvider.localdata.save(); // Login mit Syncronisation try { login(); } catch (NetworkException e) { MessageBuilder.exception_message(MainTabView.instance, e.getMessage()); e.printStackTrace(); } } }); } public MainActivity getInstance() { return instance; } public void showBrowserContent(String url) { Intent openUrlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(openUrlIntent); } public void sync(Context context) throws NetworkException { sync(context, false); } public void sync(Context context, boolean manual) throws NetworkException { boolean wlanOnly = this.localDataProvider.settings.sync_wlanonly; // wenn Context null ist, keine Sync-Meldung anzeigen if (context != null) { progressDialog = new ProgressDialog(context); progressDialog.setTitle("Synchronisation"); progressDialog.setMessage("Bitte warten..."); remoteDataProvider = new RemoteDataProvider(progressDialog); } else { remoteDataProvider = new RemoteDataProvider(); } ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo mobile = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (wlanOnly == true) { if (wifi == null || !wifi.isConnected()) { // Fehlermeldung nur ausgeben, wenn manuelle Synchronisation if (manual) { throw new NetworkException("Benötigte WLAN-Verbindung nicht vorhanden."); } } else { remoteDataProvider.execute(MainActivity.instance.localDataProvider.remoteData.getSyncUrl() + "?action=sync"); } } else { boolean showSyncError = false; if ((mobile == null || !mobile.isConnected()) && (wifi == null || !wifi.isConnected())) { showSyncError = true; } if (showSyncError) { // Fehlermeldung nur ausgeben, wenn manuelle Synchronisation if (manual) { throw new NetworkException("Benötigte Datenverbindung nicht vorhanden."); } } else { remoteDataProvider.execute(MainActivity.instance.localDataProvider.remoteData.getSyncUrl() + "?action=sync"); } } } public void showToast(final String msg) { if (msg != null && !msg.equals("")) { Toast t = Toast.makeText(MainActivity.instance, msg, Toast.LENGTH_LONG); t.show(); } } public void logout() { if (MainTabView.instance != null) MainTabView.instance.finish(); localDataProvider.remoteData.delete(); remoteDataProvider.cancel(true); AndroidNotificationBuilder.cancelNotification(); LocalDataProvider.isAvaiable = false; if (watchThread.doAsynchronousTask != null) { watchThread.doAsynchronousTask.cancel(); watchThread.doAsynchronousTask = null; } if (notificationThread.doAsynchronousTask != null) { notificationThread.doAsynchronousTask.cancel(); notificationThread.doAsynchronousTask = null; } } public void login() throws NetworkException { final File remoteDataFile = new File(MainActivity.instance.getFilesDir() + "/" + localDataProvider.remoteDataFileName); MainActivity.instance.sync(MainActivity.instance, true); new Thread(new Runnable() { public void run() { synchronized (syncObject) { Date start = new Date(); long timeout = 5000; while (!remoteDataFile.exists() || !LocalDataProvider.isAvaiable) { try { syncObject.wait(2000); } catch (InterruptedException e) { } if (new Date().getTime() - start.getTime() > timeout) break; } if (remoteDataFile.exists()) { Intent i = new Intent(MainActivity.this, MainTabView.class); startActivity(i); MainActivity.instance.runOnUiThread(new Runnable() { public void run() { if (watchThread.doAsynchronousTask == null) { watchThread.startTimer(); } } }); } } } }).start(); } public void autologin() throws NetworkException { MainActivity.instance.localDataProvider.updateLocalData(); Intent i = new Intent(MainActivity.this, MainTabView.class); startActivity(i); MainActivity.instance.runOnUiThread(new Runnable() { public void run() { if (watchThread.doAsynchronousTask == null) { watchThread.startTimer(); } } }); } @Override protected void onRestart() { EditText etUserID = (EditText) findViewById(R.id.editText1); EditText etPassword = (EditText) findViewById(R.id.editText2); EditText etUrl = (EditText) findViewById(R.id.urlText); // Bei Ausloggen Textfelder zurücksetzen etUserID.setText(""); etPassword.setText(""); etUrl.setText(localDataProvider.auth.url_src); // Instance von MainTabView überschreiben, da sonst IllegalStateExeption bei Update der View auftitt. MainTabView.instance = null; super.onRestart(); } public void openFileOrDownload(final Activity instance, final Item item) { // ProgessDialog für Downlaod definieren // TODO Auto-generated method stub // progressDialog = new ProgressDialog(MainTabView.instance); // progressDialog.setTitle("SDownload"); // progressDialog.setMessage("Bitte warten..."); ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo mobile = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); //download = new FileDownloadProvider(progressDialog, instance); download = new FileDownloadProvider(); File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); String dirPath = path + "/IliConnect/" + MainActivity.instance.localDataProvider.auth.user_id; // IliConnect-Ordner erstellen, falls noch nicht vorhanden File f = new File(dirPath); if (!f.exists() && !f.isDirectory()) { f.mkdirs(); } final String filePath = dirPath + "/" + item.getRef_id() + item.getTitle(); final File file = new File(filePath); if(item.changed && file.exists()) file.delete(); if (!file.exists()) { // Prüfen, ob Datenverbindung vorhanden if(MainActivity.instance.localDataProvider.settings.sync_wlanonly && (wifi == null || !wifi.isConnected())) { MessageBuilder.exception_message(instance, "Benötigte WLAN-Verbindung nicht vorhanden."); return; } if((mobile == null || !mobile.isConnected()) && (wifi == null || !wifi.isConnected())) { MessageBuilder.exception_message(instance, "Benötigte Datenverbindung nicht vorhanden."); return; } // Download Dialog erst anzeigen, wenn Datei auch heruntergeladen werden muss. progressDialog = ProgressDialog.show(instance, "Download", "Bitte warten"); download.execute(new String[] { localDataProvider.auth.url_src + "repository.php?ref_id=" + item.getRef_id() + "&cmd=sendfile", filePath }); } new Thread(new Runnable() { public void run() { // synchronized (syncObject) { Date start = new Date(); long timeout = 5000; Intent intent = null; boolean fileError; boolean openFileError; String ext=""; while (!file.exists()) { try { Thread.sleep(2000); } catch (InterruptedException e) { } if (new Date().getTime() - start.getTime() > timeout) break; } fileError = false; openFileError = false; if (file.exists()) { intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MimeTypeMap mime = MimeTypeMap.getSingleton(); // Funktioniert nicht zu 100% //String ext = MimeTypeMap.getFileExtensionFromUrl(filePath); int dot = filePath.lastIndexOf("."); ext = filePath.substring(dot+1, filePath.length()); String mimeType = mime.getMimeTypeFromExtension(ext); if (mimeType == null || mimeType.equals("")) { // falls Dateiendung unbekannt intent.setData(Uri.fromFile(file)); PackageManager pm = instance.getPackageManager(); List<ResolveInfo> apps = pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); // Prüfen, ob Apps vorhanden sind die die Datei öffnen könnten if (apps.size() == 0) { openFileError = true; } } else { intent.setDataAndType(Uri.fromFile(file), mimeType); } } else { fileError = true; } // Werte für UI Thread definieren final boolean downloadError = fileError; final boolean appError = openFileError; final Intent appIntent = intent; final String extension = ext; if(progressDialog != null) { progressDialog.dismiss(); } MainActivity.instance.runOnUiThread(new Runnable() { public void run() { if (MainTabView.getInstance() != null) MainTabView.getInstance().update(); if(progressDialog != null) { progressDialog.dismiss(); } if(downloadError) { MessageBuilder.download_error(MainActivity.instance, item.getTitle()); } if(appError) { try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q="+extension))); } catch (android.content.ActivityNotFoundException anfe) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://market.android.com/search?q="+extension))); } } if(appIntent != null && appError == false) { MainActivity.instance.startActivity(Intent.createChooser(appIntent, "Datei öffnen...")); } if(!downloadError) { // Datei aus ChangedFiles-Liste löschen List<Item> files = MainActivity.instance.localDataProvider.remoteData.Current.Desktop.ChangedFiles; files.remove(item); } // Views updaten MainTabView.instance.update(); } }); } // } }).start(); } public void iliasNotifier(final Activity instance, final Item item) { // ProgessDialog für Downlaod definieren // TODO Auto-generated method stub // progressDialog = new ProgressDialog(MainTabView.instance); // progressDialog.setTitle("SDownload"); // progressDialog.setMessage("Bitte warten..."); //progressDialog = ProgressDialog.show(instance, "Download", "Bitte warten"); if(!localDataProvider.settings.sync) return; download = new FileDownloadProvider(); File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); String dirPath = path + "/IliConnect/" + MainActivity.instance.localDataProvider.auth.user_id; // IliConnect-Ordner erstellen, falls noch nicht vorhanden File f = new File(dirPath); if (!f.exists() && !f.isDirectory()) { f.mkdirs(); } final String filePath = dirPath + "/.tmp"; final File file = new File(filePath); if (!file.exists()) { download.execute(new String[] { localDataProvider.auth.url_src + "repository.php?ref_id=" + item.getRef_id() + "&cmd=view", filePath }); } new Thread(new Runnable() { public void run() { // synchronized (syncObject) { Date start = new Date(); long timeout = 5000; while (!file.exists()) { try { Thread.sleep(100); } catch (InterruptedException e) { } if (new Date().getTime() - start.getTime() > timeout) break; } MainActivity.instance.runOnUiThread(new Runnable() { public void run() { if (MainTabView.getInstance() != null) MainTabView.getInstance().update(); } }); } // } }).start(); file.delete(); } }