/*
* Copyright (c) 2013 Menny Even-Danan
*
* 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 com.anysoftkeyboard.ui;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.anysoftkeyboard.ui.dev.LogCatViewFragment;
import com.anysoftkeyboard.utils.Log;
import com.menny.android.anysoftkeyboard.BuildConfig;
import com.menny.android.anysoftkeyboard.R;
public class SendBugReportUiActivity extends FragmentActivity {
public static class BugReportDetails implements Parcelable {
public final Throwable throwable;
public final String crashReportText;
public BugReportDetails(Throwable throwable, String crashReportText) {
this.throwable = throwable;
this.crashReportText = crashReportText;
}
// Start of Parcel part
public BugReportDetails(Parcel in){
throwable = (Throwable) in.readSerializable();
crashReportText = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeSerializable(throwable);
dest.writeString(crashReportText);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public BugReportDetails createFromParcel(Parcel in) {
return new BugReportDetails(in);
}
public BugReportDetails[] newArray(int size) {
return new BugReportDetails[size];
}
};
@Override
public int describeContents() {
return 0;
}
//End of Parcel part
}
private static final String TAG = "ASK_BUG_SENDER";
public static final String EXTRA_KEY_BugReportDetails = "EXTRA_KEY_BugReportDetails";
private BugReportDetails mCrashReportDetails;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.send_crash_log_ui);
}
@Override
protected void onStart() {
super.onStart();
TextView crashTypeView = (TextView) findViewById(R.id.ime_crash_type);
Intent callingIntent = getIntent();
mCrashReportDetails = callingIntent.getParcelableExtra(EXTRA_KEY_BugReportDetails);
if (mCrashReportDetails == null) {
if (BuildConfig.DEBUG)
throw new IllegalArgumentException("Activity started without " + EXTRA_KEY_BugReportDetails + " extra!");
finish();
} else {
if (mCrashReportDetails.throwable == null || (!BuildConfig.DEBUG)) {
/*not showing the type of crash in RELEASE mode*/
crashTypeView.setVisibility(View.GONE);
} else {
Throwable throwable = mCrashReportDetails.throwable;
String typeText = throwable.getClass().getName();
if (!TextUtils.isEmpty(throwable.getMessage()))
typeText += ": " + throwable.getMessage();
StackTraceElement[] stackTrace = throwable.getStackTrace();
if (stackTrace != null && stackTrace.length > 0) {
typeText += "\n";
typeText += "Thrown at " + stackTrace[0].toString();
for (int i=1; i<Math.min(3, stackTrace.length); i++) {
typeText += "\n"+stackTrace[i].toString();
}
}
crashTypeView.setText(typeText);
}
}
}
public void onClickOnType(View v) {
findViewById(R.id.logcat_fragment_container).setVisibility(View.VISIBLE);
getSupportFragmentManager().beginTransaction()
.replace(R.id.logcat_fragment_container, new LogCatViewFragment())
.commit();
}
public void onCancelCrashReport(View v) {
finish();
}
public void onSendCrashReport(View v) {
String[] recipients = new String[]{BuildConfig.CRASH_REPORT_EMAIL_ADDRESS};
Intent sendMail = new Intent();
sendMail.setAction(Intent.ACTION_SEND);
sendMail.setType("plain/text");
sendMail.putExtra(Intent.EXTRA_EMAIL, recipients);
sendMail.putExtra(Intent.EXTRA_SUBJECT, getText(R.string.ime_crashed_title));
sendMail.putExtra(Intent.EXTRA_TEXT, mCrashReportDetails.crashReportText);
try {
Intent sender = Intent.createChooser(sendMail, getString(R.string.ime_crashed_intent_selector_title));
sender.putExtra(Intent.EXTRA_EMAIL, sendMail.getStringArrayExtra(Intent.EXTRA_EMAIL));
sender.putExtra(Intent.EXTRA_SUBJECT, sendMail.getStringExtra(Intent.EXTRA_SUBJECT));
sender.putExtra(Intent.EXTRA_TEXT, mCrashReportDetails.crashReportText);
Log.i(TAG, "Will send crash report using " + sender);
startActivity(sender);
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(getApplicationContext(), "Unable to send bug report via e-mail!", Toast.LENGTH_LONG).show();
}
finish();
}
}