bugfix, code cleanup

This commit is contained in:
NudeDude 2018-08-10 22:48:17 +02:00
parent f43219676e
commit 41b4c34f96
13 changed files with 120 additions and 81 deletions

View File

@ -29,6 +29,7 @@ public class ImagePopup extends AsyncTask<String, Void, Boolean> {
private LayoutInflater inf; private LayoutInflater inf;
private ErrorLog errorLog; private ErrorLog errorLog;
private int position = 0; private int position = 0;
private String errMsg = "E: Image Popup, ";
public ImagePopup(Context context) { public ImagePopup(Context context) {
popup = new Dialog(context); popup = new Dialog(context);
@ -73,7 +74,8 @@ public class ImagePopup extends AsyncTask<String, Void, Boolean> {
} }
return true; return true;
} catch (Exception err) { } catch (Exception err) {
errorLog.add("E: " + err.getMessage()); errMsg += err.getMessage();
errorLog.add(errMsg);
return false; return false;
} }
} }

View File

@ -38,9 +38,9 @@ public class MainPage extends AsyncTask<Integer, Void, Integer> {
private TrendRecycler trendsAdapter; private TrendRecycler trendsAdapter;
private ErrorLog errorLog; private ErrorLog errorLog;
private int woeId; private int woeId;
private String errMsg;
private int highlight, font; private int highlight, font;
private boolean image; private boolean image;
private String errMsg = "E: Main Page, ";
private int retryAfter = 0; private int retryAfter = 0;
/** /**
@ -162,16 +162,13 @@ public class MainPage extends AsyncTask<Integer, Void, Integer> {
if(errCode == 420) { if(errCode == 420) {
retryAfter = e.getRetryAfter(); retryAfter = e.getRetryAfter();
} else { } else {
String errMsg = "E: " + e.getMessage(); errMsg += e.getMessage();
errorLog.add(errMsg);
} }
return FAIL; return FAIL;
} }
catch (Exception e) { catch (Exception e) {
String errMsg = "E: Main Page, " + e.getMessage(); errMsg += e.getMessage();
if(ui.get() != null) { errorLog.add(errMsg);
errorLog.add(errMsg);
}
return FAIL; return FAIL;
} }
return MODE; return MODE;
@ -206,8 +203,11 @@ public class MainPage extends AsyncTask<Integer, Void, Integer> {
break; break;
case FAIL: case FAIL:
if (retryAfter > 0) if (retryAfter > 0) {
Toast.makeText(connect, R.string.rate_limit_exceeded, Toast.LENGTH_LONG).show(); Toast.makeText(connect, R.string.rate_limit_exceeded, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(connect, errMsg, Toast.LENGTH_LONG).show();
}
default: default:
timelineRefresh.setRefreshing(false); timelineRefresh.setRefreshing(false);
trendRefresh.setRefreshing(false); trendRefresh.setRefreshing(false);

View File

@ -55,6 +55,7 @@ public class ProfileLoader extends AsyncTask<Long,Void,Long> {
private boolean isVerified = false; private boolean isVerified = false;
private boolean isLocked = false; private boolean isLocked = false;
private boolean blocked = false; private boolean blocked = false;
private String errMsg = "E: Profile Load, ";
private int retryAfter = 0; private int retryAfter = 0;
/** /**
@ -192,13 +193,13 @@ public class ProfileLoader extends AsyncTask<Long,Void,Long> {
retryAfter = err.getRetryAfter(); retryAfter = err.getRetryAfter();
} }
else if(errCode != 136) { else if(errCode != 136) {
String errMsg = "E: " + err.getMessage(); errMsg += err.getMessage();
errorLog.add(errMsg); errorLog.add(errMsg);
} }
return FAILURE; return FAILURE;
} }
catch(Exception err) { catch(Exception err) {
String errMsg = "E: Profile Load, " + err.getMessage(); errMsg += err.getMessage();
errorLog.add(errMsg); errorLog.add(errMsg);
return FAILURE; return FAILURE;
} }

View File

@ -17,7 +17,8 @@ public class Registration extends AsyncTask<String, Void, Boolean> {
private WeakReference<LoginPage> ui; private WeakReference<LoginPage> ui;
private TwitterEngine mTwitter; private TwitterEngine mTwitter;
private ErrorLog errorLog; private ErrorLog errorLog;
private String errorMessage; private boolean failure = false;
private String errorMessage = "E: Registration, ";
private String redirectionURL = ""; private String redirectionURL = "";
@ -39,12 +40,14 @@ public class Registration extends AsyncTask<String, Void, Boolean> {
return true; return true;
} }
} catch(TwitterException e) { } catch(TwitterException e) {
errorMessage = "E: " + e.getErrorMessage(); errorMessage += e.getErrorMessage();
errorLog.add(errorMessage); errorLog.add(errorMessage);
failure = true;
} }
catch ( Exception e ) { catch ( Exception e ) {
errorMessage = "E: Registration, " + e.getMessage(); errorMessage += e.getMessage();
errorLog.add(errorMessage); errorLog.add(errorMessage);
failure = true;
} }
return false; return false;
} }
@ -58,10 +61,10 @@ public class Registration extends AsyncTask<String, Void, Boolean> {
if(success) { if(success) {
connect.setResult(Activity.RESULT_OK); connect.setResult(Activity.RESULT_OK);
connect.finish(); connect.finish();
} else if (errorMessage != null) { } else if (failure) {
Toast.makeText(connect,errorMessage,Toast.LENGTH_LONG).show(); Toast.makeText(connect,errorMessage,Toast.LENGTH_LONG).show();
} else { } else {
ui.get().connect(redirectionURL); connect.connect(redirectionURL);
} }
} }

View File

@ -54,7 +54,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> {
private String usernameStr, scrNameStr, tweetStr, dateString; private String usernameStr, scrNameStr, tweetStr, dateString;
private String repliedUsername, apiName, profile_pb; private String repliedUsername, apiName, profile_pb;
private String medialinks[]; private String medialinks[];
private String errorMessage = ""; private String errorMessage = "Status load: ";
private boolean retweeted, favorited, toggleImg, verified; private boolean retweeted, favorited, toggleImg, verified;
private long tweetReplyID, replyUserId; private long tweetReplyID, replyUserId;
private int rtCount, favCount; private int rtCount, favCount;
@ -162,6 +162,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> {
answers = mTwitter.getAnswers(scrNameStr, tweetID, tweetID); answers = mTwitter.getAnswers(scrNameStr, tweetID, tweetID);
} }
answerAdapter.setData(answers); answerAdapter.setData(answers);
answerAdapter.toggleImage(toggleImg);
answerAdapter.setColor(highlight, font); answerAdapter.setColor(highlight, font);
if(answers.size() > 0 && database.containStatus(tweetID)) if(answers.size() > 0 && database.containStatus(tweetID))
database.storeReplies(answers); database.storeReplies(answers);
@ -170,18 +171,18 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> {
catch(TwitterException e) { catch(TwitterException e) {
int errCode = e.getErrorCode(); int errCode = e.getErrorCode();
if(errCode == 144) { if(errCode == 144) {
database.removeStatus(tweetID); database.removeStatus(tweetID); //TODO
errorMessage = "Tweet nicht gefunden!\nID:"+tweetID; errorMessage = "Tweet nicht gefunden!\nID:"+tweetID;
} else if(errCode == 420) { } else if(errCode == 420) {
int retry = e.getRetryAfter(); int retry = e.getRetryAfter(); //TODO
errorMessage = "Rate limit erreicht!\n Weiter in "+retry+" Sekunden"; errorMessage = "Rate limit erreicht!\n Weiter in "+retry+" Sekunden";
} else { } else {
errorMessage = "Fehler: "+e.getMessage(); errorMessage += e.getMessage();
} }
return ERROR; return ERROR;
} }
catch(Exception err) { catch(Exception err) {
errorMessage = "Status load: "+err.getMessage(); errorMessage += err.getMessage();
errorLog.add(errorMessage); errorLog.add(errorMessage);
return ERROR; return ERROR;
} }
@ -245,16 +246,16 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> {
} }
if(toggleImg) { if(toggleImg) {
Picasso.with(ui.get()).load(profile_pb).into(profile_img); Picasso.with(ui.get()).load(profile_pb).into(profile_img);
if(medialinks != null && medialinks.length != 0) { }
View mediaButton = connect.findViewById(R.id.image_attach); if (medialinks != null && medialinks.length != 0) {
mediaButton.setVisibility(View.VISIBLE); View mediaButton = connect.findViewById(R.id.image_attach);
mediaButton.setOnClickListener(new View.OnClickListener() { mediaButton.setVisibility(View.VISIBLE);
@Override mediaButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { @Override
connect.onMediaClicked(medialinks); public void onClick(View v) {
} connect.onMediaClicked(medialinks);
}); }
} });
} }
Button retweetButton = connect.findViewById(R.id.rt_button_detail); Button retweetButton = connect.findViewById(R.id.rt_button_detail);
Button favoriteButton = connect.findViewById(R.id.fav_button_detail); Button favoriteButton = connect.findViewById(R.id.fav_button_detail);

View File

@ -20,7 +20,7 @@ import java.util.List;
import twitter4j.TwitterException; import twitter4j.TwitterException;
public class TwitterSearch extends AsyncTask<String, Void, Void> { public class TwitterSearch extends AsyncTask<String, Void, Boolean> {
private TimelineRecycler searchAdapter; private TimelineRecycler searchAdapter;
private UserRecycler userAdapter; private UserRecycler userAdapter;
@ -29,6 +29,7 @@ public class TwitterSearch extends AsyncTask<String, Void, Void> {
private WeakReference<SearchPage> ui; private WeakReference<SearchPage> ui;
private int highlight, font_color; private int highlight, font_color;
private boolean imageLoad; private boolean imageLoad;
private String errorMessage = "E: Twitter search, ";
private int retryAfter = 0; private int retryAfter = 0;
public TwitterSearch(Context context) { public TwitterSearch(Context context) {
@ -58,7 +59,7 @@ public class TwitterSearch extends AsyncTask<String, Void, Void> {
@Override @Override
protected Void doInBackground(String... search) { protected Boolean doInBackground(String... search) {
String strSearch = search[0]; String strSearch = search[0];
long id = 1L; long id = 1L;
try { try {
@ -79,32 +80,35 @@ public class TwitterSearch extends AsyncTask<String, Void, Void> {
searchAdapter.setColor(highlight,font_color); searchAdapter.setColor(highlight,font_color);
searchAdapter.toggleImage(imageLoad); searchAdapter.toggleImage(imageLoad);
userAdapter.toggleImage(imageLoad); userAdapter.toggleImage(imageLoad);
return true;
} catch (TwitterException err) { } catch (TwitterException err) {
int errCode = err.getErrorCode(); int errCode = err.getErrorCode();
if(errCode == 420) { if(errCode == 420) {
retryAfter = err.getRetryAfter(); retryAfter = err.getRetryAfter();
} else { } else {
String errorMessage = "E: " + err.getErrorMessage(); errorMessage += err.getMessage();
errorLog.add(errorMessage); errorLog.add(errorMessage);
} }
} catch(Exception err) { } catch(Exception err) {
String errorMessage = "E: Twitter search, " + err.getMessage(); errorMessage += err.getMessage();
errorLog.add(errorMessage); errorLog.add(errorMessage);
} }
return null; return false;
} }
@Override @Override
protected void onPostExecute(Void v) { protected void onPostExecute(Boolean success) {
SearchPage connect = ui.get(); SearchPage connect = ui.get();
if(connect == null) if(connect == null)
return; return;
if (retryAfter > 0) { if (!success) {
Toast.makeText(connect, R.string.rate_limit_exceeded, Toast.LENGTH_LONG).show(); if (retryAfter > 0)
Toast.makeText(connect, R.string.rate_limit_exceeded, Toast.LENGTH_LONG).show();
else
Toast.makeText(connect, errorMessage, Toast.LENGTH_LONG).show();
} }
SwipeRefreshLayout tweetReload = connect.findViewById(R.id.searchtweets); SwipeRefreshLayout tweetReload = connect.findViewById(R.id.searchtweets);
View circleLoad = connect.findViewById(R.id.search_progress); View circleLoad = connect.findViewById(R.id.search_progress);
circleLoad.setVisibility(View.INVISIBLE); circleLoad.setVisibility(View.INVISIBLE);

View File

@ -29,6 +29,7 @@ public class UserLists extends AsyncTask <Long, Void, Boolean> {
private UserRecycler usrAdp; private UserRecycler usrAdp;
private ErrorLog errorLog; private ErrorLog errorLog;
private boolean imageLoad; private boolean imageLoad;
private String errorMessage = "E: Userlist, ";
private int retryAfter = 0; private int retryAfter = 0;
/** /**
@ -75,12 +76,12 @@ public class UserLists extends AsyncTask <Long, Void, Boolean> {
if(errCode == 420) { if(errCode == 420) {
retryAfter = err.getRetryAfter(); retryAfter = err.getRetryAfter();
} else { } else {
String errorMessage = "E: " + err.getMessage(); errorMessage += err.getMessage();
errorLog.add(errorMessage); errorLog.add(errorMessage);
} }
return false; return false;
} catch(Exception err) { } catch(Exception err) {
String errorMessage = "E: Userlist, " + err.getMessage(); errorMessage += err.getMessage();
errorLog.add(errorMessage); errorLog.add(errorMessage);
return false; return false;
} }
@ -98,7 +99,9 @@ public class UserLists extends AsyncTask <Long, Void, Boolean> {
usrAdp.notifyDataSetChanged(); usrAdp.notifyDataSetChanged();
} else { } else {
if (retryAfter > 0) if (retryAfter > 0)
Toast.makeText(ui.get(), R.string.rate_limit_exceeded, Toast.LENGTH_LONG).show(); Toast.makeText(ui.get(), R.string.rate_limit_exceeded, Toast.LENGTH_SHORT).show();
else
Toast.makeText(ui.get(), errorMessage, Toast.LENGTH_SHORT).show();
} }
} }
} }

View File

@ -13,6 +13,9 @@ import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -43,13 +46,13 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
private ConnectivityManager mConnect; private ConnectivityManager mConnect;
private GlobalSettings settings; private GlobalSettings settings;
private String username = ""; private String username = "";
private boolean isHome;
private long userID = 0; private long userID = 0;
private long tweetID = 0; private long tweetID = 0;
@Override @Override
protected void onCreate(Bundle b) { protected void onCreate(Bundle b) {
super.onCreate(b); super.onCreate(b);
b = getIntent().getExtras(); b = getIntent().getExtras();
if (b != null) { if (b != null) {
tweetID = b.getLong("tweetID"); tweetID = b.getLong("tweetID");
@ -58,13 +61,17 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
} }
setContentView(R.layout.tweetpage); setContentView(R.layout.tweetpage);
Toolbar tool = findViewById(R.id.tweet_toolbar);
setSupportActionBar(tool);
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayShowTitleEnabled(false);
settings = GlobalSettings.getInstance(this); settings = GlobalSettings.getInstance(this);
boolean home = userID == settings.getUserId(); isHome = userID == settings.getUserId();
mConnect = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); mConnect = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
View retweet = findViewById(R.id.rt_button_detail); View retweet = findViewById(R.id.rt_button_detail);
View favorite = findViewById(R.id.fav_button_detail); View favorite = findViewById(R.id.fav_button_detail);
View delete = findViewById(R.id.delete);
View txtRt = findViewById(R.id.no_rt_detail); View txtRt = findViewById(R.id.no_rt_detail);
View txtFav = findViewById(R.id.no_fav_detail); View txtFav = findViewById(R.id.no_fav_detail);
View date = findViewById(R.id.timedetail); View date = findViewById(R.id.timedetail);
@ -73,16 +80,12 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
answerReload = findViewById(R.id.answer_reload); answerReload = findViewById(R.id.answer_reload);
answer_list = findViewById(R.id.answer_list); answer_list = findViewById(R.id.answer_list);
answer_list.setLayoutManager(new LinearLayoutManager(getApplicationContext())); answer_list.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
if(home) {
delete.setVisibility(View.VISIBLE);
}
favorite.setOnClickListener(this); favorite.setOnClickListener(this);
retweet.setOnClickListener(this); retweet.setOnClickListener(this);
answerReload.setOnRefreshListener(this); answerReload.setOnRefreshListener(this);
txtFav.setOnClickListener(this); txtFav.setOnClickListener(this);
txtRt.setOnClickListener(this); txtRt.setOnClickListener(this);
date.setOnClickListener(this); date.setOnClickListener(this);
delete.setOnClickListener(this);
profile_img.setOnClickListener(this); profile_img.setOnClickListener(this);
answer.setOnClickListener(this); answer.setOnClickListener(this);
setContent(); setContent();
@ -103,6 +106,31 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
super.onPause(); super.onPause();
} }
@Override
public boolean onCreateOptionsMenu(Menu m) {
getMenuInflater().inflate(R.menu.tweet, m); //TODO add more
if (isHome) {
m.findItem(R.id.delete_tweet).setVisible(true);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete_tweet:
AlertDialog.Builder alerta = new AlertDialog.Builder(this);
alerta.setMessage(R.string.delete_tweet);
alerta.setPositiveButton(R.string.yes_confirm, this);
alerta.setNegativeButton(R.string.no_confirm, this);
alerta.show();
return true;
default:
return false;
}
}
@Override @Override
public void onClick(View v) { public void onClick(View v) {
Intent intent; Intent intent;
@ -133,18 +161,10 @@ public class TweetDetail extends AppCompatActivity implements OnClickListener,
startActivity(intent); startActivity(intent);
break; break;
case R.id.delete:
AlertDialog.Builder alerta = new AlertDialog.Builder(this);
alerta.setMessage(R.string.delete_tweet);
alerta.setPositiveButton(R.string.yes_confirm, this);
alerta.setNegativeButton(R.string.no_confirm, this);
alerta.show();
break;
case R.id.timedetail: case R.id.timedetail:
if (mConnect.getActiveNetworkInfo() != null && mConnect.getActiveNetworkInfo().isConnected()) { if (mConnect.getActiveNetworkInfo() != null && mConnect.getActiveNetworkInfo().isConnected()) {
intent = new Intent(Intent.ACTION_VIEW); intent = new Intent(Intent.ACTION_VIEW);
String tweetLink = "https://twitter.com/" + username + "/status/" + tweetID; String tweetLink = "https://twitter.com/" + username.substring(1) + "/status/" + tweetID;
intent.setData(Uri.parse(tweetLink)); intent.setData(Uri.parse(tweetLink));
startActivity(intent); startActivity(intent);
} else { } else {

View File

@ -10,10 +10,10 @@
android:background="@android:color/transparent"> android:background="@android:color/transparent">
<android.support.design.widget.CollapsingToolbarLayout <android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed" app:layout_scrollFlags="scroll|exitUntilCollapsed">
app:toolbarId="@+id/tweet_toolbar">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -3,21 +3,18 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@android:color/transparent" android:background="@android:color/transparent">
android:fitsSystemWindows="false">
<android.support.design.widget.CollapsingToolbarLayout <android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/tweet_detail" android:id="@+id/tweet_detail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:layout_scrollFlags="scroll|exitUntilCollapsed" app:layout_scrollFlags="scroll|exitUntilCollapsed">
app:toolbarId="@+id/tweet_toolbar">
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -26,6 +23,11 @@
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:orientation="vertical"> android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/tweet_toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/bar_wide" />
<TextView <TextView
android:id="@+id/answer_reference_detail" android:id="@+id/answer_reference_detail"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -152,8 +154,8 @@
<Button <Button
android:id="@+id/answer_button" android:id="@+id/answer_button"
android:layout_width="16dp" android:layout_width="20dp"
android:layout_height="16dp" android:layout_height="20dp"
android:background="@drawable/chat" /> android:background="@drawable/chat" />
<TextView <TextView
@ -169,8 +171,8 @@
<Button <Button
android:id="@+id/rt_button_detail" android:id="@+id/rt_button_detail"
android:layout_width="16dp" android:layout_width="20dp"
android:layout_height="16dp" android:layout_height="20dp"
android:background="@drawable/retweet" /> android:background="@drawable/retweet" />
<TextView <TextView
@ -186,8 +188,8 @@
<Button <Button
android:id="@+id/fav_button_detail" android:id="@+id/fav_button_detail"
android:layout_width="16dp" android:layout_width="24dp"
android:layout_height="16dp" android:layout_height="20dp"
android:background="@drawable/favorite" /> android:background="@drawable/favorite" />
<TextView <TextView
@ -201,13 +203,6 @@
android:singleLine="true" android:singleLine="true"
android:textSize="12sp" /> android:textSize="12sp" />
<Button
android:id="@+id/delete"
android:layout_width="16dp"
android:layout_height="16dp"
android:background="@drawable/cross"
android:visibility="invisible" />
</LinearLayout> </LinearLayout>
<android.support.v4.widget.SwipeRefreshLayout <android.support.v4.widget.SwipeRefreshLayout

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/delete_tweet"
android:title="@string/tweet_delete"
android:visible="false" />
</menu>

View File

@ -40,4 +40,5 @@
<string name="error_sending_tweet">Fehler beim Senden!</string> <string name="error_sending_tweet">Fehler beim Senden!</string>
<string name="tweet_sent">Tweet gesendet</string> <string name="tweet_sent">Tweet gesendet</string>
<string name="error">Fehler!</string> <string name="error">Fehler!</string>
<string name="tweet_delete">Tweet löschen</string>
</resources> </resources>

View File

@ -48,4 +48,5 @@
<string name="error_sending_tweet">error while sending</string> <string name="error_sending_tweet">error while sending</string>
<string name="tweet_sent">tweet sent</string> <string name="tweet_sent">tweet sent</string>
<string name="error">Error!</string> <string name="error">Error!</string>
<string name="tweet_delete">Delete</string>
</resources> </resources>