Skip to content

Commit

Permalink
Add database selection
Browse files Browse the repository at this point in the history
  • Loading branch information
teccheck committed Apr 29, 2021
1 parent 2ae1876 commit f374b70
Show file tree
Hide file tree
Showing 7 changed files with 164 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import java.util.List;

import io.github.storagereloaded.android.db.AppDatabase;
import io.github.storagereloaded.android.db.entity.DatabaseEntity;
import io.github.storagereloaded.api.Database;
import io.github.storagereloaded.api.Item;
import io.github.storagereloaded.api.Location;
Expand All @@ -12,25 +14,27 @@

public class DataRepository {

private static DataRepository sInstance;
private static DataRepository instance;

private DataRepository() {
private AppDatabase appDatabase;

private DataRepository(AppDatabase appDatabase) {
this.appDatabase = appDatabase;
}

public static DataRepository getInstance() {
if (sInstance == null) {
public static DataRepository getInstance(AppDatabase appDatabase) {
if (instance == null) {
synchronized (DataRepository.class) {
if (sInstance == null) {
sInstance = new DataRepository();
if (instance == null) {
instance = new DataRepository(appDatabase);
}
}
}
return sInstance;
return instance;
}

public LiveData<List<Database>> getDatabases() {
return null; // TODO
public LiveData<List<DatabaseEntity>> getDatabases() {
return appDatabase.databaseDao().getDatabases();
}

public LiveData<List<Item>> getItems() {
Expand All @@ -57,8 +61,8 @@ public LiveData<List<Property>> getPropertiesInItem(int itemId) {
return null; // TODO
}

public LiveData<Database> getDatabase(int databaseId) {
return null; // TODO
public LiveData<DatabaseEntity> getDatabase(int databaseId) {
return appDatabase.databaseDao().getDatabase(databaseId);
}

public LiveData<Item> getItem(int itemId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ public void onCreate() {
}

public DataRepository getRepository() {
return DataRepository.getInstance();
return DataRepository.getInstance(getAppDatabase());
}

public AppDatabase getDatabase() {
public AppDatabase getAppDatabase() {
return AppDatabase.getInstance(this, appExecutors);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ public interface DatabaseDao {
@Query("SELECT * FROM databases")
LiveData<List<DatabaseEntity>> getDatabases();

@Query("SELECT * FROM databases WHERE id=:databaseId")
LiveData<DatabaseEntity> getDatabase(int databaseId);

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(List<DatabaseEntity> database);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
Expand All @@ -15,7 +18,11 @@

import com.google.android.material.appbar.MaterialToolbar;

import java.util.List;

import io.github.storagereloaded.android.R;
import io.github.storagereloaded.android.db.entity.DatabaseEntity;
import io.github.storagereloaded.android.viewmodel.DatabaseListViewModel;

public class DatabaseListActivity extends AppCompatActivity {

Expand All @@ -31,40 +38,80 @@ protected void onCreate(Bundle savedInstanceState) {
toolbar.setNavigationOnClickListener(v -> finish());

RecyclerView recyclerView = findViewById(R.id.database_list);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new RecyclerTestAdapter(new OnItemClickListener() {
RecyclerDatabaseListAdapter adapter = new RecyclerDatabaseListAdapter(new OnItemClickListener() {
@Override
public void onItemClick(int index, Object item) {
public void onItemClick(int index, int databaseId) {
Intent intent = new Intent();
intent.putExtra(EXTRA_DATABASE_ID, 1);
intent.putExtra(EXTRA_DATABASE_ID, databaseId);
setResult(RESULT_OK, intent);
finish();
}

@Override
public void onItemSettingsClick(int index, Object item) {
public void onItemSettingsClick(int index, int databaseId) {
startActivity(new Intent(getApplicationContext(), DatabaseSettingsActivity.class));
}
}));
});

recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);

setResult(RESULT_CANCELED);

DatabaseListViewModel model = new ViewModelProvider(this).get(DatabaseListViewModel.class);
model.getDatabases().observe(this, adapter::setDatabases);
}

private interface OnItemClickListener {
void onItemClick(int index, Object item);
void onItemClick(int index, int databaseId);

void onItemSettingsClick(int index, Object item);
void onItemSettingsClick(int index, int databaseId);
}

private static class RecyclerTestAdapter extends RecyclerView.Adapter<RecyclerTestAdapter.ViewHolder> {
private static class RecyclerDatabaseListAdapter extends RecyclerView.Adapter<RecyclerDatabaseListAdapter.ViewHolder> {

String[] testItems = {"Test123", "My super cool Database", "Don't ever look into this"};
List<DatabaseEntity> databases;
OnItemClickListener listener;

public RecyclerTestAdapter(OnItemClickListener listener) {
public RecyclerDatabaseListAdapter(OnItemClickListener listener) {
this.listener = listener;
}

public void setDatabases(List<DatabaseEntity> databases) {
if (this.databases == null) {
this.databases = databases;
notifyItemRangeInserted(0, databases.size());
return;
}

DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
@Override
public int getOldListSize() {
return RecyclerDatabaseListAdapter.this.databases.size();
}

@Override
public int getNewListSize() {
return databases.size();
}

@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return RecyclerDatabaseListAdapter.this.databases.get(oldItemPosition).getId() == databases.get(newItemPosition).getId();
}

@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
DatabaseEntity newDatabase = databases.get(newItemPosition);
DatabaseEntity oldDatabase = RecyclerDatabaseListAdapter.this.databases.get(oldItemPosition);

return newDatabase.getId() == oldDatabase.getId() && TextUtils.equals(newDatabase.getName(), oldDatabase.getName());
}
});
this.databases = databases;
result.dispatchUpdatesTo(this);
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Expand All @@ -75,18 +122,20 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
View root = holder.itemView;
root.setOnClickListener(v -> listener.onItemClick(position, testItems[position]));
DatabaseEntity database = databases.get(position);

root.setOnClickListener(v -> listener.onItemClick(position, database.getId()));

ImageButton button = root.findViewById(R.id.settings_button);
button.setOnClickListener(v -> listener.onItemSettingsClick(position, testItems[position]));
button.setOnClickListener(v -> listener.onItemSettingsClick(position, database.getId()));

TextView name = root.findViewById(R.id.name);
name.setText(testItems[position]);
name.setText(database.getName());
}

@Override
public int getItemCount() {
return testItems.length;
return databases == null ? 0 : databases.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
Expand All @@ -21,18 +22,21 @@
import androidx.recyclerview.widget.RecyclerView;

import io.github.storagereloaded.android.R;
import io.github.storagereloaded.android.viewmodel.DatabaseListViewModel;
import io.github.storagereloaded.android.viewmodel.DatabaseViewModel;

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

Toolbar toolbar;
DrawerLayout drawer;
int databaseId = -1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Toolbar toolbar = findViewById(R.id.toolbar);
toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

drawer = findViewById(R.id.drawer_layout);
Expand All @@ -47,9 +51,50 @@ protected void onCreate(Bundle savedInstanceState) {

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
toggle.syncState();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(resultCode == RESULT_OK && requestCode == DatabaseListActivity.REQUEST_CODE) {
databaseId = data.getIntExtra(DatabaseListActivity.EXTRA_DATABASE_ID, -1);
}
}

@Override
protected void onResume() {
super.onResume();

DatabaseViewModel model = new ViewModelProvider(this).get(DatabaseViewModel.class);
model.setDatabaseId(0);

// If onActivityResult delivered a databaseId
if(this.databaseId != -1) {
model.setDatabaseId(this.databaseId);
model.getDatabase().observe(this, databaseEntity -> {
Log.d("MainActivity", String.valueOf(databaseEntity));

if(databaseEntity != null) {
toolbar.setTitle(databaseEntity.getName());
}
});
return;
}

// Get the first available database if none was selected
model.getDatabases().observe(this, databases -> {
if(databases != null){
int databaseId = databases.get(0).getId();
model.setDatabaseId(databaseId);
model.getDatabase().observe(this, databaseEntity -> {
Log.d("MainActivity", String.valueOf(databaseEntity));

if(databaseEntity != null) {
toolbar.setTitle(databaseEntity.getName());
}
});
}
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package io.github.storagereloaded.android.viewmodel;

import android.app.Application;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;

import java.util.List;

import io.github.storagereloaded.android.DataRepository;
import io.github.storagereloaded.android.StoReApp;
import io.github.storagereloaded.android.db.entity.DatabaseEntity;

public class DatabaseListViewModel extends AndroidViewModel {

private final DataRepository repository;

public DatabaseListViewModel(@NonNull Application application) {
super(application);
this.repository = ((StoReApp) application).getRepository();
}

public LiveData<List<DatabaseEntity>> getDatabases() {
return repository.getDatabases();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

import io.github.storagereloaded.android.DataRepository;
import io.github.storagereloaded.android.StoReApp;
import io.github.storagereloaded.api.Database;
import io.github.storagereloaded.android.db.entity.DatabaseEntity;
import io.github.storagereloaded.api.Item;

public class DatabaseViewModel extends AndroidViewModel {
Expand All @@ -31,7 +31,11 @@ public LiveData<List<Item>> getItems() {
return repository.getItemsInDatabase(databaseId);
}

public LiveData<Database> getDatabase() {
public LiveData<DatabaseEntity> getDatabase() {
return repository.getDatabase(databaseId);
}

public LiveData<List<DatabaseEntity>> getDatabases() {
return repository.getDatabases();
}
}

0 comments on commit f374b70

Please sign in to comment.