Statistics
| Branch: | Revision:

root / src / com / rackspace / cloud / android / CloudActivity.java @ f65ce369

History | View | Annotate | Download (7.9 kB)

1 7dbfc514 koutsoub
package com.rackspace.cloud.android;
2 b722cab3 Adam Menz
3 b722cab3 Adam Menz
import java.io.IOException;
4 b722cab3 Adam Menz
import java.io.StringReader;
5 c2b54e85 Adam Menz
import java.util.Calendar;
6 b722cab3 Adam Menz
7 b722cab3 Adam Menz
import javax.xml.parsers.FactoryConfigurationError;
8 b722cab3 Adam Menz
import javax.xml.parsers.ParserConfigurationException;
9 b722cab3 Adam Menz
import javax.xml.parsers.SAXParser;
10 b722cab3 Adam Menz
import javax.xml.parsers.SAXParserFactory;
11 b722cab3 Adam Menz
12 b722cab3 Adam Menz
import org.apache.http.HttpResponse;
13 b722cab3 Adam Menz
import org.apache.http.client.ClientProtocolException;
14 b722cab3 Adam Menz
import org.apache.http.impl.client.BasicResponseHandler;
15 b722cab3 Adam Menz
import org.xml.sax.InputSource;
16 b722cab3 Adam Menz
import org.xml.sax.SAXException;
17 b722cab3 Adam Menz
import org.xml.sax.XMLReader;
18 b722cab3 Adam Menz
19 b722cab3 Adam Menz
import android.app.AlertDialog;
20 c2b54e85 Adam Menz
import android.app.Dialog;
21 b722cab3 Adam Menz
import android.app.ProgressDialog;
22 b722cab3 Adam Menz
import android.content.Context;
23 b722cab3 Adam Menz
import android.content.DialogInterface;
24 b722cab3 Adam Menz
import android.content.DialogInterface.OnCancelListener;
25 48601850 Mike Mayo
import android.content.Intent;
26 b722cab3 Adam Menz
import android.os.Bundle;
27 c2b54e85 Adam Menz
import android.view.View;
28 c2b54e85 Adam Menz
import android.view.View.OnClickListener;
29 b722cab3 Adam Menz
import android.view.ViewGroup.LayoutParams;
30 48601850 Mike Mayo
import android.view.WindowManager;
31 c2b54e85 Adam Menz
import android.widget.Button;
32 c2b54e85 Adam Menz
import android.widget.EditText;
33 b722cab3 Adam Menz
import android.widget.ProgressBar;
34 403bb53b Adam Menz
import android.widget.Toast;
35 b722cab3 Adam Menz
36 48601850 Mike Mayo
import com.rackspace.cloud.android.R;
37 48601850 Mike Mayo
import com.rackspace.cloud.servers.api.client.CloudServersException;
38 48601850 Mike Mayo
import com.rackspace.cloud.servers.api.client.http.HttpBundle;
39 48601850 Mike Mayo
import com.rackspace.cloud.servers.api.client.parsers.CloudServersFaultXMLParser;
40 48601850 Mike Mayo
41 b722cab3 Adam Menz
/*
42 b722cab3 Adam Menz
 * CloudActivity manages the display and hiding of 
43 b722cab3 Adam Menz
 * pDialog. 
44 b722cab3 Adam Menz
 * 
45 b722cab3 Adam Menz
 * Also provides many accessory methods that are common
46 b722cab3 Adam Menz
 * to Activities
47 b722cab3 Adam Menz
 */
48 6b8dad86 Adam Menz
public abstract class CloudActivity extends GaActivity{
49 b722cab3 Adam Menz
50 c2b54e85 Adam Menz
        private final int PASSWORD_PROMPT = 123;
51 6b8dad86 Adam Menz
        private Context context;
52 b722cab3 Adam Menz
        private boolean isLoading;
53 b722cab3 Adam Menz
        private ProgressDialog pDialog;
54 c2b54e85 Adam Menz
        protected AndroidCloudApplication app;
55 c2b54e85 Adam Menz
        //need to store if the user has successfully logged in
56 c2b54e85 Adam Menz
        private boolean loggedIn;
57 b722cab3 Adam Menz
        
58 b722cab3 Adam Menz
        @Override
59 403bb53b Adam Menz
        protected void onCreate(Bundle savedInstanceState){
60 403bb53b Adam Menz
                super.onCreate(savedInstanceState);
61 c2b54e85 Adam Menz
                app = (AndroidCloudApplication)this.getApplication();
62 c2b54e85 Adam Menz
63 403bb53b Adam Menz
                //So keyboard doesn't open till user clicks
64 403bb53b Adam Menz
                this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
65 403bb53b Adam Menz
        }
66 403bb53b Adam Menz
        
67 403bb53b Adam Menz
        @Override
68 b722cab3 Adam Menz
        protected void onSaveInstanceState(Bundle outState) {
69 b722cab3 Adam Menz
                super.onSaveInstanceState(outState);
70 6b8dad86 Adam Menz
71 b722cab3 Adam Menz
                outState.putBoolean("isLoading", isLoading);
72 c2b54e85 Adam Menz
                outState.putBoolean("loggedIn", loggedIn);
73 b722cab3 Adam Menz
                
74 b722cab3 Adam Menz
                if(pDialog != null && pDialog.isShowing()){
75 b722cab3 Adam Menz
                        hideDialog();
76 b722cab3 Adam Menz
                }
77 b722cab3 Adam Menz
78 b722cab3 Adam Menz
        }
79 b722cab3 Adam Menz
80 b722cab3 Adam Menz
        protected void restoreState(Bundle state) {
81 b722cab3 Adam Menz
                context = getApplicationContext();
82 c2b54e85 Adam Menz
                if (state != null && state.containsKey("loggedIn")){
83 c2b54e85 Adam Menz
                        loggedIn = state.getBoolean("loggedIn");
84 c2b54e85 Adam Menz
                }
85 c2b54e85 Adam Menz
                else{
86 c2b54e85 Adam Menz
                        loggedIn = false;
87 c2b54e85 Adam Menz
                }
88 b722cab3 Adam Menz
                
89 b722cab3 Adam Menz
                /*
90 b722cab3 Adam Menz
                 * need to restore the pDialog is was shown before
91 b722cab3 Adam Menz
                 * a config change
92 b722cab3 Adam Menz
                 */
93 b722cab3 Adam Menz
                if (state != null && state.containsKey("isLoading")){
94 b722cab3 Adam Menz
                        isLoading = state.getBoolean("isLoading");
95 b722cab3 Adam Menz
                        if(isLoading){
96 b722cab3 Adam Menz
                                showDialog();
97 b722cab3 Adam Menz
                        }
98 b722cab3 Adam Menz
                }
99 b722cab3 Adam Menz
                
100 b722cab3 Adam Menz
        }
101 b722cab3 Adam Menz
        
102 b2a2d2f1 Adam Menz
        @Override
103 b2a2d2f1 Adam Menz
        protected void onStart(){
104 b2a2d2f1 Adam Menz
                super.onStart();
105 b2a2d2f1 Adam Menz
                if(isLoading){
106 b2a2d2f1 Adam Menz
                        showDialog();
107 b2a2d2f1 Adam Menz
                }
108 b2a2d2f1 Adam Menz
        }
109 b2a2d2f1 Adam Menz
        
110 b2a2d2f1 Adam Menz
        @Override
111 b2a2d2f1 Adam Menz
        protected void onStop(){
112 b2a2d2f1 Adam Menz
                super.onStop();
113 b2a2d2f1 Adam Menz
                if(isLoading){
114 b2a2d2f1 Adam Menz
                        hideDialog();
115 b2a2d2f1 Adam Menz
                        isLoading = true;
116 b2a2d2f1 Adam Menz
                }
117 b2a2d2f1 Adam Menz
        }
118 b2a2d2f1 Adam Menz
        
119 c2b54e85 Adam Menz
        @Override
120 c2b54e85 Adam Menz
        protected void onPause(){
121 c2b54e85 Adam Menz
                super.onPause();
122 c2b54e85 Adam Menz
                Calendar cal = Calendar.getInstance();
123 c2b54e85 Adam Menz
                AndroidCloudApplication.lastPause = cal.getTimeInMillis();
124 c2b54e85 Adam Menz
        }
125 c2b54e85 Adam Menz
        
126 c2b54e85 Adam Menz
        @Override
127 c2b54e85 Adam Menz
        protected void onResume(){
128 c2b54e85 Adam Menz
                super.onResume();
129 c2b54e85 Adam Menz
                Calendar cal = Calendar.getInstance();
130 c2b54e85 Adam Menz
                long curTime = cal.getTimeInMillis();
131 c2b54e85 Adam Menz
                if(curTime - AndroidCloudApplication.lastPause > 5000){
132 c2b54e85 Adam Menz
                        verifyPassword();
133 c2b54e85 Adam Menz
                }
134 c2b54e85 Adam Menz
        }
135 c2b54e85 Adam Menz
        
136 c2b54e85 Adam Menz
        /*
137 c2b54e85 Adam Menz
         * if the application is password protected,
138 c2b54e85 Adam Menz
         * the user must provide the password before
139 c2b54e85 Adam Menz
         * gaining access
140 c2b54e85 Adam Menz
         */
141 c2b54e85 Adam Menz
        private void verifyPassword(){
142 c2b54e85 Adam Menz
                PasswordManager pwManager = new PasswordManager(getSharedPreferences(
143 c2b54e85 Adam Menz
                                Preferences.SHARED_PREFERENCES_NAME, MODE_PRIVATE));
144 c2b54e85 Adam Menz
                if(pwManager.hasPassword() && !loggedIn){
145 c2b54e85 Adam Menz
                        createCustomDialog(PASSWORD_PROMPT);
146 c2b54e85 Adam Menz
                }
147 c2b54e85 Adam Menz
        }
148 c2b54e85 Adam Menz
149 c2b54e85 Adam Menz
        private boolean rightPassword(String password){
150 c2b54e85 Adam Menz
                PasswordManager pwManager = new PasswordManager(getSharedPreferences(
151 c2b54e85 Adam Menz
                                Preferences.SHARED_PREFERENCES_NAME, MODE_PRIVATE));
152 c2b54e85 Adam Menz
                return pwManager.verifyEnteredPassword(password);
153 c2b54e85 Adam Menz
        }
154 c2b54e85 Adam Menz
155 c2b54e85 Adam Menz
156 c2b54e85 Adam Menz
        /*
157 c2b54e85 Adam Menz
         * forces the user to enter a correct password
158 c2b54e85 Adam Menz
         * before they gain access to application data
159 c2b54e85 Adam Menz
         */
160 c2b54e85 Adam Menz
        private void createCustomDialog(int id) {
161 c2b54e85 Adam Menz
                final Dialog dialog = new Dialog(CloudActivity.this);
162 c2b54e85 Adam Menz
                switch (id) {
163 c2b54e85 Adam Menz
                case PASSWORD_PROMPT:
164 c2b54e85 Adam Menz
                        dialog.setContentView(R.layout.passworddialog);
165 c2b54e85 Adam Menz
                        dialog.setTitle("Enter your password:");
166 c2b54e85 Adam Menz
                        dialog.setCancelable(false);
167 c2b54e85 Adam Menz
                        Button button = (Button) dialog.findViewById(R.id.submit_password);
168 c2b54e85 Adam Menz
                        button.setOnClickListener(new OnClickListener() {
169 c2b54e85 Adam Menz
                                public void onClick(View v){
170 c2b54e85 Adam Menz
                                        EditText passwordText = ((EditText)dialog.findViewById(R.id.submit_password_text));
171 c2b54e85 Adam Menz
                                        if(!rightPassword(passwordText.getText().toString())){
172 c2b54e85 Adam Menz
                                                passwordText.setText("");
173 c2b54e85 Adam Menz
                                                showToast("Password was incorrect.");
174 c2b54e85 Adam Menz
                                                loggedIn = false;
175 c2b54e85 Adam Menz
                                        }
176 c2b54e85 Adam Menz
                                        else{
177 c2b54e85 Adam Menz
                                                dialog.dismiss();
178 c2b54e85 Adam Menz
                                                loggedIn = true;
179 c2b54e85 Adam Menz
                                        }
180 c2b54e85 Adam Menz
                                }
181 c2b54e85 Adam Menz
182 c2b54e85 Adam Menz
                        });
183 c2b54e85 Adam Menz
                        dialog.show();
184 c2b54e85 Adam Menz
                }
185 c2b54e85 Adam Menz
        }
186 c2b54e85 Adam Menz
        
187 b722cab3 Adam Menz
        protected final void showAlert(String title, String message) {
188 b722cab3 Adam Menz
                try {
189 b722cab3 Adam Menz
                        AlertDialog alert = new AlertDialog.Builder(this).create();
190 b722cab3 Adam Menz
                        alert.setTitle(title);
191 b722cab3 Adam Menz
                        alert.setMessage(message);
192 b722cab3 Adam Menz
                        alert.setButton("OK", new DialogInterface.OnClickListener() {
193 b722cab3 Adam Menz
                                public void onClick(DialogInterface dialog, int which) {
194 b722cab3 Adam Menz
                                        return;
195 b722cab3 Adam Menz
                                }
196 b722cab3 Adam Menz
                        });
197 b722cab3 Adam Menz
                        alert.show();
198 b722cab3 Adam Menz
                } catch (Exception e) {
199 b722cab3 Adam Menz
                        e.printStackTrace();
200 b722cab3 Adam Menz
                }
201 b722cab3 Adam Menz
        }
202 b722cab3 Adam Menz
        
203 b722cab3 Adam Menz
        protected final void showError(String message, HttpBundle bundle){
204 b722cab3 Adam Menz
                Intent viewIntent = new Intent(getApplicationContext(), ServerErrorActivity.class);
205 b722cab3 Adam Menz
                viewIntent.putExtra("errorMessage", message);
206 b722cab3 Adam Menz
                viewIntent.putExtra("response", bundle.getResponseText());
207 b722cab3 Adam Menz
                viewIntent.putExtra("request", bundle.getCurlRequest());
208 b722cab3 Adam Menz
                startActivity(viewIntent);
209 b722cab3 Adam Menz
        }
210 403bb53b Adam Menz
        
211 403bb53b Adam Menz
        protected void showToast(String message) {
212 403bb53b Adam Menz
                Context context = getApplicationContext();
213 403bb53b Adam Menz
                int duration = Toast.LENGTH_SHORT;
214 403bb53b Adam Menz
                Toast toast = Toast.makeText(context, message, duration);
215 403bb53b Adam Menz
                toast.show();
216 403bb53b Adam Menz
        }
217 b722cab3 Adam Menz
218 b722cab3 Adam Menz
        protected final CloudServersException parseCloudServersException(HttpResponse response) {
219 b722cab3 Adam Menz
                CloudServersException cse = new CloudServersException();
220 b722cab3 Adam Menz
                try {
221 b722cab3 Adam Menz
                    BasicResponseHandler responseHandler = new BasicResponseHandler();
222 b722cab3 Adam Menz
                    String body = responseHandler.handleResponse(response);
223 b722cab3 Adam Menz
                    CloudServersFaultXMLParser parser = new CloudServersFaultXMLParser();
224 b722cab3 Adam Menz
                    SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
225 b722cab3 Adam Menz
                    XMLReader xmlReader = saxParser.getXMLReader();
226 b722cab3 Adam Menz
                    xmlReader.setContentHandler(parser);
227 b722cab3 Adam Menz
                    xmlReader.parse(new InputSource(new StringReader(body)));                            
228 b722cab3 Adam Menz
                    cse = parser.getException();                            
229 b722cab3 Adam Menz
                } catch (ClientProtocolException e) {
230 b722cab3 Adam Menz
                        cse = new CloudServersException();
231 b722cab3 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
232 b722cab3 Adam Menz
                } catch (IOException e) {
233 b722cab3 Adam Menz
                        cse = new CloudServersException();
234 b722cab3 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
235 b722cab3 Adam Menz
                } catch (ParserConfigurationException e) {
236 b722cab3 Adam Menz
                        cse = new CloudServersException();
237 b722cab3 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
238 b722cab3 Adam Menz
                } catch (SAXException e) {
239 b722cab3 Adam Menz
                        cse = new CloudServersException();
240 b722cab3 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
241 b722cab3 Adam Menz
                } catch (FactoryConfigurationError e) {
242 b722cab3 Adam Menz
                        cse = new CloudServersException();
243 b722cab3 Adam Menz
                        cse.setMessage(e.getLocalizedMessage());
244 b722cab3 Adam Menz
                }
245 b722cab3 Adam Menz
                return cse;
246 b722cab3 Adam Menz
        }
247 b722cab3 Adam Menz
248 b722cab3 Adam Menz
        protected final void hideDialog() {
249 b722cab3 Adam Menz
                if(pDialog != null){
250 b722cab3 Adam Menz
                        isLoading = false;
251 b722cab3 Adam Menz
                        pDialog.dismiss();
252 b722cab3 Adam Menz
                }
253 b722cab3 Adam Menz
        }
254 b722cab3 Adam Menz
255 b722cab3 Adam Menz
        protected final void showDialog() {
256 b722cab3 Adam Menz
                if(pDialog == null || !pDialog.isShowing()){
257 b722cab3 Adam Menz
                        isLoading = true;
258 54986b23 Adam Menz
                        pDialog = new ProgressDialog(this);
259 b2a2d2f1 Adam Menz
                        pDialog.setProgressStyle(R.style.NewDialog);
260 b722cab3 Adam Menz
261 b722cab3 Adam Menz
                        /*
262 b722cab3 Adam Menz
                         * if back is pressed while dialog is showing it will 
263 b722cab3 Adam Menz
                         * still finish the activity
264 b722cab3 Adam Menz
                         */
265 b722cab3 Adam Menz
                        pDialog.setOnCancelListener(new OnCancelListener() {
266 b722cab3 Adam Menz
                                @Override
267 b722cab3 Adam Menz
                                public void onCancel(DialogInterface dialog) {
268 b722cab3 Adam Menz
                                        finish();
269 b722cab3 Adam Menz
                                }
270 b722cab3 Adam Menz
                        });
271 b722cab3 Adam Menz
                        pDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
272 b722cab3 Adam Menz
                        pDialog.show();
273 b722cab3 Adam Menz
                        pDialog.setContentView(new ProgressBar(this), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
274 b722cab3 Adam Menz
                }
275 b722cab3 Adam Menz
        }
276 b722cab3 Adam Menz
        
277 b722cab3 Adam Menz
        protected Context getContext(){
278 b722cab3 Adam Menz
                return context;
279 b722cab3 Adam Menz
        }
280 b722cab3 Adam Menz
}