start using fabric for bug reporting
This commit is contained in:
parent
70dce6fc07
commit
5e31c1f643
|
@ -1,8 +1,18 @@
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
maven { url 'https://maven.fabric.io/public' }
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath 'io.fabric.tools:gradle:1.+'
|
||||||
|
}
|
||||||
|
}
|
||||||
import fr.avianey.androidsvgdrawable.gradle.SvgDrawableTask
|
import fr.avianey.androidsvgdrawable.gradle.SvgDrawableTask
|
||||||
|
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'io.fabric'
|
||||||
apply plugin: 'com.neenbedankt.android-apt'
|
apply plugin: 'com.neenbedankt.android-apt'
|
||||||
apply plugin: 'androidsvgdrawable'
|
apply plugin: 'androidsvgdrawable'
|
||||||
|
|
||||||
|
@ -52,6 +62,7 @@ android {
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
maven { url 'https://s3.amazonaws.com/repo.commonsware.com' }
|
maven { url 'https://s3.amazonaws.com/repo.commonsware.com' }
|
||||||
|
maven { url 'https://maven.fabric.io/public' }
|
||||||
flatDir { dirs "$projectDir/lib" }
|
flatDir { dirs "$projectDir/lib" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,13 +99,12 @@ dependencies {
|
||||||
compile 'org.apache.commons:commons-lang3:3.4'
|
compile 'org.apache.commons:commons-lang3:3.4'
|
||||||
compile 'commons-primitives:commons-primitives:1.0'
|
compile 'commons-primitives:commons-primitives:1.0'
|
||||||
compile 'com.bluelinelabs:logansquare:1.3.4'
|
compile 'com.bluelinelabs:logansquare:1.3.4'
|
||||||
compile 'ch.acra:acra:4.7.0'
|
|
||||||
compile 'org.jraf:android-switch-backport:2.0.1'
|
compile 'org.jraf:android-switch-backport:2.0.1'
|
||||||
compile 'com.github.FasterXML:jackson-jr-trees:5baf62567e'
|
compile 'com.github.FasterXML:jackson-jr-trees:5baf62567e'
|
||||||
compile 'com.makeramen:roundedimageview:2.1.1'
|
compile 'com.makeramen:roundedimageview:2.1.1'
|
||||||
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
|
compile 'com.soundcloud.android:android-crop:1.0.1@aar'
|
||||||
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1'
|
compile 'com.hannesdorfmann.parcelableplease:annotation:1.0.1'
|
||||||
compile 'com.github.mariotaku:PickNCrop:1dff3ed574'
|
compile 'com.github.mariotaku:PickNCrop:6c9d888a9d'
|
||||||
compile 'com.github.mariotaku.RestFu:library:0.9.8'
|
compile 'com.github.mariotaku.RestFu:library:0.9.8'
|
||||||
compile 'com.github.mariotaku.RestFu:okhttp:0.9.8'
|
compile 'com.github.mariotaku.RestFu:okhttp:0.9.8'
|
||||||
compile 'com.diogobernardino:williamchart:2.1'
|
compile 'com.diogobernardino:williamchart:2.1'
|
||||||
|
@ -114,6 +124,9 @@ dependencies {
|
||||||
compile fileTree(dir: 'libs/main', include: ['*.jar'])
|
compile fileTree(dir: 'libs/main', include: ['*.jar'])
|
||||||
provided 'javax.annotation:jsr250-api:1.0'
|
provided 'javax.annotation:jsr250-api:1.0'
|
||||||
// googleCompile fileTree(dir: 'libs/google', include: ['*.jar'])
|
// googleCompile fileTree(dir: 'libs/google', include: ['*.jar'])
|
||||||
|
compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
|
||||||
|
transitive = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
task svgToDrawable(type: SvgDrawableTask) {
|
task svgToDrawable(type: SvgDrawableTask) {
|
||||||
|
|
|
@ -77,6 +77,10 @@
|
||||||
android:name="com.sec.android.app.multiwindow"
|
android:name="com.sec.android.app.multiwindow"
|
||||||
android:required="false"/>
|
android:required="false"/>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="io.fabric.ApiKey"
|
||||||
|
android:value="dc4ee756d3b705e00011782f1426fc8656ad3bd9" />
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="com.google.android.backup.api_key"
|
android:name="com.google.android.backup.api_key"
|
||||||
android:value="AEdPqrEAAAAIKbKATV1AGbLB4kem3w8QaPVJSPVVumbMHxkfwA"/>
|
android:value="AEdPqrEAAAAIKbKATV1AGbLB4kem3w8QaPVJSPVVumbMHxkfwA"/>
|
||||||
|
|
|
@ -23,7 +23,9 @@ import android.content.res.Resources;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.v4.view.MarginLayoutParamsCompat;
|
||||||
import android.support.v4.view.ViewCompat;
|
import android.support.v4.view.ViewCompat;
|
||||||
|
import android.support.v4.view.WindowCompat;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
|
||||||
|
@ -61,11 +63,11 @@ public class ImageCropperActivity extends CropImageActivity implements IThemedAc
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(final Bundle icicle) {
|
public void onCreate(final Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
|
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
|
||||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||||
}
|
}
|
||||||
super.onCreate(icicle);
|
|
||||||
final int themeColor = getThemeColor();
|
final int themeColor = getThemeColor();
|
||||||
final int themeResId = getCurrentThemeResourceId();
|
final int themeResId = getCurrentThemeResourceId();
|
||||||
final String backgroundOption = getCurrentThemeBackgroundOption();
|
final String backgroundOption = getCurrentThemeBackgroundOption();
|
||||||
|
|
|
@ -1114,9 +1114,8 @@ public class ComposeActivity extends ThemedFragmentActivity implements OnMenuIte
|
||||||
* Has media & Not reply: [Take photo][Media menu][Attach location][Drafts]
|
* Has media & Not reply: [Take photo][Media menu][Attach location][Drafts]
|
||||||
* Is reply: [Media menu][View status][Attach location][Drafts]
|
* Is reply: [Media menu][View status][Attach location][Drafts]
|
||||||
*/
|
*/
|
||||||
MenuUtils.setMenuItemAvailability(menu, R.id.take_photo, hasInReplyTo);
|
MenuUtils.setMenuItemAvailability(menu, R.id.add_image, !hasMedia);
|
||||||
MenuUtils.setMenuItemAvailability(menu, R.id.add_image, !hasMedia && !hasInReplyTo);
|
MenuUtils.setMenuItemAvailability(menu, R.id.media_menu, hasMedia);
|
||||||
MenuUtils.setMenuItemAvailability(menu, R.id.media_menu, hasMedia || hasInReplyTo);
|
|
||||||
MenuUtils.setMenuItemAvailability(menu, R.id.toggle_sensitive, hasMedia);
|
MenuUtils.setMenuItemAvailability(menu, R.id.toggle_sensitive, hasMedia);
|
||||||
MenuUtils.setMenuItemAvailability(menu, R.id.link_to_quoted_status, isQuote());
|
MenuUtils.setMenuItemAvailability(menu, R.id.link_to_quoted_status, isQuote());
|
||||||
MenuUtils.setMenuItemAvailability(menu, R.id.schedule, isScheduleSupported());
|
MenuUtils.setMenuItemAvailability(menu, R.id.schedule, isScheduleSupported());
|
||||||
|
|
|
@ -435,6 +435,11 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
if (ThemeUtils.isDarkTheme(getCurrentThemeResourceId())) {
|
||||||
|
// TODO show dark bar
|
||||||
|
} else {
|
||||||
|
ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null, getThemeColor()));
|
||||||
|
}
|
||||||
sendBroadcast(new Intent(BROADCAST_HOME_ACTIVITY_ONRESUME));
|
sendBroadcast(new Intent(BROADCAST_HOME_ACTIVITY_ONRESUME));
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
updateActionsButtonStyle();
|
updateActionsButtonStyle();
|
||||||
|
@ -794,7 +799,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
|
||||||
mTabIndicator.setStripColor(contrastColor);
|
mTabIndicator.setStripColor(contrastColor);
|
||||||
mTabIndicator.setIconColor(contrastColor);
|
mTabIndicator.setIconColor(contrastColor);
|
||||||
mTabIndicator.setLabelColor(contrastColor);
|
mTabIndicator.setLabelColor(contrastColor);
|
||||||
ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null, themeColor));
|
|
||||||
}
|
}
|
||||||
mHomeContent.setDrawColor(true);
|
mHomeContent.setDrawColor(true);
|
||||||
mHomeContent.setDrawShadow(false);
|
mHomeContent.setDrawShadow(false);
|
||||||
|
|
|
@ -237,7 +237,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
|
||||||
}
|
}
|
||||||
mMainContent.setOnFitSystemWindowsListener(this);
|
mMainContent.setOnFitSystemWindowsListener(this);
|
||||||
setStatusBarColor(linkId, data);
|
setStatusBarColor(linkId, data);
|
||||||
setTaskInfo(linkId, data);
|
|
||||||
Utils.logOpenNotificationFromUri(this, data);
|
Utils.logOpenNotificationFromUri(this, data);
|
||||||
if (!showFragment(linkId, data)) {
|
if (!showFragment(linkId, data)) {
|
||||||
finish();
|
finish();
|
||||||
|
@ -395,21 +394,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
|
||||||
StatusBarProxy.setStatusBarDarkIcon(getWindow(), TwidereColorUtils.getYIQLuminance(statusBarColor) > ThemeUtils.ACCENT_COLOR_THRESHOLD);
|
StatusBarProxy.setStatusBarDarkIcon(getWindow(), TwidereColorUtils.getYIQLuminance(statusBarColor) > ThemeUtils.ACCENT_COLOR_THRESHOLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setTaskInfo(int linkId, Uri uri) {
|
|
||||||
switch (linkId) {
|
|
||||||
// case LINK_ID_USER: {
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
default: {
|
|
||||||
if (ThemeUtils.isColoredActionBar(getCurrentThemeResourceId())) {
|
|
||||||
ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null,
|
|
||||||
getCurrentThemeColor()));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean showFragment(final int linkId, final Uri uri) {
|
private boolean showFragment(final int linkId, final Uri uri) {
|
||||||
final Intent intent = getIntent();
|
final Intent intent = getIntent();
|
||||||
intent.setExtrasClassLoader(getClassLoader());
|
intent.setExtrasClassLoader(getClassLoader());
|
||||||
|
@ -589,6 +573,15 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
|
||||||
return mActionBarHeight = ThemeUtils.getActionBarHeight(this);
|
return mActionBarHeight = ThemeUtils.getActionBarHeight(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
if (ThemeUtils.isColoredActionBar(getCurrentThemeResourceId())) {
|
||||||
|
ActivitySupport.setTaskDescription(this, new TaskDescriptionCompat(null, null,
|
||||||
|
getCurrentThemeColor()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ActionBarContainer getActionBarContainer() {
|
public ActionBarContainer getActionBarContainer() {
|
||||||
return mActionBarContainer;
|
return mActionBarContainer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,6 @@ import com.nostra13.universalimageloader.cache.disc.DiskCache;
|
||||||
import com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache;
|
import com.nostra13.universalimageloader.cache.disc.impl.ext.LruDiskCache;
|
||||||
import com.squareup.okhttp.Dns;
|
import com.squareup.okhttp.Dns;
|
||||||
|
|
||||||
import org.acra.annotation.ReportsCrashes;
|
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
import org.mariotaku.twidere.BuildConfig;
|
import org.mariotaku.twidere.BuildConfig;
|
||||||
import org.mariotaku.twidere.Constants;
|
import org.mariotaku.twidere.Constants;
|
||||||
|
@ -67,9 +66,6 @@ import static org.mariotaku.twidere.util.Utils.getInternalCacheDir;
|
||||||
import static org.mariotaku.twidere.util.Utils.initAccountColor;
|
import static org.mariotaku.twidere.util.Utils.initAccountColor;
|
||||||
import static org.mariotaku.twidere.util.Utils.startRefreshServiceIfNeeded;
|
import static org.mariotaku.twidere.util.Utils.startRefreshServiceIfNeeded;
|
||||||
|
|
||||||
@ReportsCrashes(formUri = "https://twidere-bugreport.herokuapp.com/reports",
|
|
||||||
buildConfigClass = BuildConfig.class, sendReportsInDevMode = false,
|
|
||||||
sendReportsAtShutdown = false)
|
|
||||||
public class TwidereApplication extends MultiDexApplication implements Constants,
|
public class TwidereApplication extends MultiDexApplication implements Constants,
|
||||||
OnSharedPreferenceChangeListener {
|
OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,14 @@ public final class AsyncTaskManager {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void cancel(final String tag) {
|
||||||
|
for (final ManagedAsyncTask<?, ?, ?> task : getTaskSpecList()) {
|
||||||
|
if (tag.equals(task.getTag())) {
|
||||||
|
task.cancel(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isExecuting(final int hashCode) {
|
public boolean isExecuting(final int hashCode) {
|
||||||
final ManagedAsyncTask<?, ?, ?> task = findTask(hashCode);
|
final ManagedAsyncTask<?, ?, ?> task = findTask(hashCode);
|
||||||
return task != null && task.getStatus() == AsyncTask.Status.RUNNING;
|
return task != null && task.getStatus() == AsyncTask.Status.RUNNING;
|
||||||
|
|
|
@ -20,14 +20,16 @@
|
||||||
package org.mariotaku.twidere.util;
|
package org.mariotaku.twidere.util;
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import org.acra.ACRA;
|
import com.crashlytics.android.Crashlytics;
|
||||||
|
|
||||||
import org.mariotaku.twidere.BuildConfig;
|
import org.mariotaku.twidere.BuildConfig;
|
||||||
import org.mariotaku.twidere.Constants;
|
import org.mariotaku.twidere.Constants;
|
||||||
|
|
||||||
|
import io.fabric.sdk.android.Fabric;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by mariotaku on 15/7/8.
|
* Created by mariotaku on 15/7/8.
|
||||||
*/
|
*/
|
||||||
|
@ -58,28 +60,12 @@ public class TwidereBugReporter extends BugReporter implements Constants {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleSilentException(final Throwable throwable) {
|
private void handleSilentException(final Throwable throwable) {
|
||||||
AsyncTask.execute(new Runnable() {
|
Crashlytics.logException(throwable);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
ACRA.getErrorReporter().handleSilentException(throwable);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void initImpl(final Application application) {
|
protected void initImpl(final Application application) {
|
||||||
// ACRA sets it self as DefaultUncaughtExceptionHandler, we hijack it to suppress some errors
|
Fabric.with(application, new Crashlytics());
|
||||||
ACRA.init(application);
|
|
||||||
// handler should be ACRA's ErrorReporter now
|
|
||||||
final Thread.UncaughtExceptionHandler handler = Thread.getDefaultUncaughtExceptionHandler();
|
|
||||||
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
|
|
||||||
@Override
|
|
||||||
public void uncaughtException(Thread thread, Throwable ex) {
|
|
||||||
// We can't fix OOM, so just don't report it and try to save VM
|
|
||||||
if (Utils.isOutOfMemory(ex)) return;
|
|
||||||
handler.uncaughtException(thread, ex);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,6 @@ import android.net.SSLCertificateSocketFactory;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.annotation.UiThread;
|
|
||||||
import android.support.annotation.WorkerThread;
|
import android.support.annotation.WorkerThread;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.webkit.URLUtil;
|
import android.webkit.URLUtil;
|
||||||
|
@ -144,11 +143,12 @@ public class TwitterAPIFactory implements TwidereConstants {
|
||||||
final boolean enableProxy = prefs.getBoolean(KEY_ENABLE_PROXY, false);
|
final boolean enableProxy = prefs.getBoolean(KEY_ENABLE_PROXY, false);
|
||||||
|
|
||||||
client.setConnectTimeout(connectionTimeout, TimeUnit.SECONDS);
|
client.setConnectTimeout(connectionTimeout, TimeUnit.SECONDS);
|
||||||
final long connectionTimeoutMillis = TimeUnit.MILLISECONDS.convert(connectionTimeout, TimeUnit.SECONDS);
|
client.setReadTimeout(0, TimeUnit.SECONDS);
|
||||||
|
client.setWriteTimeout(0, TimeUnit.SECONDS);
|
||||||
final SSLSocketFactory sslSocketFactory;
|
final SSLSocketFactory sslSocketFactory;
|
||||||
if (ignoreSslError) {
|
if (ignoreSslError) {
|
||||||
// We intentionally use insecure connections
|
// We intentionally use insecure connections
|
||||||
sslSocketFactory = SSLCertificateSocketFactory.getInsecure((int) connectionTimeoutMillis, null);
|
sslSocketFactory = SSLCertificateSocketFactory.getInsecure(0, null);
|
||||||
if (sslSocketFactory instanceof SSLCertificateSocketFactory) {
|
if (sslSocketFactory instanceof SSLCertificateSocketFactory) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,7 +81,8 @@ public class VideoLoader {
|
||||||
|
|
||||||
public int loadVideo(String uri, boolean forceReload, VideoLoadingListener listener) {
|
public int loadVideo(String uri, boolean forceReload, VideoLoadingListener listener) {
|
||||||
if (mTaskManager.hasRunningTasksForTag(uri)) {
|
if (mTaskManager.hasRunningTasksForTag(uri)) {
|
||||||
return 0;
|
if (!forceReload) return 0;
|
||||||
|
mTaskManager.cancel(uri);
|
||||||
}
|
}
|
||||||
return mTaskManager.add(new PreLoadVideoTask(mContext, this, listener, uri, forceReload), true);
|
return mTaskManager.add(new PreLoadVideoTask(mContext, this, listener, uri, forceReload), true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,7 +223,7 @@ public class TwidereDns implements Constants, Dns {
|
||||||
for (final Record record : records) {
|
for (final Record record : records) {
|
||||||
if (record instanceof CNAMERecord)
|
if (record instanceof CNAMERecord)
|
||||||
return resolveInternal(originalHost, ((CNAMERecord) record).getTarget().toString(),
|
return resolveInternal(originalHost, ((CNAMERecord) record).getTarget().toString(),
|
||||||
+1);
|
depth + 1);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -801,6 +801,7 @@
|
||||||
<string name="report_usage_statistics_now">Report usage statistics now</string>
|
<string name="report_usage_statistics_now">Report usage statistics now</string>
|
||||||
<string name="cache_size_limit">Cache size limit</string>
|
<string name="cache_size_limit">Cache size limit</string>
|
||||||
<string name="bug_reports">Bug reports</string>
|
<string name="bug_reports">Bug reports</string>
|
||||||
|
<string name="bug_reports_summary">Powered by Fabric</string>
|
||||||
<string name="invalid_consumer_key">Invalid consumer key</string>
|
<string name="invalid_consumer_key">Invalid consumer key</string>
|
||||||
<string name="invalid_consumer_secret">Invalid consumer secret</string>
|
<string name="invalid_consumer_secret">Invalid consumer secret</string>
|
||||||
<string name="page_up">Page up</string>
|
<string name="page_up">Page up</string>
|
||||||
|
|
|
@ -19,19 +19,20 @@
|
||||||
|
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<Preference android:layout="@layout/header_usage_statistics" />
|
<Preference android:layout="@layout/header_usage_statistics"/>
|
||||||
|
|
||||||
<org.mariotaku.twidere.preference.AutoFixCheckBoxPreference
|
<org.mariotaku.twidere.preference.AutoFixCheckBoxPreference
|
||||||
android:defaultValue="false"
|
android:defaultValue="false"
|
||||||
android:key="usage_statistics"
|
android:key="usage_statistics"
|
||||||
android:order="11"
|
android:order="11"
|
||||||
android:title="@string/usage_statistics" />
|
android:title="@string/usage_statistics"/>
|
||||||
|
|
||||||
<org.mariotaku.twidere.preference.AutoFixCheckBoxPreference
|
<org.mariotaku.twidere.preference.AutoFixCheckBoxPreference
|
||||||
android:defaultValue="true"
|
android:defaultValue="true"
|
||||||
android:key="bug_reports"
|
android:key="bug_reports"
|
||||||
android:order="12"
|
android:order="12"
|
||||||
android:title="@string/bug_reports" />
|
android:summary="@string/bug_reports_summary"
|
||||||
|
android:title="@string/bug_reports"/>
|
||||||
|
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:order="13"
|
android:order="13"
|
||||||
|
@ -40,7 +41,7 @@
|
||||||
<Preference android:title="@string/research_hot_mobile">
|
<Preference android:title="@string/research_hot_mobile">
|
||||||
<intent
|
<intent
|
||||||
android:action="android.intent.action.VIEW"
|
android:action="android.intent.action.VIEW"
|
||||||
android:data="http://spice.hot-mobile.org/" />
|
android:data="http://spice.hot-mobile.org/"/>
|
||||||
</Preference>
|
</Preference>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue