Implement sending logs to developer (#190)
* Save logs to a file * Send logs via email * Enable network logs in release builds * Remove useless chooser title * Append to logs file and ignore I/O errors * Ensure email and password are not logged * Ensure base URL is never logged * Add logs disclaimer
This commit is contained in:
11
app/src/main/res/drawable/ic_send.xml
Normal file
11
app/src/main/res/drawable/ic_send.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960"
|
||||
android:tint="?attr/colorControlNormal"
|
||||
android:autoMirrored="true">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M120,800L120,160L880,480L120,800ZM200,680L674,480L200,280L200,420L440,480L200,540L200,680ZM200,680L200,480L200,280L200,420L200,420L200,540L200,540L200,680Z" />
|
||||
</vector>
|
||||
@@ -1,46 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.drawerlayout.widget.DrawerLayout 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/drawer"
|
||||
style="?drawerLayoutStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.activity.MainActivity">
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/drawer"
|
||||
style="?drawerLayoutStyle"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".ui.activity.MainActivity">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<gq.kirmanak.mealient.ui.activity.ToolbarView
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/margin_medium"
|
||||
android:background="@drawable/bg_toolbar"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
<gq.kirmanak.mealient.ui.activity.ToolbarView
|
||||
android:id="@+id/toolbar"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="@dimen/margin_medium"
|
||||
android:background="@drawable/bg_toolbar"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
<androidx.fragment.app.FragmentContainerView
|
||||
android:id="@+id/nav_host"
|
||||
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="@dimen/margin_small"
|
||||
app:defaultNavHost="true"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/toolbar"
|
||||
tools:layout="@layout/fragment_recipes_list" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
<androidx.fragment.app.FragmentContainerView
|
||||
android:id="@+id/nav_host"
|
||||
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="0dp"
|
||||
android:layout_marginTop="@dimen/margin_small"
|
||||
app:defaultNavHost="true"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/toolbar" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
<com.google.android.material.navigation.NavigationView
|
||||
android:id="@+id/navigation_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="start"
|
||||
app:headerLayout="@layout/view_navigation_drawer_header"
|
||||
app:menu="@menu/navigation_menu" />
|
||||
<com.google.android.material.navigation.NavigationView
|
||||
android:id="@+id/navigation_view"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="start"
|
||||
app:headerLayout="@layout/view_navigation_drawer_header"
|
||||
app:menu="@menu/navigation_menu" />
|
||||
</androidx.drawerlayout.widget.DrawerLayout>
|
||||
|
||||
@@ -1,38 +1,43 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item
|
||||
android:id="@+id/recipes_list"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_list"
|
||||
android:title="@string/menu_navigation_drawer_recipes_list" />
|
||||
<item
|
||||
android:id="@+id/recipes_list"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_list"
|
||||
android:title="@string/menu_navigation_drawer_recipes_list" />
|
||||
|
||||
<item
|
||||
android:id="@+id/add_recipe"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_add"
|
||||
android:title="@string/menu_navigation_drawer_add_recipe" />
|
||||
<item
|
||||
android:id="@+id/add_recipe"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_add"
|
||||
android:title="@string/menu_navigation_drawer_add_recipe" />
|
||||
|
||||
<item
|
||||
android:id="@+id/shopping_lists"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_shopping_cart"
|
||||
android:title="@string/menu_navigation_drawer_shopping_lists" />
|
||||
<item
|
||||
android:id="@+id/shopping_lists"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_shopping_cart"
|
||||
android:title="@string/menu_navigation_drawer_shopping_lists" />
|
||||
|
||||
<item
|
||||
android:id="@+id/change_url"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_change"
|
||||
android:title="@string/menu_navigation_drawer_change_url" />
|
||||
<item
|
||||
android:id="@+id/change_url"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_change"
|
||||
android:title="@string/menu_navigation_drawer_change_url" />
|
||||
|
||||
<item
|
||||
android:id="@+id/login"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_login"
|
||||
android:title="@string/menu_navigation_drawer_login" />
|
||||
<item
|
||||
android:id="@+id/login"
|
||||
android:checkable="true"
|
||||
android:icon="@drawable/ic_login"
|
||||
android:title="@string/menu_navigation_drawer_login" />
|
||||
|
||||
<item
|
||||
android:id="@+id/logout"
|
||||
android:icon="@drawable/ic_logout"
|
||||
android:title="@string/menu_navigation_drawer_logout" />
|
||||
<item
|
||||
android:id="@+id/logout"
|
||||
android:icon="@drawable/ic_logout"
|
||||
android:title="@string/menu_navigation_drawer_logout" />
|
||||
|
||||
<item
|
||||
android:id="@+id/email_logs"
|
||||
android:icon="@drawable/ic_send"
|
||||
android:title="@string/menu_navigation_drawer_email_logs" />
|
||||
|
||||
</menu>
|
||||
@@ -73,4 +73,10 @@
|
||||
<string name="fragment_recipes_favorite_added">Added %1$s to favorites</string>
|
||||
<string name="fragment_recipes_favorite_removed">Removed %1$s from favorites</string>
|
||||
<string name="menu_navigation_drawer_shopping_lists">Shopping lists</string>
|
||||
<string name="menu_navigation_drawer_email_logs">Email logs</string>
|
||||
<string name="activity_main_email_logs_subject">Mealient logs</string>
|
||||
<string name="activity_main_email_logs_confirmation_message">The logs contain sensitive data such as API token, shopping lists, and recipes. API tokens can be revoked using web client. The file can be viewed and edited if you send it to yourself instead.</string>
|
||||
<string name="activity_main_email_logs_confirmation_title">Sending sensitive data</string>
|
||||
<string name="activity_main_email_logs_confirmation_positive">Choose how to send</string>
|
||||
<string name="activity_main_email_logs_confirmation_negative">Cancel</string>
|
||||
</resources>
|
||||
6
app/src/main/res/xml/file_provider_paths.xml
Normal file
6
app/src/main/res/xml/file_provider_paths.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths>
|
||||
<files-path
|
||||
path="."
|
||||
name="log.txt" />
|
||||
</paths>
|
||||
Reference in New Issue
Block a user