From 7af11814d6362b668da74050e3da1481064f1640 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 13 Aug 2018 06:59:05 +0000 Subject: [PATCH] Show operations in debug mode --- .../java/eu/faircode/email/ActivityView.java | 15 ++ .../eu/faircode/email/AdapterOperation.java | 192 ++++++++++++++++++ .../java/eu/faircode/email/DaoOperation.java | 3 + .../eu/faircode/email/FragmentOperations.java | 86 ++++++++ .../drawable-hdpi/baseline_list_black_18.png | Bin 0 -> 144 bytes .../drawable-hdpi/baseline_list_black_24.png | Bin 0 -> 123 bytes .../drawable-hdpi/baseline_list_black_36.png | Bin 0 -> 133 bytes .../drawable-hdpi/baseline_list_black_48.png | Bin 0 -> 111 bytes .../drawable-hdpi/baseline_list_white_18.png | Bin 0 -> 147 bytes .../drawable-hdpi/baseline_list_white_24.png | Bin 0 -> 124 bytes .../drawable-hdpi/baseline_list_white_36.png | Bin 0 -> 133 bytes .../drawable-hdpi/baseline_list_white_48.png | Bin 0 -> 94 bytes .../drawable-mdpi/baseline_list_black_18.png | Bin 0 -> 89 bytes .../drawable-mdpi/baseline_list_black_24.png | Bin 0 -> 93 bytes .../drawable-mdpi/baseline_list_black_36.png | Bin 0 -> 123 bytes .../drawable-mdpi/baseline_list_black_48.png | Bin 0 -> 110 bytes .../drawable-mdpi/baseline_list_white_18.png | Bin 0 -> 92 bytes .../drawable-mdpi/baseline_list_white_24.png | Bin 0 -> 89 bytes .../drawable-mdpi/baseline_list_white_36.png | Bin 0 -> 124 bytes .../drawable-mdpi/baseline_list_white_48.png | Bin 0 -> 95 bytes .../drawable-xhdpi/baseline_list_black_18.png | Bin 0 -> 123 bytes .../drawable-xhdpi/baseline_list_black_24.png | Bin 0 -> 110 bytes .../drawable-xhdpi/baseline_list_black_36.png | Bin 0 -> 111 bytes .../drawable-xhdpi/baseline_list_black_48.png | Bin 0 -> 117 bytes .../drawable-xhdpi/baseline_list_white_18.png | Bin 0 -> 124 bytes .../drawable-xhdpi/baseline_list_white_24.png | Bin 0 -> 95 bytes .../drawable-xhdpi/baseline_list_white_36.png | Bin 0 -> 94 bytes .../drawable-xhdpi/baseline_list_white_48.png | Bin 0 -> 100 bytes .../baseline_list_black_18.png | Bin 0 -> 133 bytes .../baseline_list_black_24.png | Bin 0 -> 111 bytes .../baseline_list_black_36.png | Bin 0 -> 154 bytes .../baseline_list_black_48.png | Bin 0 -> 128 bytes .../baseline_list_white_18.png | Bin 0 -> 133 bytes .../baseline_list_white_24.png | Bin 0 -> 94 bytes .../baseline_list_white_36.png | Bin 0 -> 154 bytes .../baseline_list_white_48.png | Bin 0 -> 111 bytes .../baseline_list_black_18.png | Bin 0 -> 111 bytes .../baseline_list_black_24.png | Bin 0 -> 117 bytes .../baseline_list_black_36.png | Bin 0 -> 128 bytes .../baseline_list_black_48.png | Bin 0 -> 132 bytes .../baseline_list_white_18.png | Bin 0 -> 94 bytes .../baseline_list_white_24.png | Bin 0 -> 100 bytes .../baseline_list_white_36.png | Bin 0 -> 111 bytes .../baseline_list_white_48.png | Bin 0 -> 115 bytes .../main/res/drawable/baseline_list_24.xml | 10 + .../main/res/layout/fragment_operations.xml | 36 ++++ app/src/main/res/layout/item_operation.xml | 38 ++++ app/src/main/res/values/strings.xml | 1 + 48 files changed, 381 insertions(+) create mode 100644 app/src/main/java/eu/faircode/email/AdapterOperation.java create mode 100644 app/src/main/java/eu/faircode/email/FragmentOperations.java create mode 100755 app/src/main/res/drawable-hdpi/baseline_list_black_18.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_list_black_24.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_list_black_36.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_list_black_48.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_list_white_18.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_list_white_24.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_list_white_36.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_list_white_48.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_list_black_18.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_list_black_24.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_list_black_36.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_list_black_48.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_list_white_18.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_list_white_24.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_list_white_36.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_list_white_48.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_list_black_18.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_list_black_24.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_list_black_36.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_list_black_48.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_list_white_18.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_list_white_24.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_list_white_36.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_list_white_48.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_list_black_18.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_list_black_24.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_list_black_36.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_list_black_48.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_list_white_18.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_list_white_24.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_list_white_36.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_list_white_48.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_list_black_18.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_list_black_24.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_list_black_36.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_list_black_48.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_list_white_18.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_list_white_24.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_list_white_36.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_list_white_48.png create mode 100755 app/src/main/res/drawable/baseline_list_24.xml create mode 100644 app/src/main/res/layout/fragment_operations.xml create mode 100644 app/src/main/res/layout/item_operation.xml diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 19b52c9e..0a6d9fae 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -27,6 +27,7 @@ import android.content.res.Configuration; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; @@ -110,6 +111,9 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack case R.string.menu_setup: onMenuSetup(); break; + case R.string.menu_operations: + onMenuOperations(); + break; case R.string.menu_faq: onMenuFAQ(); break; @@ -145,8 +149,13 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack } drawerArray.add(new DrawerItem(ActivityView.this, R.drawable.baseline_settings_applications_24, R.string.menu_setup)); + + if (PreferenceManager.getDefaultSharedPreferences(ActivityView.this).getBoolean("debug", false)) + drawerArray.add(new DrawerItem(ActivityView.this, R.drawable.baseline_list_24, R.string.menu_operations)); + if (getIntentFAQ().resolveActivity(getPackageManager()) != null) drawerArray.add(new DrawerItem(ActivityView.this, R.drawable.baseline_question_answer_24, R.string.menu_faq)); + drawerArray.add(new DrawerItem(ActivityView.this, R.drawable.baseline_help_24, R.string.menu_about)); drawerList.setAdapter(drawerArray); @@ -394,6 +403,12 @@ public class ActivityView extends ActivityBase implements FragmentManager.OnBack startActivity(new Intent(ActivityView.this, ActivitySetup.class)); } + private void onMenuOperations() { + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + fragmentTransaction.replace(R.id.content_frame, new FragmentOperations()).addToBackStack("operations"); + fragmentTransaction.commit(); + } + private void onMenuFAQ() { startActivity(getIntentFAQ()); } diff --git a/app/src/main/java/eu/faircode/email/AdapterOperation.java b/app/src/main/java/eu/faircode/email/AdapterOperation.java new file mode 100644 index 00000000..00f0e686 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/AdapterOperation.java @@ -0,0 +1,192 @@ +package eu.faircode.email; + +/* + This file is part of Safe email. + + Safe email is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + NetGuard is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with NetGuard. If not, see . + + Copyright 2018 by Marcel Bokhorst (M66B) +*/ + +import android.content.Context; +import android.content.Intent; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListUpdateCallback; +import androidx.recyclerview.widget.RecyclerView; + +public class AdapterOperation extends RecyclerView.Adapter { + private Context context; + + private List all = new ArrayList<>(); + private List filtered = new ArrayList<>(); + + private DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.LONG); + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + View itemView; + TextView tvMessage; + TextView tvName; + TextView tvTime; + + ViewHolder(View itemView) { + super(itemView); + + this.itemView = itemView; + tvMessage = itemView.findViewById(R.id.tvMessage); + tvName = itemView.findViewById(R.id.tvName); + tvTime = itemView.findViewById(R.id.tvTime); + } + + private void wire() { + itemView.setOnClickListener(this); + } + + private void unwire() { + itemView.setOnClickListener(null); + } + + private void bindTo(EntityOperation operation) { + tvMessage.setText(Long.toString(operation.message)); + tvName.setText(operation.name); + tvTime.setText(df.format(new Date(operation.created))); + } + + @Override + public void onClick(View view) { + int pos = getAdapterPosition(); + if (pos == RecyclerView.NO_POSITION) + return; + EntityOperation operation = filtered.get(pos); + + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); + lbm.sendBroadcast( + new Intent(ActivityView.ACTION_VIEW_MESSAGE) + .putExtra("id", operation.message)); + } + } + + AdapterOperation(Context context) { + this.context = context; + setHasStableIds(true); + } + + public void set(@NonNull List operations) { + Log.i(Helper.TAG, "Set operations=" + operations.size()); + + all.clear(); + all.addAll(operations); + + DiffUtil.DiffResult diff = DiffUtil.calculateDiff(new MessageDiffCallback(filtered, all)); + + filtered.clear(); + filtered.addAll(all); + + diff.dispatchUpdatesTo(new ListUpdateCallback() { + @Override + public void onInserted(int position, int count) { + Log.i(Helper.TAG, "Inserted @" + position + " #" + count); + } + + @Override + public void onRemoved(int position, int count) { + Log.i(Helper.TAG, "Removed @" + position + " #" + count); + } + + @Override + public void onMoved(int fromPosition, int toPosition) { + Log.i(Helper.TAG, "Moved " + fromPosition + ">" + toPosition); + } + + @Override + public void onChanged(int position, int count, Object payload) { + Log.i(Helper.TAG, "Changed @" + position + " #" + count); + } + }); + diff.dispatchUpdatesTo(AdapterOperation.this); + } + + private class MessageDiffCallback extends DiffUtil.Callback { + private List prev; + private List next; + + MessageDiffCallback(List prev, List next) { + this.prev = prev; + this.next = next; + } + + @Override + public int getOldListSize() { + return prev.size(); + } + + @Override + public int getNewListSize() { + return next.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + EntityOperation a1 = prev.get(oldItemPosition); + EntityOperation a2 = next.get(newItemPosition); + return a1.id.equals(a2.id); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + EntityOperation a1 = prev.get(oldItemPosition); + EntityOperation a2 = next.get(newItemPosition); + return a1.equals(a2); + } + } + + @Override + public long getItemId(int position) { + return filtered.get(position).id; + } + + @Override + public int getItemCount() { + return filtered.size(); + } + + @Override + @NonNull + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_operation, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + holder.unwire(); + + EntityOperation operation = filtered.get(position); + holder.bindTo(operation); + + holder.wire(); + } +} diff --git a/app/src/main/java/eu/faircode/email/DaoOperation.java b/app/src/main/java/eu/faircode/email/DaoOperation.java index c8734081..bd4a60cd 100644 --- a/app/src/main/java/eu/faircode/email/DaoOperation.java +++ b/app/src/main/java/eu/faircode/email/DaoOperation.java @@ -34,6 +34,9 @@ public interface DaoOperation { @Query("SELECT * FROM operation WHERE folder = :folder ORDER BY id") List getOperationsByFolder(long folder); + @Query("SELECT * FROM operation ORDER BY id") + LiveData> liveOperations(); + @Query("SELECT COUNT(id) FROM operation WHERE folder = :folder") int getOperationCount(long folder); diff --git a/app/src/main/java/eu/faircode/email/FragmentOperations.java b/app/src/main/java/eu/faircode/email/FragmentOperations.java new file mode 100644 index 00000000..edab0859 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/FragmentOperations.java @@ -0,0 +1,86 @@ +package eu.faircode.email; + +/* + This file is part of Safe email. + + Safe email is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + NetGuard is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with NetGuard. If not, see . + + Copyright 2018 by Marcel Bokhorst (M66B) +*/ + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ProgressBar; + +import java.util.List; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.Group; +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +public class FragmentOperations extends FragmentEx { + private RecyclerView rvOperation; + private ProgressBar pbWait; + private Group grpReady; + + private AdapterOperation adapter; + + @Override + @Nullable + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_operations, container, false); + + // Get controls + rvOperation = view.findViewById(R.id.rvOperation); + pbWait = view.findViewById(R.id.pbWait); + grpReady = view.findViewById(R.id.grpReady); + + // Wire controls + + rvOperation.setHasFixedSize(false); + LinearLayoutManager llm = new LinearLayoutManager(getContext()); + rvOperation.setLayoutManager(llm); + + adapter = new AdapterOperation(getContext()); + rvOperation.setAdapter(adapter); + + // Initialize + grpReady.setVisibility(View.GONE); + pbWait.setVisibility(View.VISIBLE); + + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + + // Observe folders + DB.getInstance(getContext()).operation().liveOperations().observe(getViewLifecycleOwner(), new Observer>() { + @Override + public void onChanged(@Nullable List operations) { + if (operations != null) + adapter.set(operations); + + pbWait.setVisibility(View.GONE); + grpReady.setVisibility(View.VISIBLE); + } + }); + } +} diff --git a/app/src/main/res/drawable-hdpi/baseline_list_black_18.png b/app/src/main/res/drawable-hdpi/baseline_list_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..26e40d8dfa5d3d2e0dadaca891ffd1e372b72f30 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^(jd&i1|)m0dm!gvF!b phsXo2Ka7^MR=OL1)c_jAz;MyD(y%03=qk_(22WQ%mvv4FO#p|{Da-%> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_list_black_24.png b/app/src/main/res/drawable-hdpi/baseline_list_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..094529c60463235c62677f579e1814be5b595b88 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBoIG6|Ln;{GUS?!tP~d61*tc!* z+h?Lo%!vl~9=A81*v`hJ@a~iDtG$&Q?VjANJ6)9@$5(NoLEkx5D|qIqkYz>;zhugd WuGhwDhJOK?#^CAd=d#Wzp$P!7S1LUK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_list_black_36.png b/app/src/main/res/drawable-hdpi/baseline_list_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..eb748fdb99a21a548da9c32ca862d17f722cbb64 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SO3?x5lH~9f6o&cW^S0D`srZ3H>0XfViL4Lsu z0uIMArpp7ls-7;6Ar*|t68{=+ThQ;S3{xL9|)SDp8 SlF42TGR)J}&t;ucLK6VuH6XG8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_list_black_48.png b/app/src/main/res/drawable-hdpi/baseline_list_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..d94b45a1ae2c927e5449fd3d66bbbda70c16ef8f GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xf3?%cF6|k1|%Oc%$NbBoIPC}Ln;{GUS?!tP~dU6*tc!* z+h^J?98OC2k_`-=nKRS{hZ?FqKeBDVbzxD!wMn=Ct^4z7!FK(}nW0BdtV~P3-pm7YIu6{1-oD!MMy@67>e^mO%eS?83{1OWFN8fX9j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_list_black_18.png b/app/src/main/res/drawable-mdpi/baseline_list_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..a16143bbf266e3a83697d612c24a465bd50287a3 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|1y2{pkP60R2?+x(wFbkc+6E4r l##wB=Rk>HPTMlY4Fx*&a#<=O;?+~C`22WQ%mvv4FO#n9A7X<(S literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_list_black_24.png b/app/src/main/res/drawable-mdpi/baseline_list_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..3d810945ff7b3007253aeae7ba226c7f5bba5e79 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjDxNNmAr*|t5>*KzJx%`wdLB$} o&dfg;z`VH7K#CnmaJexu*e{P?sJV@O5>P#Zr>mdKI;Vst0Oki6r2qf` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_list_black_36.png b/app/src/main/res/drawable-mdpi/baseline_list_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..094529c60463235c62677f579e1814be5b595b88 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBoIG6|Ln;{GUS?!tP~d61*tc!* z+h?Lo%!vl~9=A81*v`hJ@a~iDtG$&Q?VjANJ6)9@$5(NoLEkx5D|qIqkYz>;zhugd WuGhwDhJOK?#^CAd=d#Wzp$P!7S1LUK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_list_black_48.png b/app/src/main/res/drawable-mdpi/baseline_list_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..3351e6fbd862df92c866a3143c54fd07fcc5746d GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCQ%@JikP61PS2l7oFmNzCevgl; zj&=;X<4r literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_list_white_18.png b/app/src/main/res/drawable-mdpi/baseline_list_white_18.png new file mode 100755 index 0000000000000000000000000000000000000000..e44b03fa82d974155f65c31696af43a42e6560b1 GIT binary patch literal 92 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|WltB!kP60R2?hhMfB*m6Gqy~; p!QOE|ctz%g71!PNx=HjfF~t3lS4%Cw`U0q&!PC{xWt~$(69DBJ8jJt{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_list_white_24.png b/app/src/main/res/drawable-mdpi/baseline_list_white_24.png new file mode 100755 index 0000000000000000000000000000000000000000..61f9280d9d0b3a0cd3c822bb3440488b07481269 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY7Bp6QcFoXgrrjj7PU|k1|%Oc%$NbBoIPC}Ln;{GUS?!tP~dU6*tc!* z+h^J?98OC2k_`-=nKRS{hZ?FqKeBDVbzxD!wMn=Ct^4z7!FK(}nW0BdtV~P3-pm7YIu6{1-oD!M|k1|%Oc%$NbBoIG6|Ln;{GUS?!tP~d61*tc!* z+h?Lo%!vl~9=A81*v`hJ@a~iDtG$&Q?VjANJ6)9@$5(NoLEkx5D|qIqkYz>;zhugd WuGhwDhJOK?#^CAd=d#Wzp$P!7S1LUK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_list_black_24.png b/app/src/main/res/drawable-xhdpi/baseline_list_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..3351e6fbd862df92c866a3143c54fd07fcc5746d GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCQ%@JikP61PS2l7oFmNzCevgl; zj&=;X<4r literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_list_black_36.png b/app/src/main/res/drawable-xhdpi/baseline_list_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..d94b45a1ae2c927e5449fd3d66bbbda70c16ef8f GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xf3?%cF61AbV7iLc$gM#s4H(88)!*cbqUwT^^*{)78&q Iol`;+03FL8S^xk5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_list_white_18.png b/app/src/main/res/drawable-xhdpi/baseline_list_white_18.png new file mode 100755 index 0000000000000000000000000000000000000000..c865319759c034e3120999f7c4707515f8abc25b GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBoIPC}Ln;{GUS?!tP~dU6*tc!* z+h^J?98OC2k_`-=nKRS{hZ?FqKeBDVbzxD!wMn=Ct^4z7!FK(}nW0BdtV~P3-pm7YIu6{1-oD!MMy@67>e^mO%eS?83{1OWFN8fX9j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_list_white_48.png b/app/src/main/res/drawable-xhdpi/baseline_list_white_48.png new file mode 100755 index 0000000000000000000000000000000000000000..2a6d3b0449b8c59366b29c2209bb23e80325080c GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc@?O(%@xS>XdsLA^!WH|)|0G!%Hn8t^oG?pW9;DsV)z4*}Q$iB}k@*`j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_list_black_18.png b/app/src/main/res/drawable-xxhdpi/baseline_list_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..eb748fdb99a21a548da9c32ca862d17f722cbb64 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^W+2SO3?x5lH~9f6o&cW^S0D`srZ3H>0XfViL4Lsu z0uIMArpp7ls-7;6Ar*|t68{=+ThQ;S3{xL9|)SDp8 SlF42TGR)J}&t;ucLK6VuH6XG8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_list_black_24.png b/app/src/main/res/drawable-xxhdpi/baseline_list_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..d94b45a1ae2c927e5449fd3d66bbbda70c16ef8f GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xf3?%cF6My@67>e^mO%eS?83{1OWFN8fX9j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_list_white_36.png b/app/src/main/res/drawable-xxhdpi/baseline_list_white_36.png new file mode 100755 index 0000000000000000000000000000000000000000..5efe1938876b120e770000cac5454c3838cc4602 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^IUvl$3?x5s?2iLdJOMr-u0Z-f3|JhnUIFAYmjw9* zGdMIn-_G$H$hGoxaSW+oOkQ9q!MZp>#A9vLp#wX(M0FZZz5M_G;DImlqJJdBidz2q lSxWSNzgQs;CO|3~7?}Kj?h^bw#~o-2gQu&X%Q~loCIIy)H!%PJ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_list_white_48.png b/app/src/main/res/drawable-xxhdpi/baseline_list_white_48.png new file mode 100755 index 0000000000000000000000000000000000000000..eb80f8b18d9b9ec97a6d735c9ddba96227318337 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^6F`^|NHCnYy)O!+m`Z~Df*BafCZDwc@-#eM978G? zlMnE^9n_Fu{Z=pW=KtXX^B=04*c`~P;VU+f>R+57(!<2?)N6K%q~@k4Ad@^@{an^L HB{Ts5_$eSF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_list_black_18.png b/app/src/main/res/drawable-xxxhdpi/baseline_list_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..d94b45a1ae2c927e5449fd3d66bbbda70c16ef8f GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xf3?%cF61AbV7iLc$gM#s4H(88)!*cbqUwT^^*{)78&q Iol`;+03FL8S^xk5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_list_black_36.png b/app/src/main/res/drawable-xxxhdpi/baseline_list_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..7ddaf52530c1641292d726e0d0d3bb39a9f8f213 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^6F``e8A#skDEJMe*aCb)T!AzYEKT2e9!N2k1o;Is zI6S+N2IOdXx;TbZFeV@1bvvjb!TPOU;?4iV2j)LiH?cX8VZ&E!Al1J(L8OO?;i=c` U6iLlZPe2BFy85}Sb4q9e0Q|Tm82|tP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_list_black_48.png b/app/src/main/res/drawable-xxxhdpi/baseline_list_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..fc032a97a515f31a216bdda7ae64fc1faec16c0c GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvS8AxUb{c{0QYymzYu0R?HmZtAK52P4Ng8YIR z9G=}s19EgcT^vIy7~fuAD9FIT!EE>~UTT8}&x|MQR{dgbD4x0Z;K#}hi}`C8@Us{2 Yaz*O?mDilHq6K7_r>mdKI;Vst0AesEg8%>k literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_list_white_18.png b/app/src/main/res/drawable-xxxhdpi/baseline_list_white_18.png new file mode 100755 index 0000000000000000000000000000000000000000..4d2807e4ebe3f77a5b830c06d76082532d9a91de GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^9w5vJBp7O^^}Pa8OeH~n!3+##lh0ZJdE%Zfjv*C{ p$r5b~`u^Gr{8653n)QAHJHzX3N$>My@67>e^mO%eS?83{1OWFN8fX9j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_list_white_24.png b/app/src/main/res/drawable-xxxhdpi/baseline_list_white_24.png new file mode 100755 index 0000000000000000000000000000000000000000..2a6d3b0449b8c59366b29c2209bb23e80325080c GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc@?O(%@xS>XdsLA^!WH|)|0G!%Hn8t^oG?pW9;DsV)z4*}Q$iB}k@*`j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_list_white_36.png b/app/src/main/res/drawable-xxxhdpi/baseline_list_white_36.png new file mode 100755 index 0000000000000000000000000000000000000000..eb80f8b18d9b9ec97a6d735c9ddba96227318337 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^6F`^|NHCnYy)O!+m`Z~Df*BafCZDwc@-#eM978G? zlMnE^9n_Fu{Z=pW=KtXX^B=04*c`~P;VU+f>R+57(!<2?)N6K%q~@k4Ad@^@{an^L HB{Ts5_$eSF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_list_white_48.png b/app/src/main/res/drawable-xxxhdpi/baseline_list_white_48.png new file mode 100755 index 0000000000000000000000000000000000000000..c093cb177de8a8fdef769b19a0732d945fe0394b GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^2SAt+NHA0_4_pPLm`Z~Df*BafCZDwc@^n01978G? z-(FrQ$iTqCZ1^o+YJ&&Qj3?_>{bFt?p1Jqn$I1Q*POAU1!S71 LtDnm{r-UW|xlJOx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/baseline_list_24.xml b/app/src/main/res/drawable/baseline_list_24.xml new file mode 100755 index 00000000..555080ba --- /dev/null +++ b/app/src/main/res/drawable/baseline_list_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_operations.xml b/app/src/main/res/layout/fragment_operations.xml new file mode 100644 index 00000000..86d4d5fa --- /dev/null +++ b/app/src/main/res/layout/fragment_operations.xml @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/item_operation.xml b/app/src/main/res/layout/item_operation.xml new file mode 100644 index 00000000..6ab7587c --- /dev/null +++ b/app/src/main/res/layout/item_operation.xml @@ -0,0 +1,38 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fd711908..9191a3ec 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,6 +32,7 @@ \'%1$s\' failed Setup + Operations FAQ About