package ryan.org.wordpress.android;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import ryan.org.wordpress.android.R;
import ryan.com.commonsware.cwac.thumbnail.ThumbnailAdapter;
import ryan.org.wordpress.android.util.AlertUtil;
import ryan.org.wordpress.android.util.EscapeUtils;
import android.app.AlarmManager;
import android.app.ListActivity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.Vector;
public class wpAndroid extends ListActivity {
/** Called when the activity is first created. */
public Vector<?> accounts;
public Vector<String> accountNames = new Vector<String>();
public String[] accountIDs;
public String[] blogNames;
public String[] accountUsers;
public String[] blavatars;
protected String selectedID = "";
protected ThumbnailAdapter thumbs = null;
public String blog_name = "";
protected static final int[] IMAGE_IDS = { R.id.blavatar };
public Integer default_blog = 0;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);
// verify that the user has accepted the EULA
boolean eula = checkEULA();
if (eula == false) {
DialogInterface.OnClickListener positiveListener =
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// User clicked Accept so set that they've agreed to
// the eula.
WordPressDB eulaDB = new WordPressDB(wpAndroid.this);
eulaDB.setEULA(wpAndroid.this);
displayAccounts();
}
};
DialogInterface.OnClickListener negativeListener =
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
finish(); // goodbye!
}
};
AlertUtil.showAlert(wpAndroid.this, R.string.eula, R.string.eula_content,
getString(R.string.accept), positiveListener,
getString(R.string.decline), negativeListener);
} else {
Bundle extras = getIntent().getExtras();
if(extras!=null) {
default_blog = extras.getInt("default_blog");
}
displayAccounts();
}
}
public boolean checkEULA() {
WordPressDB eulaDB = new WordPressDB(this);
boolean sEULA = eulaDB.checkEULA(this);
return sEULA;
}
public void displayAccounts() {
setContentView(R.layout.home);
setTitle(getResources().getText(R.string.app_name));
// settings time!
WordPressDB settingsDB = new WordPressDB(this);
accounts = settingsDB.getAccounts(this);
// upload stats
checkStats(accounts.size());
ListView listView = (ListView) findViewById(android.R.id.list);
ImageView iv = new ImageView(this);
iv.setBackgroundDrawable(getResources().getDrawable(
R.drawable.list_divider));
listView.addFooterView(iv);
listView.setVerticalFadingEdgeEnabled(false);
listView.setVerticalScrollBarEnabled(true);
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View row,
int position, long id) {
Bundle bundle = new Bundle();
bundle.putString("accountName", EscapeUtils.unescapeHtml(blogNames[default_blog]));
bundle.putString("id", String.valueOf(row.getId()));
bundle.putString("blavatar",blavatars[default_blog]);
bundle.putInt("default_blog", default_blog);
Intent viewPostsIntent = new Intent(wpAndroid.this,
Dashboard.class);
viewPostsIntent.putExtras(bundle);
startActivityForResult(viewPostsIntent, 1);
}
});
listView
.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
View row = info.targetView;
selectedID = String.valueOf(row.getId());
menu.add(0, 0, 0, getResources().getText(
R.string.remove_account));
}
});
if (accounts.size() > 0) {
setTitle(getResources().getText(R.string.app_name) + " - "
+ getResources().getText(R.string.blogs));
ScrollView sv = new ScrollView(this);
sv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
LinearLayout layout = new LinearLayout(this);
layout.setPadding(10, 10, 10, 0);
layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
layout.setOrientation(LinearLayout.VERTICAL);
blogNames = new String[accounts.size()];
accountIDs = new String[accounts.size()];
accountUsers = new String[accounts.size()];
blavatars = new String[accounts.size()];
int validBlogCtr = 0;
for (int i = 0; i < accounts.size(); i++) {
HashMap<?, ?> curHash = (HashMap<?, ?>) accounts.get(i);
if (curHash.get("blogName") == null){
//cleaning up accounts added before v1.3.8
String deleteID = curHash.get("id").toString();
settingsDB.deleteAccount(this, deleteID);
if (validBlogCtr > 0){
validBlogCtr--;
}
}
else {
blogNames[validBlogCtr] = curHash.get("blogName").toString();
accountUsers[validBlogCtr] = curHash.get("username").toString();
accountIDs[validBlogCtr] = curHash.get("id").toString();
String url = curHash.get("url").toString();
url = url.replace("http://", "");
url = url.replace("https://", "");
String[] urlSplit = url.split("/");
url = urlSplit[0];
url = "http://gravatar.com/blavatar/"
+ ViewComments.getMd5Hash(url.trim())
+ "?s=60&d=404";
blavatars[validBlogCtr] = url;
validBlogCtr++;
}
}
if (validBlogCtr < accounts.size()){
accounts = settingsDB.getAccounts(this);
}
/*ThumbnailBus bus = new ThumbnailBus();
thumbs = new ThumbnailAdapter(this, new HomeListAdapter(this),
new SimpleWebImageCache<ThumbnailBus, ThumbnailMessage>(
null, null, 101, bus), IMAGE_IDS);
setListAdapter(thumbs);
*/
//start the comment service (it will kill itself if no blogs want notifications)
Intent intent = new Intent(wpAndroid.this, CommentBroadcastReceiver.class);
PendingIntent pIntent = PendingIntent.getBroadcast(wpAndroid.this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
String updateInterval = settingsDB.getInterval(wpAndroid.this);
if (updateInterval == ""){
updateInterval = "1 Hour";
}
int UPDATE_INTERVAL = 3600000;
if (updateInterval.equals("5 Minutes")){
UPDATE_INTERVAL = 300000;
}
else if (updateInterval.equals("10 Minutes")){
UPDATE_INTERVAL = 600000;
}
else if (updateInterval.equals("15 Minutes")){
UPDATE_INTERVAL = 900000;
}
else if (updateInterval.equals("30 Minutes")){
UPDATE_INTERVAL = 1800000;
}
else if (updateInterval.equals("1 Hour")){
UPDATE_INTERVAL = 3600000;
}
else if (updateInterval.equals("3 Hours")){
UPDATE_INTERVAL = 10800000;
}
else if (updateInterval.equals("6 Hours")){
UPDATE_INTERVAL = 21600000;
}
else if (updateInterval.equals("12 Hours")){
UPDATE_INTERVAL = 43200000;
}
else if (updateInterval.equals("Daily")){
UPDATE_INTERVAL = 86400000;
}
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5 * 1000), UPDATE_INTERVAL, pIntent);
} else {
// no account, load new account view
Intent i = new Intent(wpAndroid.this, NewAccount.class);
startActivityForResult(i, 0);
}
/* new Handler().postDelayed(new Runnable(){
public void run() {
Bundle bundle = new Bundle();
bundle.putString("accountName", EscapeUtils.unescapeHtml(blogNames[default_blog]));
bundle.putInt("id", default_blog+1);
bundle.putString("blavatar",blavatars[default_blog]);
bundle.putInt("default_blog", default_blog);
Intent mainIntent = new Intent(wpAndroid.this,Dashboard.class);
mainIntent.putExtras(bundle);
startActivityForResult(mainIntent, 1);
wpAndroid.this.finish();
}
},1000);*/
}
private void checkStats(final int numBlogs) {
WordPressDB eulaDB = new WordPressDB(this);
long lastStatsDate = eulaDB.getStatsDate(this);
long now = System.currentTimeMillis();
if ((now - lastStatsDate) > 604800000) { // works for first check as
// well
new Thread() {
public void run() {
uploadStats(numBlogs);
}
}.start();
eulaDB.setStatsDate(this);
}
}
private void uploadStats(int numBlogs) {
// gather all of the device info
WordPressDB eulaDB = new WordPressDB(this);
String uuid = eulaDB.getUUID(this);
if (uuid == ""){
uuid = UUID.randomUUID().toString();
eulaDB.updateUUID(this, uuid);
}
PackageManager pm = getPackageManager();
String app_version = "";
try {
try {
PackageInfo pi = pm.getPackageInfo("org.wordpress.android", 0);
app_version = pi.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
app_version = "N/A";
}
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String device_language = getResources().getConfiguration().locale
.getLanguage();
String mobile_country_code = tm.getNetworkCountryIso();
String mobile_network_number = tm.getNetworkOperator();
int network_type = tm.getNetworkType();
// get the network type string
String mobile_network_type = "N/A";
switch (network_type) {
case 0:
mobile_network_type = "TYPE_UNKNOWN";
break;
case 1:
mobile_network_type = "GPRS";
break;
case 2:
mobile_network_type = "EDGE";
break;
case 3:
mobile_network_type = "UMTS";
break;
case 4:
mobile_network_type = "CDMA";
break;
case 5:
mobile_network_type = "EVDO_0";
break;
case 6:
mobile_network_type = "EVDO_A";
break;
case 7:
mobile_network_type = "1xRTT";
break;
case 8:
mobile_network_type = "HSDPA";
break;
case 9:
mobile_network_type = "HSUPA";
break;
case 10:
mobile_network_type = "HSPA";
break;
}
String device_version = android.os.Build.VERSION.RELEASE;
if (device_version == null) {
device_version = "N/A";
}
int num_blogs = numBlogs;
// post the data
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost("http://api.wordpress.org/androidapp/update-check/1.0/");
post.setHeader("Content-Type", "application/x-www-form-urlencoded");
List<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("device_uuid", uuid));
pairs.add(new BasicNameValuePair("app_version", app_version));
pairs.add(new BasicNameValuePair("device_language", device_language));
pairs.add(new BasicNameValuePair("mobile_country_code", mobile_country_code));
pairs.add(new BasicNameValuePair("mobile_network_number", mobile_network_number));
pairs.add(new BasicNameValuePair("mobile_network_type", mobile_network_type));
pairs.add(new BasicNameValuePair("device_version", device_version));
pairs.add(new BasicNameValuePair("num_blogs", String.valueOf(num_blogs)));
try {
post.setEntity(new UrlEncodedFormEntity(pairs));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
client.execute(post);
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
// Add settings to menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 0, 0, getResources().getText(R.string.add_account));
MenuItem menuItem1 = menu.findItem(0);
menuItem1.setIcon(R.drawable.ic_menu_add);
menu.add(0, 1, 0, getResources()
.getText(R.string.preferences));
MenuItem menuItem2 = menu.findItem(1);
menuItem2.setIcon(R.drawable.ic_menu_prefs);
return true;
}
// Menu actions
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case 0:
Intent i = new Intent(this, NewAccount.class);
startActivityForResult(i, 0);
return true;
case 1:
Intent i2 = new Intent(this, Preferences.class);
startActivity(i2);
finish();
return true;
}
return false;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
switch (requestCode) {
case 0:
WordPressDB settingsDB = new WordPressDB(this);
accounts = settingsDB.getAccounts(this);
if (accounts.size() == 0) {
finish();
} else {
displayAccounts();
}
break;
}
}// end null check
else {
displayAccounts();
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
/* Switch on the ID of the item, to get what the user selected. */
switch (item.getItemId()) {
case 0:
DialogInterface.OnClickListener positiveListener =
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// remove the account
WordPressDB settingsDB = new WordPressDB(wpAndroid.this);
boolean deleteSuccess = settingsDB.deleteAccount(
wpAndroid.this, selectedID);
if (deleteSuccess) {
Toast.makeText(wpAndroid.this, getResources().getText(
R.string.account_removed_successfully),
Toast.LENGTH_SHORT).show();
displayAccounts();
} else {
AlertUtil.showAlert(wpAndroid.this, R.string.error, R.string.error);
}
}
};
AlertUtil.showAlert(wpAndroid.this, R.string.remove_account,
R.string.sure_to_remove_account,
getString(R.string.yes), positiveListener,
getString(R.string.no), null);
return true;
}
return false;
}
protected class HomeListAdapter extends BaseAdapter {
public HomeListAdapter(Context context) {
}
public int getCount() {
return accounts.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View pv = convertView;
ViewWrapper wrapper = null;
if (pv == null) {
LayoutInflater inflater = getLayoutInflater();
pv = inflater.inflate(R.layout.home_row, parent, false);
wrapper = new ViewWrapper(pv);
/*if (position == 0) {
usenameHeight = wrapper.getBlogUsername().getHeight();
}*/
pv.setTag(wrapper);
wrapper = new ViewWrapper(pv);
pv.setTag(wrapper);
} else {
wrapper = (ViewWrapper) pv.getTag();
}
String username = accountUsers[position];
pv.setBackgroundDrawable(getResources().getDrawable(
R.drawable.list_bg_selector));
pv.setId(Integer.valueOf(accountIDs[position]));
if (wrapper.getBlogUsername().getHeight() == 0) {
wrapper.getBlogUsername().setHeight(
(int) wrapper.getBlogName().getTextSize()
+ wrapper.getBlogUsername().getPaddingBottom());
}
wrapper.getBlogName().setText(
EscapeUtils.unescapeHtml(blogNames[position]));
wrapper.getBlogUsername().setText(
EscapeUtils.unescapeHtml(username));
if (wrapper.getBlavatar() != null) {
try {
wrapper.getBlavatar().setImageResource(R.drawable.app_icon);
wrapper.getBlavatar().setTag(blavatars[position]);
} catch (Throwable t) {
t.printStackTrace();
}
}
return pv;
}
}
class ViewWrapper {
View base;
TextView blogName = null;
TextView blogUsername = null;
ImageView blavatar = null;
ViewWrapper(View base) {
this.base = base;
}
TextView getBlogName() {
if (blogName == null) {
blogName = (TextView) base.findViewById(R.id.blogName);
}
return (blogName);
}
TextView getBlogUsername() {
if (blogUsername == null) {
blogUsername = (TextView) base.findViewById(R.id.blogUser);
}
return (blogUsername);
}
ImageView getBlavatar() {
if (blavatar == null) {
blavatar = (ImageView) base.findViewById(R.id.blavatar);
}
return (blavatar);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// ignore orientation change
super.onConfigurationChanged(newConfig);
}
}