Statistics
| Branch: | Revision:

root / src / com / rackspacecloud / android / RackspaceCloudActivity.java @ 008df6cf

History | View | Annotate | Download (8.6 kB)

1 35e7942d Michael Mayo
package com.rackspacecloud.android;
2 35e7942d Michael Mayo
3 d8f3bb33 Michael Mayo
import java.util.ArrayList;
4 d8f3bb33 Michael Mayo
import java.util.TreeMap;
5 d8f3bb33 Michael Mayo
6 35e7942d Michael Mayo
import android.app.Activity;
7 35e7942d Michael Mayo
import android.app.AlertDialog;
8 2aaecc36 Chmouel Boudjnah
import android.app.Dialog;
9 35e7942d Michael Mayo
import android.content.Context;
10 35e7942d Michael Mayo
import android.content.DialogInterface;
11 35e7942d Michael Mayo
import android.content.Intent;
12 35e7942d Michael Mayo
import android.content.SharedPreferences;
13 35e7942d Michael Mayo
import android.content.SharedPreferences.Editor;
14 35e7942d Michael Mayo
import android.os.AsyncTask;
15 35e7942d Michael Mayo
import android.os.Bundle;
16 2aaecc36 Chmouel Boudjnah
import android.util.Log;
17 35e7942d Michael Mayo
import android.view.KeyEvent;
18 2aaecc36 Chmouel Boudjnah
import android.view.Menu;
19 2aaecc36 Chmouel Boudjnah
import android.view.MenuItem;
20 35e7942d Michael Mayo
import android.view.View;
21 35e7942d Michael Mayo
import android.widget.Button;
22 35e7942d Michael Mayo
import android.widget.EditText;
23 35e7942d Michael Mayo
import android.widget.ProgressBar;
24 35e7942d Michael Mayo
import android.widget.TextView;
25 35e7942d Michael Mayo
import android.widget.TextView.OnEditorActionListener;
26 35e7942d Michael Mayo
27 3e6fd0e9 Michael Mayo
import com.rackspace.cloud.servers.api.client.Account;
28 3e6fd0e9 Michael Mayo
import com.rackspace.cloud.servers.api.client.Flavor;
29 3e6fd0e9 Michael Mayo
import com.rackspace.cloud.servers.api.client.FlavorManager;
30 3e6fd0e9 Michael Mayo
import com.rackspace.cloud.servers.api.client.Image;
31 3e6fd0e9 Michael Mayo
import com.rackspace.cloud.servers.api.client.ImageManager;
32 3e6fd0e9 Michael Mayo
import com.rackspace.cloud.servers.api.client.http.Authentication;
33 3e6fd0e9 Michael Mayo
34 35e7942d Michael Mayo
public class RackspaceCloudActivity extends Activity implements View.OnClickListener, OnEditorActionListener {
35 35e7942d Michael Mayo
        
36 35e7942d Michael Mayo
        private static final String OPT_USERNAME = "username";
37 35e7942d Michael Mayo
        private static final String OPT_USERNAME_DEF = "";
38 35e7942d Michael Mayo
        private static final String OPT_API_KEY = "apiKey";
39 35e7942d Michael Mayo
        private static final String OPT_API_KEY_DEF = "";
40 2aaecc36 Chmouel Boudjnah
41 2aaecc36 Chmouel Boudjnah
        private static final int SHOW_PREFERENCES = 1;
42 2aaecc36 Chmouel Boudjnah
43 35e7942d Michael Mayo
        private Intent tabViewIntent;
44 2d3dd41d Michael Mayo
        private boolean authenticating;
45 e7274b25 Michael Mayo
                
46 35e7942d Michael Mayo
    /** Called when the activity is first created. */
47 35e7942d Michael Mayo
    @Override
48 35e7942d Michael Mayo
    public void onCreate(Bundle savedInstanceState) {
49 35e7942d Michael Mayo
        super.onCreate(savedInstanceState);
50 35e7942d Michael Mayo
        setContentView(R.layout.main);
51 35e7942d Michael Mayo
        ((Button) findViewById(R.id.button)).setOnClickListener(this);
52 35e7942d Michael Mayo
        ((EditText) findViewById(R.id.login_apikey)).setOnEditorActionListener(this);
53 35e7942d Michael Mayo
        loadLoginPreferences();
54 2d3dd41d Michael Mayo
        restoreState(savedInstanceState);
55 3e6fd0e9 Michael Mayo
        
56 3e6fd0e9 Michael Mayo
        // use the TabViewActivity when Cloud Files is added
57 3e6fd0e9 Michael Mayo
        // tabViewIntent = new Intent(this, TabViewActivity.class);
58 3e6fd0e9 Michael Mayo
        
59 3d6041e8 Phillip Toohill
        tabViewIntent = new Intent(this, TabViewActivity.class);
60 35e7942d Michael Mayo
    }
61 35e7942d Michael Mayo
62 2d3dd41d Michael Mayo
        @Override
63 2d3dd41d Michael Mayo
        protected void onSaveInstanceState(Bundle outState) {
64 2d3dd41d Michael Mayo
                super.onSaveInstanceState(outState);
65 2d3dd41d Michael Mayo
                outState.putBoolean("authenticating", authenticating);
66 2d3dd41d Michael Mayo
        }
67 2d3dd41d Michael Mayo
68 2aaecc36 Chmouel Boudjnah
    public boolean onCreateOptionsMenu(Menu menu) {
69 2aaecc36 Chmouel Boudjnah
        menu.add(0, SHOW_PREFERENCES, 0, "Preferences");
70 2aaecc36 Chmouel Boudjnah
        return true;
71 2aaecc36 Chmouel Boudjnah
    }
72 2aaecc36 Chmouel Boudjnah
        
73 2aaecc36 Chmouel Boudjnah
    public boolean onOptionsItemSelected(MenuItem item) {
74 2aaecc36 Chmouel Boudjnah
        
75 2aaecc36 Chmouel Boudjnah
            switch (item.getItemId()) {
76 2aaecc36 Chmouel Boudjnah
                    case SHOW_PREFERENCES:
77 2aaecc36 Chmouel Boudjnah
                            showPreferences();
78 2aaecc36 Chmouel Boudjnah
                            break;
79 2aaecc36 Chmouel Boudjnah
                        }        
80 2aaecc36 Chmouel Boudjnah
            return true;
81 2aaecc36 Chmouel Boudjnah
    }
82 2aaecc36 Chmouel Boudjnah
83 2aaecc36 Chmouel Boudjnah
    public void showPreferences() {
84 2aaecc36 Chmouel Boudjnah
        Intent settingsActivity = new Intent(getBaseContext(),
85 2aaecc36 Chmouel Boudjnah
                Preferences.class);
86 2aaecc36 Chmouel Boudjnah
        startActivity(settingsActivity);
87 2aaecc36 Chmouel Boudjnah
    }
88 2aaecc36 Chmouel Boudjnah
    
89 2d3dd41d Michael Mayo
    private void restoreState(Bundle state) {
90 2d3dd41d Michael Mayo
            if (state != null && state.containsKey("authenticating") && state.getBoolean("authenticating")) {
91 2d3dd41d Michael Mayo
                    showActivityIndicators();
92 2d3dd41d Michael Mayo
            } else {
93 2d3dd41d Michael Mayo
                    hideActivityIndicators();
94 2d3dd41d Michael Mayo
            }
95 2d3dd41d Michael Mayo
    }
96 2d3dd41d Michael Mayo
    
97 35e7942d Michael Mayo
    public void login() {
98 35e7942d Michael Mayo
            if (hasValidInput()) {
99 35e7942d Michael Mayo
                showActivityIndicators();
100 35e7942d Michael Mayo
                setLoginPreferences();
101 35e7942d Michael Mayo
                new AuthenticateTask().execute((Void[]) null);
102 35e7942d Michael Mayo
            } else {
103 35e7942d Michael Mayo
                    showAlert("Fields Missing", "User Name and API Key are required.");
104 35e7942d Michael Mayo
            }
105 35e7942d Michael Mayo
    }
106 35e7942d Michael Mayo
    
107 35e7942d Michael Mayo
    public void onClick(View view) {
108 35e7942d Michael Mayo
            login();
109 35e7942d Michael Mayo
    }
110 35e7942d Michael Mayo
    
111 35e7942d Michael Mayo
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
112 35e7942d Michael Mayo
                login();
113 35e7942d Michael Mayo
                return false;
114 35e7942d Michael Mayo
        }    
115 35e7942d Michael Mayo
116 35e7942d Michael Mayo
        private void loadLoginPreferences() {
117 35e7942d Michael Mayo
            SharedPreferences sp = this.getPreferences(Context.MODE_PRIVATE);
118 35e7942d Michael Mayo
            String username = sp.getString(OPT_USERNAME, OPT_USERNAME_DEF);            
119 35e7942d Michael Mayo
            String apiKey = sp.getString(OPT_API_KEY, OPT_API_KEY_DEF);
120 35e7942d Michael Mayo
            EditText usernameText = (EditText) findViewById(R.id.login_username);
121 35e7942d Michael Mayo
            usernameText.setText(username);
122 35e7942d Michael Mayo
            EditText apiKeyText = (EditText) findViewById(R.id.login_apikey);
123 35e7942d Michael Mayo
            apiKeyText.setText(apiKey);
124 35e7942d Michael Mayo
    }
125 35e7942d Michael Mayo
    
126 35e7942d Michael Mayo
    private void setLoginPreferences() {
127 2aaecc36 Chmouel Boudjnah
        SharedPreferences prefs = getSharedPreferences(
128 2aaecc36 Chmouel Boudjnah
                Preferences.SHARED_PREFERENCES_NAME,
129 2aaecc36 Chmouel Boudjnah
                Context.MODE_PRIVATE);
130 2aaecc36 Chmouel Boudjnah
        String resultType = prefs.getString(
131 2aaecc36 Chmouel Boudjnah
                Preferences.PREF_KEY_RESULTS_TYPE,
132 2aaecc36 Chmouel Boudjnah
                String.valueOf(Preferences.COUNTRY_US));
133 2aaecc36 Chmouel Boudjnah
        int resultTypeInt = Integer.parseInt(resultType);
134 2aaecc36 Chmouel Boudjnah
        
135 008df6cf Chmouel Boudjnah
        
136 2aaecc36 Chmouel Boudjnah
        //Default Auth Server
137 2aaecc36 Chmouel Boudjnah
        String authServer = Preferences.COUNTRY_US_AUTH_SERVER; 
138 2aaecc36 Chmouel Boudjnah
        if (resultTypeInt == Preferences.COUNTRY_UK)
139 2aaecc36 Chmouel Boudjnah
                authServer = Preferences.COUNTRY_UK_AUTH_SERVER;
140 2aaecc36 Chmouel Boudjnah
        
141 008df6cf Chmouel Boudjnah
        String customAuthServer = prefs.getString(Preferences.PREF_KEY_AUTH_SERVER, "http://");
142 008df6cf Chmouel Boudjnah
        if (!customAuthServer.equals("http://"))
143 008df6cf Chmouel Boudjnah
                authServer = customAuthServer;
144 008df6cf Chmouel Boudjnah
        
145 008df6cf Chmouel Boudjnah
        Log.d("RackSpace-Cloud", "Using AuthServer: " + authServer);
146 008df6cf Chmouel Boudjnah
        
147 35e7942d Michael Mayo
            String username = ((EditText) findViewById(R.id.login_username)).getText().toString();
148 35e7942d Michael Mayo
            String apiKey = ((EditText) findViewById(R.id.login_apikey)).getText().toString();
149 35e7942d Michael Mayo
            Account.setUsername(username);
150 35e7942d Michael Mayo
            Account.setApiKey(apiKey);
151 2aaecc36 Chmouel Boudjnah
            Account.setAuthServer(authServer);
152 2aaecc36 Chmouel Boudjnah
            
153 35e7942d Michael Mayo
            Editor e = this.getPreferences(Context.MODE_PRIVATE).edit();
154 35e7942d Michael Mayo
            e.putString(OPT_USERNAME, username);
155 35e7942d Michael Mayo
            e.putString(OPT_API_KEY, apiKey);
156 35e7942d Michael Mayo
            e.commit();                
157 35e7942d Michael Mayo
    }
158 35e7942d Michael Mayo
    
159 35e7942d Michael Mayo
    private void showAlert(String title, String message) {
160 35e7942d Michael Mayo
                AlertDialog alert = new AlertDialog.Builder(this).create();
161 35e7942d Michael Mayo
                alert.setTitle(title);
162 35e7942d Michael Mayo
                alert.setMessage(message);
163 35e7942d Michael Mayo
                alert.setButton("OK", new DialogInterface.OnClickListener() {
164 35e7942d Michael Mayo
              public void onClick(DialogInterface dialog, int which) {
165 35e7942d Michael Mayo
                return;
166 35e7942d Michael Mayo
            } }); 
167 35e7942d Michael Mayo
                alert.show();
168 3e6fd0e9 Michael Mayo
                hideActivityIndicators();
169 35e7942d Michael Mayo
    }
170 35e7942d Michael Mayo
    
171 35e7942d Michael Mayo
    private boolean hasValidInput() {
172 35e7942d Michael Mayo
            String username = ((EditText) findViewById(R.id.login_username)).getText().toString();
173 35e7942d Michael Mayo
            String apiKey = ((EditText) findViewById(R.id.login_apikey)).getText().toString();
174 35e7942d Michael Mayo
            return !"".equals(username) && !"".equals(apiKey);
175 35e7942d Michael Mayo
    }
176 35e7942d Michael Mayo
177 35e7942d Michael Mayo
    private void setActivityIndicatorsVisibility(int visibility) {
178 35e7942d Michael Mayo
        ProgressBar pb = (ProgressBar) findViewById(R.id.login_progress_bar);
179 35e7942d Michael Mayo
            TextView tv = (TextView) findViewById(R.id.login_authenticating_label);
180 35e7942d Michael Mayo
        pb.setVisibility(visibility);
181 35e7942d Michael Mayo
        tv.setVisibility(visibility);
182 35e7942d Michael Mayo
    }
183 35e7942d Michael Mayo
184 35e7942d Michael Mayo
    private void showActivityIndicators() {
185 35e7942d Michael Mayo
            setActivityIndicatorsVisibility(View.VISIBLE);
186 35e7942d Michael Mayo
    }
187 35e7942d Michael Mayo
    
188 35e7942d Michael Mayo
    private void hideActivityIndicators() {
189 35e7942d Michael Mayo
            setActivityIndicatorsVisibility(View.INVISIBLE);
190 35e7942d Michael Mayo
    }
191 35e7942d Michael Mayo
    
192 35e7942d Michael Mayo
    private class AuthenticateTask extends AsyncTask<Void, Void, Boolean> {
193 35e7942d Michael Mayo
            
194 35e7942d Michael Mayo
                @Override
195 35e7942d Michael Mayo
                protected Boolean doInBackground(Void... arg0) {
196 2d3dd41d Michael Mayo
                        authenticating = true;
197 35e7942d Michael Mayo
                        return new Boolean(Authentication.authenticate());
198 35e7942d Michael Mayo
                }
199 35e7942d Michael Mayo
            
200 35e7942d Michael Mayo
                @Override
201 35e7942d Michael Mayo
                protected void onPostExecute(Boolean result) {
202 2d3dd41d Michael Mayo
                        authenticating = false;
203 35e7942d Michael Mayo
                        if (result.booleanValue()) {
204 d8f3bb33 Michael Mayo
                                //startActivity(tabViewIntent);
205 d8f3bb33 Michael Mayo
                        new LoadImagesTask().execute((Void[]) null);                                
206 35e7942d Michael Mayo
                        } else {
207 35e7942d Michael Mayo
                                showAlert("Login Failure", "Authentication failed.  Please check your User Name and API Key.");
208 35e7942d Michael Mayo
                        }
209 d8f3bb33 Michael Mayo
                }
210 d8f3bb33 Michael Mayo
    }
211 d8f3bb33 Michael Mayo
212 d8f3bb33 Michael Mayo
    private class LoadFlavorsTask extends AsyncTask<Void, Void, ArrayList<Flavor>> {
213 d8f3bb33 Michael Mayo
            
214 d8f3bb33 Michael Mayo
                @Override
215 d8f3bb33 Michael Mayo
                protected ArrayList<Flavor> doInBackground(Void... arg0) {
216 d8f3bb33 Michael Mayo
                        return (new FlavorManager()).createList(true);
217 d8f3bb33 Michael Mayo
                }
218 d8f3bb33 Michael Mayo
            
219 d8f3bb33 Michael Mayo
                @Override
220 d8f3bb33 Michael Mayo
                protected void onPostExecute(ArrayList<Flavor> result) {
221 d8f3bb33 Michael Mayo
                        if (result != null && result.size() > 0) {
222 d8f3bb33 Michael Mayo
                                TreeMap<String, Flavor> flavorMap = new TreeMap<String, Flavor>();
223 d8f3bb33 Michael Mayo
                                for (int i = 0; i < result.size(); i++) {
224 d8f3bb33 Michael Mayo
                                        Flavor flavor = result.get(i);
225 d8f3bb33 Michael Mayo
                                        flavorMap.put(flavor.getId(), flavor);
226 d8f3bb33 Michael Mayo
                                }
227 d8f3bb33 Michael Mayo
                                Flavor.setFlavors(flavorMap);
228 d8f3bb33 Michael Mayo
                                startActivity(tabViewIntent);
229 d8f3bb33 Michael Mayo
                        } else {
230 d8f3bb33 Michael Mayo
                                showAlert("Login Failure", "There was a problem loading server flavors.  Please try again.");
231 d8f3bb33 Michael Mayo
                        }
232 35e7942d Michael Mayo
                        hideActivityIndicators();
233 35e7942d Michael Mayo
                }
234 35e7942d Michael Mayo
    }
235 35e7942d Michael Mayo
236 d8f3bb33 Michael Mayo
    private class LoadImagesTask extends AsyncTask<Void, Void, ArrayList<Image>> {
237 d8f3bb33 Michael Mayo
            
238 d8f3bb33 Michael Mayo
                @Override
239 d8f3bb33 Michael Mayo
                protected ArrayList<Image> doInBackground(Void... arg0) {
240 d8f3bb33 Michael Mayo
                        return (new ImageManager()).createList(true);
241 d8f3bb33 Michael Mayo
                }
242 d8f3bb33 Michael Mayo
            
243 d8f3bb33 Michael Mayo
                @Override
244 d8f3bb33 Michael Mayo
                protected void onPostExecute(ArrayList<Image> result) {
245 d8f3bb33 Michael Mayo
                        if (result != null && result.size() > 0) {
246 d8f3bb33 Michael Mayo
                                TreeMap<String, Image> imageMap = new TreeMap<String, Image>();
247 d8f3bb33 Michael Mayo
                                for (int i = 0; i < result.size(); i++) {
248 d8f3bb33 Michael Mayo
                                        Image image = result.get(i);
249 d8f3bb33 Michael Mayo
                                        imageMap.put(image.getId(), image);
250 d8f3bb33 Michael Mayo
                                }
251 d8f3bb33 Michael Mayo
                                Image.setImages(imageMap);
252 d8f3bb33 Michael Mayo
                                new LoadFlavorsTask().execute((Void[]) null);
253 d8f3bb33 Michael Mayo
                                //startActivity(tabViewIntent);
254 d8f3bb33 Michael Mayo
                        } else {
255 d8f3bb33 Michael Mayo
                                showAlert("Login Failure", "There was a problem loading server images.  Please try again.");
256 d8f3bb33 Michael Mayo
                        }
257 d8f3bb33 Michael Mayo
                        //hideActivityIndicators();
258 d8f3bb33 Michael Mayo
                }
259 d8f3bb33 Michael Mayo
    }
260 d8f3bb33 Michael Mayo
261 35e7942d Michael Mayo
}