Code Cleanup
This commit is contained in:
NudeDude 2018-03-03 14:58:10 +01:00
parent 5e6c724dd8
commit 4bd98e4fa4
14 changed files with 149 additions and 97 deletions

View File

@ -7,6 +7,7 @@ import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter; import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
import org.nuclearfog.twidda.viewadapter.TrendAdapter; import org.nuclearfog.twidda.viewadapter.TrendAdapter;
import android.content.SharedPreferences;
import android.support.v4.widget.SwipeRefreshLayout; import android.support.v4.widget.SwipeRefreshLayout;
import android.widget.ListView; import android.widget.ListView;
import android.widget.Toast; import android.widget.Toast;
@ -27,6 +28,7 @@ public class MainPage extends AsyncTask<Integer, Void, Integer> {
private ListView timelineList, trendList, mentionList; private ListView timelineList, trendList, mentionList;
private TimelineAdapter timelineAdapter, mentionAdapter; private TimelineAdapter timelineAdapter, mentionAdapter;
private TrendAdapter trendsAdapter; private TrendAdapter trendsAdapter;
private int woeid;
/** /**
* Main View * Main View
@ -35,6 +37,8 @@ public class MainPage extends AsyncTask<Integer, Void, Integer> {
public MainPage(Context context) { public MainPage(Context context) {
this.context = context; this.context = context;
mTwitter = TwitterEngine.getInstance(context); mTwitter = TwitterEngine.getInstance(context);
SharedPreferences settings = context.getSharedPreferences("settings", 0);
woeid = settings.getInt("woeid",23424829); // Germany WOEID
} }
@Override @Override
@ -73,7 +77,7 @@ public class MainPage extends AsyncTask<Integer, Void, Integer> {
break; break;
case TRND: case TRND:
trendsAdapter = new TrendAdapter(context, new TrendDatabase(mTwitter.getTrends(),context)); trendsAdapter = new TrendAdapter(context, new TrendDatabase(mTwitter.getTrends(woeid),context));
break; break;
case MENT: case MENT:

View File

@ -22,8 +22,8 @@ import twitter4j.User;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
public class ProfileLoader extends AsyncTask<Long,Void,Long> public class ProfileLoader extends AsyncTask<Long,Void,Long> {
{
public static final long GET_INFORMATION = 0x0; public static final long GET_INFORMATION = 0x0;
public static final long ACTION_FOLLOW = 0x1; public static final long ACTION_FOLLOW = 0x1;
public static final long GET_TWEETS = 0x2; public static final long GET_TWEETS = 0x2;
@ -33,7 +33,7 @@ public class ProfileLoader extends AsyncTask<Long,Void,Long>
private String screenName, username, description, location, follower, following; private String screenName, username, description, location, follower, following;
private TextView txtUser,txtScrName,txtBio,txtLocation,txtLink,txtFollowing,txtFollower,txtCreated; private TextView txtUser,txtScrName,txtBio,txtLocation,txtLink,txtFollowing,txtFollower,txtCreated;
private ImageView profile, banner, linkIcon, locationIcon, verifier, locked; private ImageView profile, banner, linkIcon, locationIcon, verifier, locked, followback;
private SwipeRefreshLayout tweetsReload, favoritsReload; private SwipeRefreshLayout tweetsReload, favoritsReload;
private ListView profileTweets, profileFavorits; private ListView profileTweets, profileFavorits;
private String imageLink, bannerLink, fullPbLink, link, dateString; private String imageLink, bannerLink, fullPbLink, link, dateString;
@ -72,6 +72,7 @@ public class ProfileLoader extends AsyncTask<Long,Void,Long>
banner = (ImageView)((UserProfile)context).findViewById(R.id.banner); banner = (ImageView)((UserProfile)context).findViewById(R.id.banner);
linkIcon = (ImageView)((UserProfile)context).findViewById(R.id.link_img); linkIcon = (ImageView)((UserProfile)context).findViewById(R.id.link_img);
verifier = (ImageView)((UserProfile)context).findViewById(R.id.profile_verify); verifier = (ImageView)((UserProfile)context).findViewById(R.id.profile_verify);
followback = (ImageView)((UserProfile)context).findViewById(R.id.followback);
locked = (ImageView)((UserProfile)context).findViewById(R.id.profile_locked); locked = (ImageView)((UserProfile)context).findViewById(R.id.profile_locked);
locationIcon = (ImageView)((UserProfile)context).findViewById(R.id.location_img); locationIcon = (ImageView)((UserProfile)context).findViewById(R.id.location_img);
tweetsReload = (SwipeRefreshLayout)((UserProfile)context).findViewById(R.id.hometweets); tweetsReload = (SwipeRefreshLayout)((UserProfile)context).findViewById(R.id.hometweets);
@ -88,7 +89,7 @@ public class ProfileLoader extends AsyncTask<Long,Void,Long>
long id = 1L; long id = 1L;
TwitterEngine mTwitter = TwitterEngine.getInstance(context); TwitterEngine mTwitter = TwitterEngine.getInstance(context);
try { try {
isHome = mTwitter.isHome(userId); isHome = TwitterEngine.getHomeId() == userId;
if(!isHome) if(!isHome)
{ {
isFollowing = mTwitter.getConnection(userId, true); isFollowing = mTwitter.getConnection(userId, true);
@ -179,6 +180,9 @@ public class ProfileLoader extends AsyncTask<Long,Void,Long>
if(isLocked) { if(isLocked) {
locked.setVisibility(View.VISIBLE); locked.setVisibility(View.VISIBLE);
} }
if(isFollowed) {
followback.setVisibility(View.VISIBLE);
}
if(imgEnabled) { if(imgEnabled) {
Picasso.with(context).load(imageLink).into(profile); Picasso.with(context).load(imageLink).into(profile);
// Picasso.with(context).load(bannerLink).into(banner); // TODO // Picasso.with(context).load(bannerLink).into(banner); // TODO

View File

@ -36,7 +36,7 @@ import org.nuclearfog.twidda.window.ColorPreferences;
import org.nuclearfog.twidda.window.TweetDetail; import org.nuclearfog.twidda.window.TweetDetail;
import org.nuclearfog.twidda.window.UserProfile; import org.nuclearfog.twidda.window.UserProfile;
public class StatusLoader extends AsyncTask<Long, Void, Long> implements View.OnClickListener { public class StatusLoader extends AsyncTask<Long, Void, Long> {
private static final long ERROR = -1; private static final long ERROR = -1;
public static final long RETWEET = 0; public static final long RETWEET = 0;
@ -63,7 +63,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> implements View.On
private boolean retweeted, favorited, toggleImg, verified; private boolean retweeted, favorited, toggleImg, verified;
private boolean rtFlag = false; private boolean rtFlag = false;
private long userReply, tweetReplyID; private long userReply, tweetReplyID;
private int rt, fav, ansNo = 0; private int rt, fav;
private int highlight; private int highlight;
@ -177,7 +177,6 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> implements View.On
if(tlAdp != null) if(tlAdp != null)
tweetID = tlAdp.getItemId(0); tweetID = tlAdp.getItemId(0);
answers = mTwitter.getAnswers(replyname, tweetID); answers = mTwitter.getAnswers(replyname, tweetID);
ansNo = answers.size();
} }
else if(mode == DELETE) { else if(mode == DELETE) {
mTwitter.deleteTweet(tweetID); mTwitter.deleteTweet(tweetID);
@ -226,11 +225,25 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> implements View.On
profile_img.setImageBitmap(profile_btm); profile_img.setImageBitmap(profile_btm);
if(medialinks.length != 0) { if(medialinks.length != 0) {
mediabutton.setVisibility(View.VISIBLE); mediabutton.setVisibility(View.VISIBLE);
mediabutton.setOnClickListener(this); mediabutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new ImagePopup(c).execute(medialinks);
}
});
} }
} }
setIcons(); setIcons();
replyName.setOnClickListener(this); replyName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(c, TweetDetail.class);
intent.putExtra("tweetID",tweetReplyID);
intent.putExtra("userID",userReply);
intent.putExtra("username", repliedUsername);
c.startActivity(intent);
}
});
} }
else if(mode == RETWEET) { else if(mode == RETWEET) {
String rtStr = Integer.toString(rt); String rtStr = Integer.toString(rt);
@ -253,7 +266,7 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> implements View.On
tlAdp.notifyDataSetChanged(); tlAdp.notifyDataSetChanged();
ansReload.setRefreshing(false); ansReload.setRefreshing(false);
} }
String ansStr = Integer.toString(ansNo); String ansStr = Integer.toString(tlAdp.getCount());
txtAns.setText(ansStr); txtAns.setText(ansStr);
} }
else if(mode == DELETE) { else if(mode == DELETE) {
@ -268,26 +281,6 @@ public class StatusLoader extends AsyncTask<Long, Void, Long> implements View.On
} }
} }
@Override
public void onClick(View v) {
Intent intent;
switch(v.getId()) {
case R.id.image_attach:
new ImagePopup(c).execute(medialinks);
break;
case R.id.answer_reference_detail:
intent = new Intent(c, TweetDetail.class);
Bundle bundle = new Bundle();
bundle.putLong("tweetID",tweetReplyID);
bundle.putLong("userID",userReply);
bundle.putString("username", repliedUsername);
intent.putExtras(bundle);
c.startActivity(intent);
break;
}
}
private String formatString(String input) { private String formatString(String input) {
String output = "gesendet von: "; String output = "gesendet von: ";
boolean openTag = false; boolean openTag = false;

View File

@ -37,12 +37,12 @@ public class TwitterEngine {
private final String TWITTER_CONSUMER_SECRET = "pgaWUlDVS5b7Q6VJQDgBzHKw0mIxJIX0UQBcT1oFJEivsCl5OV"; private final String TWITTER_CONSUMER_SECRET = "pgaWUlDVS5b7Q6VJQDgBzHKw0mIxJIX0UQBcT1oFJEivsCl5OV";
private static TwitterEngine mTwitter; private static TwitterEngine mTwitter;
private static long twitterID;
private Twitter twitter; private Twitter twitter;
private Context context; private Context context;
private SharedPreferences settings; private SharedPreferences settings;
private RequestToken reqToken; private RequestToken reqToken;
private int load; private int load;
private int location;
/** /**
@ -52,7 +52,6 @@ public class TwitterEngine {
*/ */
private TwitterEngine(Context context) { private TwitterEngine(Context context) {
settings = context.getSharedPreferences("settings", 0); settings = context.getSharedPreferences("settings", 0);
location = settings.getInt("woeid",23424829); // Germany WOEID
ConfigurationBuilder builder = new ConfigurationBuilder(); ConfigurationBuilder builder = new ConfigurationBuilder();
builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
@ -134,6 +133,7 @@ public class TwitterEngine {
if( settings.getBoolean("login", false) ) { if( settings.getBoolean("login", false) ) {
key1 = settings.getString("key1", " "); key1 = settings.getString("key1", " ");
key2 = settings.getString("key2", " "); key2 = settings.getString("key2", " ");
twitterID = settings.getLong("userID", -1L);
initKeys(key1,key2); initKeys(key1,key2);
} }
} }
@ -180,11 +180,12 @@ public class TwitterEngine {
/** /**
* Get Trending Hashtags * Get Trending Hashtags
* @param woeid Yahoo World ID
* @return Trend Resource * @return Trend Resource
* @throws TwitterException if access is unavailable * @throws TwitterException if access is unavailable
*/ */
public Trends getTrends() throws TwitterException { public Trends getTrends(int woeid) throws TwitterException {
return twitter.getPlaceTrends(location); return twitter.getPlaceTrends(woeid);
} }
@ -239,9 +240,9 @@ public class TwitterEngine {
*/ */
public boolean getConnection(long id,boolean following) throws TwitterException { public boolean getConnection(long id,boolean following) throws TwitterException {
if(following) if(following)
return twitter.showFriendship(twitter.getId(),id).isSourceFollowingTarget(); return twitter.showFriendship(twitterID,id).isSourceFollowingTarget();
else else
return twitter.showFriendship(twitter.getId(),id).isTargetFollowingSource(); return twitter.showFriendship(twitterID,id).isTargetFollowingSource();
} }
/** /**
@ -429,13 +430,11 @@ public class TwitterEngine {
} }
/** /**
* check if User ID is home ID * Return User ID
* @param id User ID
* @return result * @return result
* @throws TwitterException if Access is unavailable
*/ */
public boolean isHome(long id) throws TwitterException { public static long getHomeId() {
return twitter.getId() == id; return twitterID;
} }
/** /**

View File

@ -10,7 +10,7 @@ import twitter4j.User;
public class UserDatabase { public class UserDatabase {
private List<String> uName, scrName, imgUrl; private List<String> uName, scrName, imgUrl;
private List<Boolean> verified; private List<Boolean> verified, locked;
private List<Long> uID; private List<Long> uID;
private boolean toggleImg; private boolean toggleImg;
private long cursor = -1L; private long cursor = -1L;
@ -32,6 +32,7 @@ public class UserDatabase {
public String getScreenname(int pos){ return scrName.get(pos);} public String getScreenname(int pos){ return scrName.get(pos);}
public String getImageUrl(int pos){ return imgUrl.get(pos);} public String getImageUrl(int pos){ return imgUrl.get(pos);}
public boolean isVerified(int pos){ return verified.get(pos);} public boolean isVerified(int pos){ return verified.get(pos);}
public boolean isLocked(int pos){ return locked.get(pos);}
public int getSize(){ return size; } public int getSize(){ return size; }
public boolean loadImages(){ return toggleImg; } public boolean loadImages(){ return toggleImg; }
public long getCursor(){return cursor;} public long getCursor(){return cursor;}
@ -48,6 +49,7 @@ public class UserDatabase {
scrName.add('@'+usr.getScreenName()); scrName.add('@'+usr.getScreenName());
imgUrl.add(usr.getMiniProfileImageURLHttps()); imgUrl.add(usr.getMiniProfileImageURLHttps());
verified.add(usr.isVerified()); verified.add(usr.isVerified());
locked.add(usr.isProtected());
size++; size++;
} }
} }
@ -58,6 +60,7 @@ public class UserDatabase {
scrName = new ArrayList<>(); scrName = new ArrayList<>();
imgUrl = new ArrayList<>(); imgUrl = new ArrayList<>();
verified = new ArrayList<>(); verified = new ArrayList<>();
locked = new ArrayList<>();
SharedPreferences s = c.getSharedPreferences("settings", 0); SharedPreferences s = c.getSharedPreferences("settings", 0);
toggleImg = s.getBoolean("image_load", true); toggleImg = s.getBoolean("image_load", true);
} }

View File

@ -67,6 +67,11 @@ public class UserAdapter extends ArrayAdapter implements View.OnClickListener {
} else { } else {
v.findViewById(R.id.verified).setVisibility(View.INVISIBLE); v.findViewById(R.id.verified).setVisibility(View.INVISIBLE);
} }
if(userDatabase.isLocked(position)) {
v.findViewById(R.id.locked_profile).setVisibility(View.VISIBLE);
} else {
v.findViewById(R.id.locked_profile).setVisibility(View.INVISIBLE);
}
return v; return v;
} }

View File

@ -31,7 +31,7 @@ public class ColorPreferences implements OnColorChangedListener, DialogInterface
private ColorPreferences(Context context) { private ColorPreferences(Context context) {
settings = context.getSharedPreferences("settings", 0); settings = context.getSharedPreferences("settings", 0);
background = settings.getInt("background_color", 0xff071222); background = settings.getInt("background_color", 0xff0f114a);
font = settings.getInt("font_color", 0xffffffff); font = settings.getInt("font_color", 0xffffffff);
tweet = settings.getInt("tweet_color", 0xff19aae8); tweet = settings.getInt("tweet_color", 0xff19aae8);
highlight = settings.getInt("highlight_color", 0xffff00ff); highlight = settings.getInt("highlight_color", 0xffff00ff);

View File

@ -18,7 +18,9 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import static android.content.DialogInterface.*; import static android.content.DialogInterface.*;
import org.nuclearfog.twidda.backend.ImagePopup;
import org.nuclearfog.twidda.backend.StatusLoader; import org.nuclearfog.twidda.backend.StatusLoader;
import org.nuclearfog.twidda.backend.TwitterEngine;
import org.nuclearfog.twidda.database.TweetDatabase; import org.nuclearfog.twidda.database.TweetDatabase;
import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.R;
import org.nuclearfog.twidda.viewadapter.TimelineAdapter; import org.nuclearfog.twidda.viewadapter.TimelineAdapter;
@ -42,8 +44,7 @@ public class TweetDetail extends AppCompatActivity implements View.OnClickListen
setContentView(R.layout.tweet_detail); setContentView(R.layout.tweet_detail);
getExtras(getIntent().getExtras()); getExtras(getIntent().getExtras());
SharedPreferences settings = getSharedPreferences("settings", 0); boolean home = userID == TwitterEngine.getHomeId();
boolean home = userID == settings.getLong("userID", -1);
answer_list = (ListView) findViewById(R.id.answer_list); answer_list = (ListView) findViewById(R.id.answer_list);
Button answer = (Button) findViewById(R.id.answer_button); Button answer = (Button) findViewById(R.id.answer_button);

View File

@ -2,7 +2,6 @@ package org.nuclearfog.twidda.window;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.CallSuper;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.Menu; import android.view.Menu;

View File

@ -0,0 +1,4 @@
<vector android:height="24dp" android:viewportHeight="20.0"
android:viewportWidth="20.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FFFFFF" android:pathData="M19,16.685c0,0 -2.225,-9.732 -11,-9.732V2.969L1,9.542l7,6.69v-4.357C12.763,11.874 16.516,12.296 19,16.685z"/>
</vector>

View File

@ -51,45 +51,53 @@
android:contentDescription="@string/profile_image" /> android:contentDescription="@string/profile_image" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/profile_verify" android:id="@+id/profile_verify"
android:layout_width="16dp" android:layout_width="16dp"
android:layout_height="16dp" android:layout_height="16dp"
android:layout_marginBottom="5dp" android:layout_gravity="center_vertical"
android:layout_marginEnd="2dp"
android:contentDescription="@string/verify" android:contentDescription="@string/verify"
android:visibility="invisible" android:visibility="invisible"
app:srcCompat="@drawable/verify" /> app:srcCompat="@drawable/verify" />
<TextView
android:id="@+id/profile_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/profile_locked" android:id="@+id/profile_locked"
android:layout_width="16dp" android:layout_width="16dp"
android:layout_height="16dp" android:layout_height="16dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="2dp"
android:contentDescription="@string/profile_locked" android:contentDescription="@string/profile_locked"
android:visibility="invisible" android:visibility="invisible"
app:srcCompat="@drawable/lock" /> app:srcCompat="@drawable/lock" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="5dp"
android:orientation="vertical">
<TextView
android:id="@+id/profile_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp" />
<TextView <TextView
android:id="@+id/profile_screenname" android:id="@+id/profile_screenname"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="2dp" /> android:layout_marginBottom="2dp" />
</LinearLayout>
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
@ -97,6 +105,16 @@
android:layout_marginTop="2dp" android:layout_marginTop="2dp"
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView
android:id="@+id/followback"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center_vertical"
android:layout_marginEnd="2dp"
android:contentDescription="@string/followback"
android:visibility="invisible"
app:srcCompat="@drawable/followback" />
<TextView <TextView
android:id="@+id/following" android:id="@+id/following"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -41,7 +41,7 @@
android:layout_marginEnd="5dp" android:layout_marginEnd="5dp"
android:layout_weight="1" android:layout_weight="1"
android:textColor="@android:color/holo_red_dark" android:textColor="@android:color/holo_red_dark"
android:textSize="24sp" /> android:textSize="14sp" />
<Button <Button
android:id="@+id/img_preview" android:id="@+id/img_preview"

View File

@ -14,6 +14,16 @@
android:contentDescription="@string/profile_image" android:contentDescription="@string/profile_image"
android:padding="5dp" /> android:padding="5dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView <ImageView
android:id="@+id/verified" android:id="@+id/verified"
android:layout_width="16dp" android:layout_width="16dp"
@ -23,22 +33,33 @@
android:visibility="invisible" android:visibility="invisible"
app:srcCompat="@drawable/verify" /> app:srcCompat="@drawable/verify" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:orientation="vertical">
<TextView <TextView
android:id="@+id/username_detail" android:id="@+id/username_detail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="match_parent" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/locked_profile"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_margin="2dp"
android:contentDescription="@string/profile_locked"
android:visibility="invisible"
app:srcCompat="@drawable/lock" />
<TextView <TextView
android:id="@+id/screenname_detail" android:id="@+id/screenname_detail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent" />
android:layout_marginBottom="5dp" /> </LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@ -43,4 +43,5 @@
<string name="fullimg">Vollbild</string> <string name="fullimg">Vollbild</string>
<string name="profile_locked">Privates Profil</string> <string name="profile_locked">Privates Profil</string>
<string name="load_factor">Ladefaktor</string> <string name="load_factor">Ladefaktor</string>
<string name="followback">Folgt dir</string>
</resources> </resources>