Reputation: 77
As mentioned in the title, I want to allow the user that created the room to become an admin of that room, allowing him to update the details of that room or invite other users.I have gone through some database security rules tutorial and I still don't understand how it works. The closest thing i have found is this link:
Defining the User roles in Firebase
I tried and it still couldn't work, do i need so make a new table or something? Can someone explain to me how it works or how do I achieve it?My database
EDITED 1: Added Main and Add activity
EDITED 2: Added Team and TeamList class
AddActivity
public class AddActivity extends AppCompatActivity {
private FirebaseAuth firebaseAuth;
EditText editTextName;
Spinner spinnerSport;
Button buttonAddTeam;
List<Team> teams;
DatabaseReference databaseTeams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
firebaseAuth = FirebaseAuth.getInstance();
if(firebaseAuth.getCurrentUser() == null){
finish();
startActivity(new Intent(this, SignInActivity.class));
}
databaseTeams = FirebaseDatabase.getInstance().getReference("teams");
editTextName = (EditText) findViewById(R.id.editTextName);
spinnerSport = (Spinner) findViewById(R.id.spinnerSports);
buttonAddTeam = (Button) findViewById(R.id.buttonAddTeam);
teams = new ArrayList<>();
buttonAddTeam.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addTeam();
Intent myIntent = new Intent(AddActivity.this,
MainActivity.class);
startActivity(myIntent);
}
});
}
private void addTeam() {
String name = editTextName.getText().toString().trim();
String sport = spinnerSport.getSelectedItem().toString();
FirebaseUser user = firebaseAuth.getCurrentUser();
user.getUid();
if (!TextUtils.isEmpty(name)) {
String id = databaseTeams.push().getKey();
String owner = user.getUid();
Team team = new Team(id, name, sport, owner);
databaseTeams.child(id).setValue(team);
editTextName.setText("");
Toast.makeText(this, "Team added", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Please enter a name", Toast.LENGTH_LONG).show();
}
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
public static final String TEAM_NAME = "com.example.user.stfv2.teamname";
public static final String TEAM_ID = "com.example.user.stfv2.teamid";
private FirebaseAuth firebaseAuth;
EditText editTextName;
Spinner spinnerSport;
Button buttonAddTeam;
ListView listViewTeams;
List<Team> teams;
DatabaseReference databaseTeams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firebaseAuth = FirebaseAuth.getInstance();
if(firebaseAuth.getCurrentUser() == null){
finish();
startActivity(new Intent(this, SignInActivity.class));
}
FirebaseUser user = firebaseAuth.getCurrentUser();
databaseTeams = FirebaseDatabase.getInstance().getReference("teams");
editTextName = (EditText) findViewById(R.id.editTextName);
spinnerSport = (Spinner) findViewById(R.id.spinnerSports);
listViewTeams = (ListView) findViewById(R.id.listViewTeams);
buttonAddTeam = (Button) findViewById(R.id.buttonAddTeam);
teams = new ArrayList<>();
buttonAddTeam.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent myIntent = new Intent(MainActivity.this,
AddActivity.class);
startActivity(myIntent);
}
});
listViewTeams.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Team team = teams.get(i);
Intent intent = new Intent(getApplicationContext(), TeamActivity.class);
intent.putExtra(TEAM_ID, team.getTeamId());
intent.putExtra(TEAM_NAME, team.getTeamName());
startActivity(intent);
}
});
listViewTeams.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
Team team = teams.get(i);
showUpdateDeleteDialog(team.getTeamId(), team.getTeamName());
return true;
}
});
}
private void showUpdateDeleteDialog(final String teamId, String teamName) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
LayoutInflater inflater = getLayoutInflater();
final View dialogView = inflater.inflate(R.layout.update_dialog, null);
dialogBuilder.setView(dialogView);
final EditText editTextName = (EditText) dialogView.findViewById(R.id.editTextName);
final Spinner spinnerSport = (Spinner) dialogView.findViewById(R.id.spinnerSports);
final Button buttonUpdate = (Button) dialogView.findViewById(R.id.buttonUpdateTeam);
final Button buttonDelete = (Button) dialogView.findViewById(R.id.buttonDeleteTeam);
dialogBuilder.setTitle(teamName);
final AlertDialog b = dialogBuilder.create();
b.show();
buttonUpdate.setOnClickListener(new View.OnClickListener() {
FirebaseUser user = firebaseAuth.getCurrentUser();
@Override
public void onClick(View view) {
String name = editTextName.getText().toString().trim();
String sport = spinnerSport.getSelectedItem().toString();
String owner = user.getUid();
if (!TextUtils.isEmpty(name)) {
updateTeam(teamId, name, sport, owner);
b.dismiss();
}
}
});
buttonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
deleteTeam(teamId);
b.dismiss();
}
});
}
private boolean updateTeam(String id, String name, String sport, String owner) {
DatabaseReference dR = FirebaseDatabase.getInstance().getReference("teams").child(id);
Team team = new Team(id, name, sport, owner);
dR.setValue(team);
Toast.makeText(getApplicationContext(), "Team Updated", Toast.LENGTH_LONG).show();
return true;
}
private boolean deleteTeam(String id) {
DatabaseReference dR = FirebaseDatabase.getInstance().getReference("teams").child(id);
dR.removeValue();
DatabaseReference drTracks = FirebaseDatabase.getInstance().getReference("tracks").child(id);
drTracks.removeValue();
Toast.makeText(getApplicationContext(), "Team Deleted", Toast.LENGTH_LONG).show();
return true;
}
@Override
protected void onStart() {
super.onStart();
databaseTeams.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
teams.clear();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
Team team = postSnapshot.getValue(Team.class);
teams.add(team);
}
TeamList teamAdapter = new TeamList(MainActivity.this, teams);
listViewTeams.setAdapter(teamAdapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_logout:
firebaseAuth.signOut();
finish();
startActivity(new Intent(this, SignInActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Team.java:
package com.example.user.stfv2;
import com.google.firebase.database.IgnoreExtraProperties;
@IgnoreExtraProperties
public class Team {
private String teamId;
private String teamName;
private String teamSport;
private String teamOwner;
public Team(String teamId, String teamName, String teamSport, String teamOwner) {
this.teamId = teamId;
this.teamName = teamName;
this.teamSport = teamSport;
this.teamOwner = teamOwner;
}
public String getTeamId() {return teamId;}
public String getTeamName() {
return teamName;
}
public String getTeamSport() {
return teamSport;
}
//this method is never used, i don't know where to use it
public String getTeamOwner() { return teamOwner; }
}
TeamList.java
public class TeamList extends ArrayAdapter<Team> {
private Activity context;
List<Team> teams;
public TeamList(Activity context, List<Team> teams) {
super(context, R.layout.layout_team_list, teams);
this.context = context;
this.teams = teams;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View listViewItem = inflater.inflate(R.layout.layout_team_list, null, true);
TextView textViewName = (TextView) listViewItem.findViewById(R.id.textViewName);
TextView textViewSport = (TextView) listViewItem.findViewById(R.id.textViewSport);
Team team = teams.get(position);
textViewName.setText(team.getTeamName());
textViewSport.setText(team.getTeamSport());
return listViewItem;
}
}
Upvotes: 0
Views: 100
Reputation:
If your room only has one admin you can use this. With $uid
being the uid of the user that created the room.
db structure:
root: {
sportsteamfinder: {
teams: {
$team: {
teamId: $team,
teamOwner: $uid,
teamName: henq,
teamSport: Football
}
}
}
}
With the following rules:
{
"rules": {
"sportsteamfinder": {
"teams": {
"$team": {
".write": "data.child('teamOwner').val() === auth.uid || !data.exists()"
}
}
}
}
}
Or, if you want multiple admins per room. Again with $uid and $uid2 being the ID's of the admins.
db structure:
root: {
sportsteamfinder: {
teams: {
$team: {
teamId: $team,
teamAdmins: {
$uid: true,
$uid2: true
},
teamName: henq,
teamSport: Football
}
}
}
}
With the following rules:
{
"rules": {
"sportsteamfinder": {
"teams": {
"$team": {
".write": "data.child('teamAdmins/'+auth.uid).exists() || !data.exists()"
}
}
}
}
}
Upvotes: 1