Initial file logging

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2019-05-31 12:46:49 +02:00
parent 63360a63e9
commit ef2d1b8c92
8 changed files with 152 additions and 14 deletions

View File

@ -162,9 +162,9 @@ dependencies {
implementation 'com.bluelinelabs:conductor:2.1.5' implementation 'com.bluelinelabs:conductor:2.1.5'
implementation 'com.bluelinelabs:conductor-support:2.1.5' implementation 'com.bluelinelabs:conductor-support:2.1.5'
implementation 'com.squareup.okhttp3:okhttp:3.13.1' implementation 'com.squareup.okhttp3:okhttp:3.14.2'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.13.1' implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.13.1' implementation 'com.squareup.okhttp3:logging-interceptor:3.14.2'
implementation 'com.bluelinelabs:logansquare:1.3.7' implementation 'com.bluelinelabs:logansquare:1.3.7'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.8' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.8'

View File

@ -99,5 +99,18 @@
<service <service
android:exported="false" android:exported="false"
android:name="com.novoda.merlin.MerlinService" /> android:name="com.novoda.merlin.MerlinService" />
<provider
android:name="androidx.core.content.FileProvider"
android:grantUriPermissions="true"
android:exported="false"
android:authorities="${applicationId}">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths"/>
</provider>
</application> </application>
</manifest> </manifest>

View File

@ -183,7 +183,7 @@ public class NextcloudTalkApplication extends MultiDexApplication implements Lif
.busModule(new BusModule()) .busModule(new BusModule())
.contextModule(new ContextModule(getApplicationContext())) .contextModule(new ContextModule(getApplicationContext()))
.databaseModule(new DatabaseModule()) .databaseModule(new DatabaseModule())
.restModule(new RestModule()) .restModule(new RestModule(getApplicationContext()))
.userModule(new UserModule()) .userModule(new UserModule())
.arbitraryStorageModule(new ArbitraryStorageModule()) .arbitraryStorageModule(new ArbitraryStorageModule())
.build(); .build();

View File

@ -44,6 +44,7 @@ import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager; import androidx.work.WorkManager;
import autodagger.AutoInjector; import autodagger.AutoInjector;
import butterknife.BindView; import butterknife.BindView;
import butterknife.OnClick;
import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.RouterTransaction;
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler; import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler;
@ -59,10 +60,7 @@ import com.nextcloud.talk.controllers.base.BaseController;
import com.nextcloud.talk.jobs.AccountRemovalWorker; import com.nextcloud.talk.jobs.AccountRemovalWorker;
import com.nextcloud.talk.models.RingtoneSettings; import com.nextcloud.talk.models.RingtoneSettings;
import com.nextcloud.talk.models.database.UserEntity; import com.nextcloud.talk.models.database.UserEntity;
import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.*;
import com.nextcloud.talk.utils.DisplayUtils;
import com.nextcloud.talk.utils.DoNotDisturbUtils;
import com.nextcloud.talk.utils.SecurityUtils;
import com.nextcloud.talk.utils.bundle.BundleKeys; import com.nextcloud.talk.utils.bundle.BundleKeys;
import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.database.user.UserUtils;
import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.preferences.AppPreferences;
@ -321,6 +319,13 @@ public class SettingsController extends BaseController {
} }
} }
@OnClick(R.id.settings_version)
void sendLogs() {
if (getResources().getBoolean(R.bool.nc_is_debug)) {
LoggingUtils.sendMailWithAttachment(context);
}
}
@Override @Override
protected void onSaveViewState(@NonNull View view, @NonNull Bundle outState) { protected void onSaveViewState(@NonNull View view, @NonNull Bundle outState) {
saveStateHandler.saveInstanceState(outState); saveStateHandler.saveInstanceState(outState);

View File

@ -20,15 +20,18 @@
*/ */
package com.nextcloud.talk.dagger.modules; package com.nextcloud.talk.dagger.modules;
import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.github.aurae.retrofit2.LoganSquareConverterFactory; import com.github.aurae.retrofit2.LoganSquareConverterFactory;
import com.nextcloud.talk.BuildConfig; import com.nextcloud.talk.BuildConfig;
import com.nextcloud.talk.R;
import com.nextcloud.talk.api.NcApi; import com.nextcloud.talk.api.NcApi;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.ApiUtils;
import com.nextcloud.talk.utils.LoggingUtils;
import com.nextcloud.talk.utils.database.user.UserUtils; import com.nextcloud.talk.utils.database.user.UserUtils;
import com.nextcloud.talk.utils.preferences.AppPreferences; import com.nextcloud.talk.utils.preferences.AppPreferences;
import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder; import com.nextcloud.talk.utils.singletons.AvatarStatusCodeHolder;
@ -62,6 +65,11 @@ import java.util.concurrent.TimeUnit;
public class RestModule { public class RestModule {
private static final String TAG = "RestModule"; private static final String TAG = "RestModule";
private final Context context;
public RestModule(Context context) {
this.context = context;
}
@Singleton @Singleton
@Provides @Provides
@ -179,12 +187,6 @@ public class RestModule {
httpClient.cookieJar(new JavaNetCookieJar(cookieManager)); httpClient.cookieJar(new JavaNetCookieJar(cookieManager));
httpClient.cache(cache); httpClient.cache(cache);
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
httpClient.addInterceptor(loggingInterceptor);
}
// Trust own CA and all self-signed certs // Trust own CA and all self-signed certs
httpClient.sslSocketFactory(sslSocketFactoryCompat, magicTrustManager); httpClient.sslSocketFactory(sslSocketFactoryCompat, magicTrustManager);
httpClient.retryOnConnectionFailure(true); httpClient.retryOnConnectionFailure(true);
@ -205,6 +207,23 @@ public class RestModule {
httpClient.addInterceptor(new HeadersInterceptor()); httpClient.addInterceptor(new HeadersInterceptor());
if (BuildConfig.DEBUG && !context.getResources().getBoolean(R.bool.nc_is_debug)) {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
loggingInterceptor.redactHeader("Authorization");
loggingInterceptor.redactHeader("Proxy-Authorization");
httpClient.addInterceptor(loggingInterceptor);
} else if (context.getResources().getBoolean(R.bool.nc_is_debug)) {
HttpLoggingInterceptor.Logger fileLogger =
s -> LoggingUtils.writeLogEntryToFile(context, s);
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(fileLogger);
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
loggingInterceptor.redactHeader("Authorization");
loggingInterceptor.redactHeader("Proxy-Authorization");
httpClient.addInterceptor(loggingInterceptor);
}
return httpClient.build(); return httpClient.build();
} }

View File

@ -0,0 +1,77 @@
/*
* Nextcloud Talk application
*
* @author Mario Danic
* Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.com>
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.nextcloud.talk.utils;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import androidx.core.content.FileProvider;
import com.nextcloud.talk.BuildConfig;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LoggingUtils {
public static void writeLogEntryToFile(Context context, String logEntry) {
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
String logEntryWithDateTime = dateFormat.format(date) + ": " + logEntry + "\n";
try {
FileOutputStream outputStream = context.openFileOutput("nc_log.txt",
Context.MODE_PRIVATE | Context.MODE_APPEND);
outputStream.write(logEntryWithDateTime.getBytes());
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void sendMailWithAttachment(Context context) {
File logFile = context.getFileStreamPath("nc_log.txt");
Intent emailIntent = new Intent(Intent.ACTION_SEND);
String mailto = "mario@nextcloud.com";
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{mailto});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Talk logs");
emailIntent.setType("text/plain");
emailIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
uri = Uri.fromFile(logFile);
} else {
uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, logFile);
}
emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(emailIntent);
}
}

View File

@ -23,6 +23,7 @@
<!-- Set before a release --> <!-- Set before a release -->
<string name="nc_talk_database_encryption_key" translatable="false">HvAfHtAy/QdFYqAWFFXa1VV_Iv6ZQ1.tf5swMc^45wS_vz=Wm[oyRP5D-</string> <string name="nc_talk_database_encryption_key" translatable="false">HvAfHtAy/QdFYqAWFFXa1VV_Iv6ZQ1.tf5swMc^45wS_vz=Wm[oyRP5D-</string>
<string name="nc_talk_login_scheme" translatable="false">nc</string> <string name="nc_talk_login_scheme" translatable="false">nc</string>
<bool name="nc_is_debug">true</bool>
<string name="nc_app_name">Nextcloud Talk</string> <string name="nc_app_name">Nextcloud Talk</string>
<string name="nc_server_product_name">Nextcloud</string> <string name="nc_server_product_name">Nextcloud</string>

View File

@ -0,0 +1,23 @@
<!--
~ Nextcloud Talk application
~
~ @author Mario Danic
~ Copyright (C) 2017-2019 Mario Danic <mario@lovelyhq.com>
~
~ This program 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.
~
~ This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
-->
<paths>
<files-path name="files" path="/" />
</paths>