Android Open Source - Todoist-for-Android Support Form






From Project

Back to project page Todoist-for-Android.

License

The source code is released under:

GNU General Public License

If you think the Android project Todoist-for-Android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*    
  This file is part of Todoist for Android?.
/*w ww . j  av  a 2 s. c  o m*/
    Todoist for Android? 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.

    Todoist for Android? 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 Todoist for Android?.  If not, see <http://www.gnu.org/licenses/>.
    
    This file incorporates work covered by the following copyright and  
   permission notice:
   
   Copyright [2010] pskink <pskink@gmail.com>
   Copyright [2010] ys1382 <ys1382@gmail.com>
   Copyright [2010] JonTheNiceGuy <JonTheNiceGuy@gmail.com>

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
*/

package com.android.applications.todoist.views;

import java.net.URI;

import org.apache.http.conn.HttpHostConnectException;
import org.xmlrpc.android.XMLRPCClient;
import org.xmlrpc.android.XMLRPCException;
import org.xmlrpc.android.XMLRPCFault;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import android.widget.AdapterView.OnItemSelectedListener;

import com.android.applications.todoist.R;
import com.android.applications.todoist.R.array;
import com.android.applications.todoist.R.id;
import com.android.applications.todoist.R.layout;
import com.android.applications.todoist.containers.SupportCase;

public class SupportForm extends Activity {
  private EditText nameText;
  private EditText emailText;
  private EditText problemText;
  private Spinner areaSpinner;
  private ArrayAdapter<CharSequence> m_adapterForSpinner;
  private Button submitButton;
  private XMLRPCClient client;
  private URI uri;
  
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.support);
    initControls();
  }
  
  //Initialize Controls
  private void initControls()
  {
    //URI of the XMLRPC Server-Side Script
    this.uri = URI.create("http://dev.drewdahl.com/server.php");
    this.client = new XMLRPCClient(uri);
    
    this.nameText = (EditText)findViewById(R.id.EditText_Name);
    this.emailText = (EditText)findViewById(R.id.EditText_Email);
    this.problemText = (EditText)findViewById(R.id.EditText_Problem);
    this.areaSpinner = (Spinner)findViewById(R.id.Spinner_Area);
    this.submitButton = (Button)findViewById(R.id.Button_Submit);
    
    //Call rpcCall() on button click
    this.submitButton.setOnClickListener(new Button.OnClickListener() 
        {
          public void onClick(View view)
          { 
            rpcCall();
          }
        });
    
    m_adapterForSpinner = ArrayAdapter.createFromResource(this, R.array.support_areas, android.R.layout.simple_spinner_item);
    m_adapterForSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    areaSpinner.setAdapter(m_adapterForSpinner);
    /*areaSpinner.setOnItemSelectedListener(
        new OnItemSelectedListener() {
          
          @Override
          public void onItemSelected(AdapterView<?> parent, View view,
              int position, long id) {
            //Do Nothing
          }

          @Override
          public void onNothingSelected(AdapterView<?> parent) {
            //Do Nothing
          }
          
        });*/
  }
  
  private void showToast(CharSequence msg)
  {
    Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
  }
  
  private void rpcCall()
  {
    if(checkValues())
    {
      Context context = getApplicationContext();
      PackageInfo info;
      
      try {
              // read current version information about this package
              PackageManager manager = context.getPackageManager();
              info = manager.getPackageInfo(context.getPackageName(), 0);
  
        } catch(Exception e) {
          //TODO: Something better here :-D
            Log.e("SupportCase", "Couldn't find package information in PackageManager", e);
            return;
        }
        
        // Create a SupportCase w/ the information entered
      SupportCase newCase = new SupportCase(this.nameText.getText().toString(),this.emailText.getText().toString(),
          this.problemText.getText().toString(), "", this.areaSpinner.getSelectedItem().toString(),
          info.packageName, info.versionName);
      
      // Report the problem
      // TODO: Add something to XMLRPCMethod that checks the result of the page (in case the site is down) 
      XMLRPCMethod method = new XMLRPCMethod("reportproblem", new XMLRPCMethodCallback() {
        public void callFinished(Object result, String str)
        {
          if((Boolean)result && emailText.getText().length() != 0)
          {
            showAlert("Success!","The problem was reported successfully. \n\nYou should receive an automated e-mail in the next few hours.","OK",true);
          }
          else if((Boolean)result)
          {
            showAlert("Success!","The problem was reported successfully. \n\nNotice: Since you did not enter your e-mail address, there will be no correspondance.","OK",true);
          }
          else
          {
            showAlert("Failure!","The problem failed to be reported.  Please try again shortly.  If this problem persists, please contact Admin@DrewDahl.com.","OK",false);
          }
        }
      });
      
      Object[] params = {
          newCase,        
      };
      
      method.call(params);
    }
  }
  
  private boolean checkValues()
  {
    if(this.problemText.getText().toString().replaceAll(" ", "") == "")
    {
      showToast("Problem Text cannot be blank.");
      return false;
    }
    
    return true;
  }
  
  private void showAlert(String title, String message, String button_text, Boolean finish)
  {
    AlertDialog.Builder dialog = new AlertDialog.Builder(this).setTitle(title).setMessage(message);
    if(finish)
    {
      dialog.setNeutralButton(button_text, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          finish();              
        }
      });
    }
    else
    {
      dialog.setNeutralButton(button_text, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          //Do nothing            
        }
      });
    }
    
    dialog.show();
  }
  
  interface XMLRPCMethodCallback {
    void callFinished(Object result, String str);
  }
  
  class XMLRPCMethod extends Thread {
    private String method;
    private Object[] params;
    private Handler handler;
    private XMLRPCMethodCallback callBack;
    public XMLRPCMethod(String method, XMLRPCMethodCallback callBack) {
      this.method = method;
      this.callBack = callBack;
      handler = new Handler();
    }
    public void call() {
      call(null);
    }
    public void call(Object[] params) {
      Log.i("RPC Call", "Calling host " + uri.getHost());
      //TODO: Show that we're calling the host
      this.params = params;
      start();
    }
    @Override
    public void run() {
        try {
          final long t0 = System.currentTimeMillis();
          final Object result = client.callEx(method, params);
          final long t1 = System.currentTimeMillis();
          handler.post(new Runnable() {
          public void run() {
            //Call went good, run along now...
            Log.i("RPC Call", "XML-RPC call took " + (t1-t0) + "ms");
            callBack.callFinished(result,"");
          }
          });
        } catch (final XMLRPCFault e) {
          handler.post(new Runnable() {
          public void run() {
            Log.e("RPC Call", "Fault message: " + e.getFaultString() + "\nFault code: " + e.getFaultCode());

            callBack.callFinished((Object)false, "1000 - Message: " + e.getFaultString() + " -- Code: " + e.getFaultCode());
          }
          });
        } catch (final XMLRPCException e) {
          handler.post(new Runnable() {
          public void run() {            
            Throwable cause = e.getCause();
            if (cause instanceof HttpHostConnectException) {
              Log.e("RPC Call", "Cannot connect to " + uri.getHost() + "\nTry again later.  If problem persists, please report this problem!");
              
              callBack.callFinished((Object)false, "1001");
            } else {
              Log.e("RPC Call", "Error " + e.getMessage());
              
              callBack.callFinished((Object)false, "1002 - Message: " + e.getMessage());
            }
          }
          });
        }
    }
  }
}




Java Source Code List

com.android.applications.todoist.Constants.java
com.android.applications.todoist.containers.Project.java
com.android.applications.todoist.containers.Projects.java
com.android.applications.todoist.containers.Query.java
com.android.applications.todoist.containers.SeparatedListAdapter.java
com.android.applications.todoist.containers.SeparatedTaskListAdapter.java
com.android.applications.todoist.containers.SupportCase.java
com.android.applications.todoist.containers.TaskListAdapter.java
com.android.applications.todoist.containers.Task.java
com.android.applications.todoist.containers.Tasks.java
com.android.applications.todoist.containers.User.java
com.android.applications.todoist.handlers.DBHelper.java
com.android.applications.todoist.handlers.TodoistAPIHandler.java
com.android.applications.todoist.handlers.WebRequest.java
com.android.applications.todoist.views.LoginPage.java
com.android.applications.todoist.views.SupportForm.java
com.android.applications.todoist.views.TasksList.java
org.xmlrpc.android.Base64Coder.java
org.xmlrpc.android.IXMLRPCSerializer.java
org.xmlrpc.android.MethodCall.java
org.xmlrpc.android.Tag.java
org.xmlrpc.android.XMLRPCClient.java
org.xmlrpc.android.XMLRPCCommon.java
org.xmlrpc.android.XMLRPCException.java
org.xmlrpc.android.XMLRPCFault.java
org.xmlrpc.android.XMLRPCSerializable.java
org.xmlrpc.android.XMLRPCSerializer.java
org.xmlrpc.android.XMLRPCServer.java