sometimes you just have to buy a lobster
This commit is contained in:
parent
1792656736
commit
3de1749b0d
46 changed files with 1098 additions and 359 deletions
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools" >
|
||||
|
@ -13,7 +29,7 @@
|
|||
android:theme="@style/Theme.Yeeemp"
|
||||
tools:targetApi="31" >
|
||||
<activity
|
||||
android:name=".ui.activity.MainActivity"
|
||||
android:name=".ui.activity.QueueListActivity"
|
||||
android:exported="true"
|
||||
android:theme="@style/Theme.Yeeemp.Green" >
|
||||
<intent-filter>
|
||||
|
@ -22,6 +38,11 @@
|
|||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name=".ui.activity.EventListActivity"
|
||||
android:exported="true"
|
||||
android:theme="@style/Theme.Yeeemp.Green" >
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
|
@ -20,8 +20,8 @@ public interface Event {
|
|||
int getId();
|
||||
long getTimestamp();
|
||||
void setTimestamp(long timestamp);
|
||||
String getMessage();
|
||||
void setMessage(String message);
|
||||
String getComment();
|
||||
void setComment(String comment);
|
||||
void addTag(Tag tag);
|
||||
void removeTag(Tag tag);
|
||||
Tag[] getTags();
|
||||
|
|
|
@ -17,5 +17,6 @@
|
|||
package art.pegasko.yeeemp.base;
|
||||
|
||||
public interface EventMaker {
|
||||
Event createInQueue(Queue queue);
|
||||
Event create();
|
||||
void delete(Event event);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ public interface Queue {
|
|||
String getName();
|
||||
void setName(String name);
|
||||
Event[] getEvents();
|
||||
int getEventCount();
|
||||
void addEvent(Event event);
|
||||
void removeEvent(Event event);
|
||||
Tag[] getGlobalTags();
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
package art.pegasko.yeeemp.base;
|
||||
|
||||
public interface QueueMaker {
|
||||
Queue getById(int id);
|
||||
Queue create();
|
||||
void delete(Queue queue);
|
||||
Queue[] list();
|
||||
}
|
||||
|
|
|
@ -25,19 +25,16 @@ import android.util.Log;
|
|||
import androidx.annotation.NonNull;
|
||||
|
||||
import art.pegasko.yeeemp.base.Event;
|
||||
import art.pegasko.yeeemp.base.Queue;
|
||||
import art.pegasko.yeeemp.base.Tag;
|
||||
|
||||
public class EventImpl implements Event {
|
||||
public static final String TAG = EventImpl.class.getSimpleName();
|
||||
|
||||
private final SQLiteDatabase db;
|
||||
private final Queue queue;
|
||||
private final int id;
|
||||
|
||||
protected EventImpl(SQLiteDatabase db, Queue queue, int id) {
|
||||
protected EventImpl(SQLiteDatabase db, int id) {
|
||||
this.db = db;
|
||||
this.queue = queue;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
|
@ -52,8 +49,8 @@ public class EventImpl implements Event {
|
|||
Cursor cursor = db.query(
|
||||
"event",
|
||||
new String[] { "timestamp" },
|
||||
"query_id = ? AND id = ?",
|
||||
new String[] { Integer.toString(queue.getId()), Integer.toString(this.getId()) },
|
||||
"id = ?",
|
||||
new String[] { Integer.toString(this.getId()) },
|
||||
null,
|
||||
null,
|
||||
null
|
||||
|
@ -82,11 +79,11 @@ public class EventImpl implements Event {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
public String getComment() {
|
||||
synchronized (this.db) {
|
||||
Cursor cursor = db.query(
|
||||
"event",
|
||||
new String[] { "message" },
|
||||
new String[] { "comment" },
|
||||
"id = ?",
|
||||
new String[] { Integer.toString(this.getId()) },
|
||||
null,
|
||||
|
@ -103,10 +100,10 @@ public class EventImpl implements Event {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void setMessage(String message) {
|
||||
public void setComment(String comment) {
|
||||
synchronized (this.db) {
|
||||
ContentValues cv = new ContentValues();
|
||||
cv.put("message", message);
|
||||
cv.put("comment", comment);
|
||||
db.update(
|
||||
"event",
|
||||
cv,
|
||||
|
@ -148,7 +145,7 @@ public class EventImpl implements Event {
|
|||
cv.put("tag_id", tag.getId());
|
||||
db.insertOrThrow("event_tag", null, cv);
|
||||
} catch (SQLiteException e) {
|
||||
Log.w(TAG, e);
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -169,7 +166,7 @@ public class EventImpl implements Event {
|
|||
new String[] { Integer.toString(this.getId()), Integer.toString(tag.getId()) }
|
||||
);
|
||||
} catch (SQLiteException e) {
|
||||
Log.w(TAG, e);
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -197,7 +194,6 @@ public class EventImpl implements Event {
|
|||
while (cursor.moveToNext()) {
|
||||
tags[index++] = new TagImpl(
|
||||
this.db,
|
||||
this.queue,
|
||||
cursor.getInt(0)
|
||||
);
|
||||
}
|
||||
|
@ -210,12 +206,12 @@ public class EventImpl implements Event {
|
|||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Queue{id=");
|
||||
sb.append("Event{id=");
|
||||
sb.append(this.getId());
|
||||
sb.append(",timestamp=");
|
||||
sb.append(this.getTimestamp());
|
||||
sb.append(",message=");
|
||||
sb.append(this.getMessage());
|
||||
sb.append(",comment=");
|
||||
sb.append(this.getComment());
|
||||
sb.append("}");
|
||||
return sb.toString();
|
||||
}
|
||||
|
|
|
@ -17,14 +17,12 @@
|
|||
package art.pegasko.yeeemp.impl;
|
||||
|
||||
import android.content.ContentValues;
|
||||
import android.database.Cursor;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.database.sqlite.SQLiteException;
|
||||
import android.util.Log;
|
||||
|
||||
import art.pegasko.yeeemp.base.Event;
|
||||
import art.pegasko.yeeemp.base.EventMaker;
|
||||
import art.pegasko.yeeemp.base.Queue;
|
||||
|
||||
public class EventMakerImpl implements EventMaker {
|
||||
public static final String TAG = EventMakerImpl.class.getSimpleName();
|
||||
|
@ -36,22 +34,51 @@ public class EventMakerImpl implements EventMaker {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Event createInQueue(Queue queue) {
|
||||
public Event create() {
|
||||
synchronized (this.db) {
|
||||
try {
|
||||
ContentValues cv = new ContentValues();
|
||||
cv.put("queue_id", queue.getId());
|
||||
cv.put("id", (Integer) null);
|
||||
long rowId = db.insertOrThrow("event", null, cv);
|
||||
return new EventImpl(
|
||||
this.db,
|
||||
queue,
|
||||
(int) rowId
|
||||
);
|
||||
} catch (SQLiteException e) {
|
||||
Log.w(TAG, e);
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(Event event) {
|
||||
synchronized (this.db) {
|
||||
try {
|
||||
// Delete queue <-> event
|
||||
db.delete(
|
||||
"queue_event",
|
||||
"event_id = ?",
|
||||
new String[] { Integer.toString(event.getId()) }
|
||||
);
|
||||
|
||||
// Delete event <-> tag
|
||||
db.delete(
|
||||
"event_tag",
|
||||
"event_id = ?",
|
||||
new String[] { Integer.toString(event.getId()) }
|
||||
);
|
||||
|
||||
// Delete event
|
||||
db.delete(
|
||||
"event",
|
||||
"id = ?",
|
||||
new String[] { Integer.toString(event.getId()) }
|
||||
);
|
||||
} catch (SQLiteException e) {
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,6 +27,7 @@ import androidx.annotation.NonNull;
|
|||
import art.pegasko.yeeemp.base.Event;
|
||||
import art.pegasko.yeeemp.base.Queue;
|
||||
import art.pegasko.yeeemp.base.Tag;
|
||||
import kotlin.NotImplementedError;
|
||||
|
||||
public class QueueImpl implements Queue {
|
||||
public static final String TAG = QueueImpl.class.getSimpleName();
|
||||
|
@ -81,16 +82,62 @@ public class QueueImpl implements Queue {
|
|||
|
||||
@Override
|
||||
public Event[] getEvents() {
|
||||
return new Event[0];
|
||||
synchronized (this.db) {
|
||||
Cursor cursor = db.query(
|
||||
"queue_event",
|
||||
new String[] { "event_id" },
|
||||
"queue_id = ?",
|
||||
new String[] { Integer.toString(this.getId()) },
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
if (cursor == null) {
|
||||
return new Event[0];
|
||||
}
|
||||
|
||||
Event[] events = new Event[cursor.getCount()];
|
||||
|
||||
int index = 0;
|
||||
while (cursor.moveToNext()) {
|
||||
events[index++] = new EventImpl(
|
||||
this.db,
|
||||
cursor.getInt(0)
|
||||
);
|
||||
}
|
||||
|
||||
return events;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getEventCount() {
|
||||
synchronized (this.db) {
|
||||
Cursor cursor = db.query(
|
||||
"queue_event",
|
||||
new String[] { "count(*)" },
|
||||
"queue_id = ?",
|
||||
new String[] { Integer.toString(this.getId()) },
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
if (!Utils.findResult(cursor))
|
||||
return 0;
|
||||
|
||||
return cursor.getInt(0);
|
||||
}
|
||||
}
|
||||
|
||||
/** !synchronized */
|
||||
protected boolean hasEvent(Event event) {
|
||||
synchronized (this.db) {
|
||||
Cursor cursor = db.query(
|
||||
"query_event",
|
||||
"queue_event",
|
||||
new String[] { "1" },
|
||||
"query_id = ? AND event_id = ?",
|
||||
"queue_id = ? AND event_id = ?",
|
||||
new String[] { Integer.toString(this.getId()), Integer.toString(event.getId()) },
|
||||
null,
|
||||
null,
|
||||
|
@ -137,7 +184,7 @@ public class QueueImpl implements Queue {
|
|||
new String[] { Integer.toString(this.getId()), Integer.toString(event.getId()) }
|
||||
);
|
||||
} catch (SQLiteException e) {
|
||||
Log.w(TAG, e);
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -165,7 +212,6 @@ public class QueueImpl implements Queue {
|
|||
while (cursor.moveToNext()) {
|
||||
tags[index++] = new TagImpl(
|
||||
this.db,
|
||||
this,
|
||||
cursor.getInt(0)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -22,6 +22,8 @@ import android.database.sqlite.SQLiteDatabase;
|
|||
import android.database.sqlite.SQLiteException;
|
||||
import android.util.Log;
|
||||
|
||||
import art.pegasko.yeeemp.base.Event;
|
||||
import art.pegasko.yeeemp.base.EventMaker;
|
||||
import art.pegasko.yeeemp.base.Queue;
|
||||
import art.pegasko.yeeemp.base.QueueMaker;
|
||||
|
||||
|
@ -34,6 +36,31 @@ public class QueueMakerImpl implements QueueMaker {
|
|||
this.db = db;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Queue getById(int id) {
|
||||
synchronized (this.db) {
|
||||
try {
|
||||
Cursor cursor = db.query(
|
||||
"queue",
|
||||
new String[] { "1" },
|
||||
"id = ?",
|
||||
new String[] { Integer.toString(id) },
|
||||
null,
|
||||
null,
|
||||
null
|
||||
);
|
||||
|
||||
if (Utils.findResult(cursor))
|
||||
return new QueueImpl(this.db, id);
|
||||
|
||||
} catch (SQLiteException e) {
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Queue create() {
|
||||
synchronized (this.db) {
|
||||
|
@ -46,7 +73,7 @@ public class QueueMakerImpl implements QueueMaker {
|
|||
(int) rowId
|
||||
);
|
||||
} catch (SQLiteException e) {
|
||||
Log.w(TAG, e);
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -83,4 +110,46 @@ public class QueueMakerImpl implements QueueMaker {
|
|||
return queues;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(Queue queue) {
|
||||
synchronized (this.db) {
|
||||
|
||||
// Drop events
|
||||
try {
|
||||
for (Event event: queue.getEvents()) {
|
||||
db.delete(
|
||||
"event",
|
||||
"id = ?",
|
||||
new String[] { Integer.toString(event.getId()) }
|
||||
);
|
||||
}
|
||||
} catch (SQLiteException e) {
|
||||
Log.wtf(TAG, e);
|
||||
return;
|
||||
}
|
||||
|
||||
// Drop queue <-> event
|
||||
try {
|
||||
db.delete(
|
||||
"queue_event",
|
||||
"queue_id = ?",
|
||||
new String[] { Integer.toString(queue.getId()) }
|
||||
);
|
||||
} catch (SQLiteException e) {
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
|
||||
// Drop queue
|
||||
try {
|
||||
db.delete(
|
||||
"queue",
|
||||
"id = ?",
|
||||
new String[] { Integer.toString(queue.getId()) }
|
||||
);
|
||||
} catch (SQLiteException e) {
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,12 +28,10 @@ public class TagImpl implements Tag {
|
|||
public static final String TAG = TagImpl.class.getSimpleName();
|
||||
|
||||
private final SQLiteDatabase db;
|
||||
private final Queue queue;
|
||||
private final int id;
|
||||
|
||||
protected TagImpl(SQLiteDatabase db, Queue queue, int id) {
|
||||
protected TagImpl(SQLiteDatabase db, int id) {
|
||||
this.db = db;
|
||||
this.queue = queue;
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
|
@ -48,8 +46,8 @@ public class TagImpl implements Tag {
|
|||
Cursor cursor = db.query(
|
||||
"tag",
|
||||
new String[] { "name" },
|
||||
"query_id = ? AND id = ?",
|
||||
new String[] { Integer.toString(queue.getId()), Integer.toString(this.getId()) },
|
||||
"id = ?",
|
||||
new String[] { Integer.toString(this.getId()) },
|
||||
null,
|
||||
null,
|
||||
null
|
||||
|
|
|
@ -41,7 +41,7 @@ public class TagMakerImpl implements TagMaker {
|
|||
Cursor cursor = db.query(
|
||||
"tag",
|
||||
new String[] { "id", "name" },
|
||||
"query_id = ? AND name = ?",
|
||||
"queue_id = ? AND name = ?",
|
||||
new String[] { Integer.toString(queue.getId()), name },
|
||||
null,
|
||||
null,
|
||||
|
@ -50,12 +50,11 @@ public class TagMakerImpl implements TagMaker {
|
|||
if (Utils.findResult(cursor)) {
|
||||
return new TagImpl(
|
||||
db,
|
||||
queue,
|
||||
cursor.getInt(0)
|
||||
);
|
||||
}
|
||||
} catch (SQLiteException e) {
|
||||
Log.w(TAG, e);
|
||||
Log.wtf(TAG, e);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -69,7 +68,7 @@ public class TagMakerImpl implements TagMaker {
|
|||
cv.put("name", name);
|
||||
db.insertOrThrow("tag", null, cv);
|
||||
} catch (SQLiteException e) {
|
||||
Log.w(TAG, e);
|
||||
Log.wtf(TAG, e);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
/**
|
||||
* Copyright 2024 pegasko
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package art.pegasko.yeeemp.ui.activity;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
|
||||
import art.pegasko.yeeemp.R;
|
||||
import art.pegasko.yeeemp.base.Event;
|
||||
import art.pegasko.yeeemp.base.Queue;
|
||||
import art.pegasko.yeeemp.base.Wrapper;
|
||||
import art.pegasko.yeeemp.databinding.ActivityEventListBinding;
|
||||
import art.pegasko.yeeemp.impl.Init;
|
||||
|
||||
public class EventListActivity extends AppCompatActivity {
|
||||
public static final String TAG = EventListActivity.class.getSimpleName();
|
||||
|
||||
private ActivityEventListBinding binding;
|
||||
private RecyclerView eventList;
|
||||
private EventRecyclerViewAdapter eventListAdapter;
|
||||
private Queue queue;
|
||||
|
||||
private void updateList() {
|
||||
runOnUiThread(() -> {
|
||||
eventListAdapter.reloadItems();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
Init.initDB(getApplicationContext());
|
||||
|
||||
// Get Queue ID from Intent
|
||||
Bundle extras = getIntent().getExtras();
|
||||
if (extras == null) {
|
||||
Log.e(TAG, "Missing Intent arguments (queue_id)");
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
int queue_id = extras.getInt("queue_id", -1);
|
||||
if (queue_id == -1) {
|
||||
Log.e(TAG, "Missing Intent arguments (queue_id)");
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
queue = Wrapper.getQueueMaker().getById(queue_id);
|
||||
if (queue == null) {
|
||||
Log.e(TAG, "Missing Intent arguments (queue_id)");
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
binding = ActivityEventListBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
setSupportActionBar(binding.toolbar);
|
||||
|
||||
/* Queue list */
|
||||
eventListAdapter = new EventRecyclerViewAdapter(queue);
|
||||
eventList = findViewById(R.id.content_event_list__list);
|
||||
eventList.setLayoutManager(new LinearLayoutManager(this));
|
||||
eventList.setAdapter(eventListAdapter);
|
||||
|
||||
/* FAB Listeners */
|
||||
binding.fab.setOnLongClickListener((View view) -> {
|
||||
Snackbar.make(view, "Create Event", Snackbar.LENGTH_LONG)
|
||||
.setAnchorView(R.id.fab)
|
||||
.setAction("Action", null).show();
|
||||
|
||||
return true;
|
||||
});
|
||||
binding.fab.setOnClickListener(view -> {
|
||||
Log.w(TAG, "TODO: Open editor");
|
||||
|
||||
Event event = Wrapper.getEventMaker().create();
|
||||
event.setTimestamp(System.currentTimeMillis());
|
||||
event.setComment("Lobster number " + System.currentTimeMillis());
|
||||
queue.addEvent(event);
|
||||
|
||||
Log.w(TAG, "Create: " + event.toString() + " in " + queue);
|
||||
|
||||
updateList();
|
||||
});
|
||||
|
||||
/* Fill lists */
|
||||
updateList();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
/**
|
||||
* Copyright 2024 pegasko
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package art.pegasko.yeeemp.ui.activity;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.text.InputType;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.PopupMenu;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import art.pegasko.yeeemp.R;
|
||||
import art.pegasko.yeeemp.base.Event;
|
||||
import art.pegasko.yeeemp.base.Queue;
|
||||
import art.pegasko.yeeemp.base.Wrapper;
|
||||
import art.pegasko.yeeemp.databinding.EventListItemBinding;
|
||||
import art.pegasko.yeeemp.databinding.QueueListItemBinding;
|
||||
|
||||
class EventRecyclerViewAdapter extends RecyclerView.Adapter<EventRecyclerViewAdapter.ViewHolder> {
|
||||
public static final String TAG = EventRecyclerViewAdapter.class.getSimpleName();
|
||||
|
||||
private final Queue queue;
|
||||
private Event[] events;
|
||||
|
||||
public EventRecyclerViewAdapter(Queue queue) {
|
||||
super();
|
||||
this.queue = queue;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
|
||||
View view = (
|
||||
LayoutInflater
|
||||
.from(viewGroup.getContext())
|
||||
.inflate(R.layout.event_list_item, viewGroup, false)
|
||||
);
|
||||
|
||||
return new ViewHolder(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
|
||||
viewHolder.getBinding().eventListItemTimestamp.setText(Utils.formatTs(events[position].getTimestamp()));
|
||||
|
||||
viewHolder.getBinding().eventListItemItem.setOnLongClickListener((View view) -> {
|
||||
PopupMenu popupMenu = new PopupMenu(view.getContext(), viewHolder.getBinding().eventListItemItem);
|
||||
popupMenu.getMenuInflater().inflate(R.menu.event_list_item_action_menu, popupMenu.getMenu());
|
||||
popupMenu.setOnMenuItemClickListener((MenuItem menuItem) -> {
|
||||
if (menuItem.getItemId() == R.id.event_list_item_action_menu_delete) {
|
||||
new AlertDialog.Builder(view.getContext())
|
||||
.setTitle("Delete event")
|
||||
.setMessage("Are you sure you want to delete this event?")
|
||||
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
|
||||
Wrapper.getEventMaker().delete(events[position]);
|
||||
|
||||
reloadItems();
|
||||
})
|
||||
.setNegativeButton(android.R.string.no, null)
|
||||
.setIcon(android.R.drawable.ic_dialog_alert)
|
||||
.show();
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
popupMenu.show();
|
||||
|
||||
return true;
|
||||
});
|
||||
|
||||
// viewHolder.queueStats.setText(Integer.toString(events[position].getEventCount()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemCount() {
|
||||
return this.events.length;
|
||||
}
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
private EventListItemBinding binding;
|
||||
|
||||
public ViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
this.binding = EventListItemBinding.bind(itemView);
|
||||
}
|
||||
|
||||
public EventListItemBinding getBinding() {
|
||||
return this.binding;
|
||||
}
|
||||
}
|
||||
|
||||
public void reloadItems() {
|
||||
this.events = this.queue.getEvents();
|
||||
this.notifyDataSetChanged();
|
||||
}
|
||||
}
|
|
@ -1,61 +0,0 @@
|
|||
/**
|
||||
* Copyright 2024 pegasko
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package art.pegasko.yeeemp.ui.activity;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.navigation.fragment.NavHostFragment;
|
||||
|
||||
import art.pegasko.yeeemp.R;
|
||||
import art.pegasko.yeeemp.databinding.FragmentFirstBinding;
|
||||
|
||||
public class FirstFragment extends Fragment {
|
||||
|
||||
private FragmentFirstBinding binding;
|
||||
|
||||
@Override
|
||||
public View onCreateView(
|
||||
@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState
|
||||
) {
|
||||
|
||||
binding = FragmentFirstBinding.inflate(inflater, container, false);
|
||||
return binding.getRoot();
|
||||
|
||||
}
|
||||
|
||||
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
binding.buttonFirst.setOnClickListener(v ->
|
||||
NavHostFragment.findNavController(FirstFragment.this)
|
||||
.navigate(R.id.action_FirstFragment_to_SecondFragment)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
binding = null;
|
||||
}
|
||||
|
||||
}
|
|
@ -22,26 +22,23 @@ import androidx.appcompat.app.AppCompatActivity;
|
|||
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import androidx.navigation.NavController;
|
||||
import androidx.navigation.Navigation;
|
||||
|
||||
import androidx.navigation.ui.AppBarConfiguration;
|
||||
import androidx.navigation.ui.NavigationUI;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import art.pegasko.yeeemp.base.Queue;
|
||||
import art.pegasko.yeeemp.base.Wrapper;
|
||||
import art.pegasko.yeeemp.databinding.ActivityMainBinding;
|
||||
import art.pegasko.yeeemp.databinding.ActivityQueueListBinding;
|
||||
|
||||
import art.pegasko.yeeemp.R;
|
||||
import art.pegasko.yeeemp.impl.EventImpl;
|
||||
import art.pegasko.yeeemp.impl.Init;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
public static final String TAG = MainActivity.class.getSimpleName();
|
||||
public class QueueListActivity extends AppCompatActivity {
|
||||
public static final String TAG = QueueListActivity.class.getSimpleName();
|
||||
|
||||
private AppBarConfiguration appBarConfiguration;
|
||||
private ActivityMainBinding binding;
|
||||
private ActivityQueueListBinding binding;
|
||||
private RecyclerView queueList;
|
||||
private QueueRecyclerViewAdapter queueListAdapter;
|
||||
|
||||
|
@ -57,20 +54,16 @@ public class MainActivity extends AppCompatActivity {
|
|||
|
||||
Init.initDB(getApplicationContext());
|
||||
|
||||
binding = ActivityMainBinding.inflate(getLayoutInflater());
|
||||
binding = ActivityQueueListBinding.inflate(getLayoutInflater());
|
||||
setContentView(binding.getRoot());
|
||||
|
||||
setSupportActionBar(binding.toolbar);
|
||||
|
||||
/* Queue list */
|
||||
queueListAdapter = new QueueRecyclerViewAdapter();
|
||||
queueList = findViewById(R.id.content_main__queue_list);
|
||||
queueList = findViewById(R.id.content_queue_list__list);
|
||||
queueList.setLayoutManager(new LinearLayoutManager(this));
|
||||
queueList.setAdapter(queueListAdapter);
|
||||
|
||||
// NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
|
||||
// appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
|
||||
// NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
|
||||
|
||||
/* FAB Listeners */
|
||||
binding.fab.setOnLongClickListener((View view) -> {
|
||||
Snackbar.make(view, "Create Queue", Snackbar.LENGTH_LONG)
|
||||
|
@ -79,25 +72,23 @@ public class MainActivity extends AppCompatActivity {
|
|||
|
||||
return true;
|
||||
});
|
||||
binding.fab.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Queue q = Wrapper.getQueueMaker().create();
|
||||
q.setName("New Queue");
|
||||
Log.w(TAG, "Create: " + q.toString());
|
||||
binding.fab.setOnClickListener(view -> {
|
||||
Queue q = Wrapper.getQueueMaker().create();
|
||||
q.setName("New Queue");
|
||||
Log.w(TAG, "Create: " + q.toString());
|
||||
|
||||
updateList();
|
||||
}
|
||||
updateList();
|
||||
});
|
||||
|
||||
/* Fill lists */
|
||||
updateList();
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public boolean onSupportNavigateUp() {
|
||||
// NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main);
|
||||
// return NavigationUI.navigateUp(navController, appBarConfiguration)
|
||||
// || super.onSupportNavigateUp();
|
||||
// }
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
/* Ekchualle we returned from somewhere */
|
||||
updateList();
|
||||
}
|
||||
}
|
|
@ -1,7 +1,25 @@
|
|||
/**
|
||||
* Copyright 2024 pegasko
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package art.pegasko.yeeemp.ui.activity;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.InputType;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
|
@ -10,19 +28,17 @@ import android.view.View;
|
|||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
import android.widget.PopupMenu;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import art.pegasko.yeeemp.R;
|
||||
import art.pegasko.yeeemp.base.Event;
|
||||
import art.pegasko.yeeemp.base.Queue;
|
||||
import art.pegasko.yeeemp.base.QueueMaker;
|
||||
import art.pegasko.yeeemp.base.Wrapper;
|
||||
import art.pegasko.yeeemp.impl.EventImpl;
|
||||
import art.pegasko.yeeemp.databinding.QueueListItemBinding;
|
||||
|
||||
public class QueueRecyclerViewAdapter extends RecyclerView.Adapter<QueueRecyclerViewAdapter.ViewHolder> {
|
||||
class QueueRecyclerViewAdapter extends RecyclerView.Adapter<QueueRecyclerViewAdapter.ViewHolder> {
|
||||
public static final String TAG = QueueRecyclerViewAdapter.class.getSimpleName();
|
||||
|
||||
private Queue[] queues;
|
||||
|
@ -41,20 +57,20 @@ public class QueueRecyclerViewAdapter extends RecyclerView.Adapter<QueueRecycler
|
|||
|
||||
@Override
|
||||
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
|
||||
viewHolder.queueName.setText(queues[position].getName());
|
||||
viewHolder.queueItem.setOnLongClickListener((View view) -> {
|
||||
PopupMenu popupMenu = new PopupMenu(view.getContext(), viewHolder.queueItem);
|
||||
viewHolder.getBinding().queueListItemTitle.setText(queues[position].getName());
|
||||
|
||||
viewHolder.getBinding().queueListItemItem.setOnLongClickListener((View view) -> {
|
||||
PopupMenu popupMenu = new PopupMenu(view.getContext(), viewHolder.getBinding().queueListItemItem);
|
||||
popupMenu.getMenuInflater().inflate(R.menu.queue_list_item_action_menu, popupMenu.getMenu());
|
||||
popupMenu.setOnMenuItemClickListener((MenuItem menuItem) -> {
|
||||
if (menuItem.getItemId() == R.id.queue_list_item_action_menu_delete) {
|
||||
new AlertDialog.Builder(view.getContext())
|
||||
.setTitle("Delete entry")
|
||||
.setTitle("Delete queue")
|
||||
.setMessage("Are you sure you want to delete this queue?")
|
||||
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
// Wrapper.getQueueMaker().delete
|
||||
Log.e(TAG, "Not implemented action");
|
||||
}
|
||||
.setPositiveButton(android.R.string.yes, (dialog, which) -> {
|
||||
Wrapper.getQueueMaker().delete(queues[position]);
|
||||
|
||||
reloadItems();
|
||||
})
|
||||
.setNegativeButton(android.R.string.no, null)
|
||||
.setIcon(android.R.drawable.ic_dialog_alert)
|
||||
|
@ -85,6 +101,30 @@ public class QueueRecyclerViewAdapter extends RecyclerView.Adapter<QueueRecycler
|
|||
|
||||
return true;
|
||||
});
|
||||
viewHolder.getBinding().queueListItemItem.setOnClickListener((View view) -> {
|
||||
Bundle extra = new Bundle();
|
||||
extra.putInt("queue_id", queues[position].getId());
|
||||
|
||||
Intent intent = new Intent(view.getContext(), EventListActivity.class);
|
||||
intent.putExtras(extra);
|
||||
|
||||
view.getContext().startActivity(intent);
|
||||
});
|
||||
|
||||
viewHolder.getBinding().queueListItemStats.setText(Integer.toString(queues[position].getEventCount()));
|
||||
|
||||
viewHolder.getBinding().queueListItemPlus.setOnClickListener((View view) -> {
|
||||
Log.w(TAG, "TODO: Open editor");
|
||||
|
||||
Event event = Wrapper.getEventMaker().create();
|
||||
event.setTimestamp(System.currentTimeMillis());
|
||||
event.setComment("Lobster number " + System.currentTimeMillis());
|
||||
queues[position].addEvent(event);
|
||||
|
||||
Log.w(TAG, "Create: " + event.toString() + " in " + queues[position]);
|
||||
|
||||
reloadItems();
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -93,18 +133,15 @@ public class QueueRecyclerViewAdapter extends RecyclerView.Adapter<QueueRecycler
|
|||
}
|
||||
|
||||
public static class ViewHolder extends RecyclerView.ViewHolder {
|
||||
private TextView queueName;
|
||||
private View queueItem;
|
||||
private QueueListItemBinding binding;
|
||||
|
||||
public ViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
|
||||
queueItem = itemView.findViewById(R.id.queue_list_item__queue_item);
|
||||
queueName = (TextView) itemView.findViewById(R.id.queue_list_item__queue_title);
|
||||
this.binding = QueueListItemBinding.bind(itemView);
|
||||
}
|
||||
|
||||
public TextView getQueueName() {
|
||||
return queueName;
|
||||
public QueueListItemBinding getBinding() {
|
||||
return this.binding;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,61 +0,0 @@
|
|||
/**
|
||||
* Copyright 2024 pegasko
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package art.pegasko.yeeemp.ui.activity;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.navigation.fragment.NavHostFragment;
|
||||
|
||||
import art.pegasko.yeeemp.R;
|
||||
import art.pegasko.yeeemp.databinding.FragmentSecondBinding;
|
||||
|
||||
public class SecondFragment extends Fragment {
|
||||
|
||||
private FragmentSecondBinding binding;
|
||||
|
||||
@Override
|
||||
public View onCreateView(
|
||||
@NonNull LayoutInflater inflater, ViewGroup container,
|
||||
Bundle savedInstanceState
|
||||
) {
|
||||
|
||||
binding = FragmentSecondBinding.inflate(inflater, container, false);
|
||||
return binding.getRoot();
|
||||
|
||||
}
|
||||
|
||||
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
|
||||
binding.buttonSecond.setOnClickListener(v ->
|
||||
NavHostFragment.findNavController(SecondFragment.this)
|
||||
.navigate(R.id.action_SecondFragment_to_FirstFragment)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
binding = null;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* Copyright 2024 pegasko
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package art.pegasko.yeeemp.ui.activity;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class Utils {
|
||||
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
public static String formatTs(long timestamp) {
|
||||
SimpleDateFormat sdf = new SimpleDateFormat(Utils.DATE_FORMAT);
|
||||
return sdf.format(timestamp);
|
||||
}
|
||||
}
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:aapt="http://schemas.android.com/aapt"
|
||||
android:width="108dp"
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
|
|
53
Yeeemp/app/src/main/res/layout/activity_event_list.xml
Normal file
53
Yeeemp/app/src/main/res/layout/activity_event_list.xml
Normal file
|
@ -0,0 +1,53 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context=".ui.activity.QueueListActivity">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.google.android.material.appbar.MaterialToolbar
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize"
|
||||
app:titleTextColor="@color/pegasko_white"
|
||||
android:background="@color/pegasko_dark" />
|
||||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<include layout="@layout/content_event_list"/>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_marginEnd="@dimen/fab_margin"
|
||||
android:layout_marginBottom="16dp"
|
||||
app:srcCompat="@android:drawable/ic_input_add"
|
||||
android:backgroundTint="@color/pegasko_blue" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
|
@ -6,7 +22,7 @@
|
|||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true"
|
||||
tools:context=".ui.activity.MainActivity">
|
||||
tools:context=".ui.activity.QueueListActivity">
|
||||
|
||||
<com.google.android.material.appbar.AppBarLayout
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -22,7 +38,7 @@
|
|||
|
||||
</com.google.android.material.appbar.AppBarLayout>
|
||||
|
||||
<include layout="@layout/content_main"/>
|
||||
<include layout="@layout/content_queue_list"/>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
|
@ -32,6 +48,6 @@
|
|||
android:layout_marginEnd="@dimen/fab_margin"
|
||||
android:layout_marginBottom="16dp"
|
||||
app:srcCompat="@android:drawable/ic_input_add"
|
||||
android:backgroundTint="?attr/colorPrimary" />
|
||||
android:backgroundTint="@color/pegasko_green" />
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
@ -1,10 +1,26 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/colorSecondary"
|
||||
android:background="@color/pegasko_black"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
|
@ -15,6 +31,6 @@
|
|||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:padding="@dimen/pegasko_list_item_content_margin"
|
||||
android:id="@+id/content_main__queue_list" />
|
||||
android:id="@+id/content_event_list__list" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
36
Yeeemp/app/src/main/res/layout/content_queue_list.xml
Normal file
36
Yeeemp/app/src/main/res/layout/content_queue_list.xml
Normal file
|
@ -0,0 +1,36 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/pegasko_black"
|
||||
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
android:padding="@dimen/pegasko_list_item_content_margin"
|
||||
android:id="@+id/content_queue_list__list" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
75
Yeeemp/app/src/main/res/layout/event_list_item.xml
Normal file
75
Yeeemp/app/src/main/res/layout/event_list_item.xml
Normal file
|
@ -0,0 +1,75 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/transparent">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/event_list_item__item"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_margin="@dimen/pegasko_list_item_content_margin"
|
||||
android:layout_weight="1"
|
||||
android:background="@color/pegasko_blue"
|
||||
android:gravity="center"
|
||||
android:padding="@dimen/pegasko_list_item_main_padding">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/event_list_item__timestamp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/pegasko_list_item_title_margin"
|
||||
android:fontFamily="monospace"
|
||||
android:text="TextView"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="@color/pegasko_black"
|
||||
android:textSize="@dimen/pegasko_list_item_title"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="@dimen/pegasko_list_item_plus_width"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_margin="@dimen/pegasko_list_item_content_margin"
|
||||
android:background="@color/pegasko_blue"
|
||||
android:gravity="center">
|
||||
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="monospace"
|
||||
android:text="+"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="@color/pegasko_black"
|
||||
android:textSize="@dimen/pegasko_list_item_plus"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
|
@ -1,34 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.core.widget.NestedScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".FirstFragment">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="16dp">
|
||||
<Button
|
||||
android:id="@+id/button_first"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/next"
|
||||
app:layout_constraintBottom_toTopOf="@id/textview_first"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textview_first"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/lorem_ipsum"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/button_first" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
|
@ -1,34 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.core.widget.NestedScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".SecondFragment">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:padding="16dp">
|
||||
<Button
|
||||
android:id="@+id/button_second"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/previous"
|
||||
app:layout_constraintBottom_toTopOf="@id/textview_second"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textview_second"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:text="@string/lorem_ipsum"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/button_second" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
|
@ -1,34 +1,73 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/pegasko_list_item_size"
|
||||
android:background="@android:color/transparent" >
|
||||
android:layout_height="wrap_content"
|
||||
android:background="@android:color/transparent">
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/queue_list_item__item"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/queue_list_item__queue_item"
|
||||
android:layout_margin="@dimen/pegasko_list_item_content_margin"
|
||||
android:layout_weight="1"
|
||||
android:background="@color/pegasko_green"
|
||||
android:gravity="center">
|
||||
android:gravity="center"
|
||||
android:padding="@dimen/pegasko_list_item_main_padding">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/queue_list_item__queue_title"
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:fontFamily="monospace"
|
||||
android:text="TextView"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="@color/pegasko_black"
|
||||
android:textSize="@dimen/pegasko_list_item_title"
|
||||
android:textStyle="bold" />
|
||||
android:gravity="center"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/queue_list_item__title"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/pegasko_list_item_title_margin"
|
||||
android:fontFamily="monospace"
|
||||
android:text="TextView"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="@color/pegasko_black"
|
||||
android:textSize="@dimen/pegasko_list_item_title"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/queue_list_item__stats"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/pegasko_list_item_subtitle_margin"
|
||||
android:fontFamily="monospace"
|
||||
android:text="TextView"
|
||||
android:textAlignment="viewStart"
|
||||
android:textColor="@color/pegasko_black"
|
||||
android:textSize="@dimen/pegasko_list_item_subtitle"
|
||||
android:textStyle="bold" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="@dimen/pegasko_list_item_size"
|
||||
android:id="@+id/queue_list_item__plus"
|
||||
android:layout_width="@dimen/pegasko_list_item_plus_width"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_margin="@dimen/pegasko_list_item_content_margin"
|
||||
android:background="@color/pegasko_green"
|
||||
|
|
22
Yeeemp/app/src/main/res/menu/event_list_item_action_menu.xml
Normal file
22
Yeeemp/app/src/main/res/menu/event_list_item_action_menu.xml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:id="@+id/event_list_item_action_menu_delete"
|
||||
android:title="Delete" />
|
||||
</menu>
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background" />
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background" />
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/nav_graph"
|
||||
app:startDestination="@id/FirstFragment">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/FirstFragment"
|
||||
android:name="art.pegasko.yeeemp.ui.FirstFragment"
|
||||
android:label="@string/first_fragment_label"
|
||||
tools:layout="@layout/fragment_first">
|
||||
|
||||
<action
|
||||
android:id="@+id/action_FirstFragment_to_SecondFragment"
|
||||
app:destination="@id/SecondFragment" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/SecondFragment"
|
||||
android:name="art.pegasko.yeeemp.ui.SecondFragment"
|
||||
android:label="@string/second_fragment_label"
|
||||
tools:layout="@layout/fragment_second">
|
||||
|
||||
<action
|
||||
android:id="@+id/action_SecondFragment_to_FirstFragment"
|
||||
app:destination="@id/FirstFragment" />
|
||||
</fragment>
|
||||
</navigation>
|
|
@ -1,28 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/nav_graph2"
|
||||
app:startDestination="@id/FirstFragment">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/FirstFragment"
|
||||
android:name="art.pegasko.yeeemp.ui.activity.FirstFragment"
|
||||
android:label="@string/first_fragment_label"
|
||||
tools:layout="@layout/fragment_first" >
|
||||
|
||||
<action
|
||||
android:id="@+id/action_FirstFragment_to_SecondFragment"
|
||||
app:destination="@id/SecondFragment" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/SecondFragment"
|
||||
android:name="art.pegasko.yeeemp.ui.activity.SecondFragment"
|
||||
android:label="@string/second_fragment_label"
|
||||
tools:layout="@layout/fragment_second" >
|
||||
|
||||
<action
|
||||
android:id="@+id/action_SecondFragment_to_FirstFragment"
|
||||
app:destination="@id/FirstFragment" />
|
||||
</fragment>
|
||||
</navigation>
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.Yeeemp.Green" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
||||
|
|
|
@ -1,7 +1,23 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<style name="Theme.Yeeemp.Green" parent="Base.Theme.Yeeemp.Green">
|
||||
<item name="android:navigationBarColor">@color/pegasko_dark_green</item>
|
||||
<item name="android:statusBarColor">@color/pegasko_dark_green</item>
|
||||
<item name="android:navigationBarColor">@color/pegasko_dark</item>
|
||||
<item name="android:statusBarColor">@color/pegasko_dark</item>
|
||||
<item name="android:windowLightStatusBar">false</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<dimen name="fab_margin">200dp</dimen>
|
||||
</resources>
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="black">#FF000000</color>
|
||||
|
|
|
@ -1,9 +1,35 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<dimen name="fab_margin">16dp</dimen>
|
||||
|
||||
<dimen name="pegasko_list_item_size">80dp</dimen>
|
||||
<dimen name="pegasko_list_item_padding">8dp</dimen>
|
||||
|
||||
<dimen name="pegasko_list_item_main_padding">8dp</dimen>
|
||||
|
||||
<dimen name="pegasko_list_item_title">24sp</dimen>
|
||||
<dimen name="pegasko_list_item_title_margin">4dp</dimen>
|
||||
|
||||
<dimen name="pegasko_list_item_subtitle">12sp</dimen>
|
||||
<dimen name="pegasko_list_item_subtitle_margin">2dp</dimen>
|
||||
|
||||
<dimen name="pegasko_list_item_plus">32sp</dimen>
|
||||
<dimen name="pegasko_list_item_plus_width">80dp</dimen>
|
||||
|
||||
<dimen name="pegasko_list_item_content_margin">2dp</dimen>
|
||||
</resources>
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<string name="app_name">Yeeemp</string>
|
||||
<!-- Strings used for fragments for navigation -->
|
||||
|
|
|
@ -1,6 +1,22 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.Yeeemp" parent="Theme.MaterialComponents.DayNight">
|
||||
<style name="Theme.Yeeemp" parent="ThemeOverlay.MaterialComponents.Dark">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/pegasko_white</item>
|
||||
<item name="colorPrimaryVariant">@color/pegasko_light</item>
|
||||
|
@ -18,7 +34,7 @@
|
|||
</style>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="Base.Theme.Yeeemp" parent="Theme.Material3.DayNight.NoActionBar">
|
||||
<style name="Base.Theme.Yeeemp" parent="Theme.Material3.Dark.NoActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/pegasko_white</item>
|
||||
<item name="colorPrimaryVariant">@color/pegasko_light</item>
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Sample backup rules file; uncomment and customize as necessary.
|
||||
See https://developer.android.com/guide/topics/data/autobackup
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
<!--
|
||||
Copyright 2024 pegasko
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
Sample data extraction rules file; uncomment and customize as necessary.
|
||||
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
|
||||
|
|
Loading…
Reference in a new issue