package com.kickstarter.ui.activities; import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.text.TextUtils; import android.util.Pair; import android.view.View; import android.webkit.URLUtil; import android.widget.EditText; import android.widget.TextView; import com.jakewharton.processphoenix.ProcessPhoenix; import com.kickstarter.KSApplication; import com.kickstarter.R; import com.kickstarter.libs.ApiEndpoint; import com.kickstarter.libs.BaseActivity; import com.kickstarter.libs.Build; import com.kickstarter.libs.CurrentUserType; import com.kickstarter.libs.Logout; import com.kickstarter.libs.preferences.StringPreferenceType; import com.kickstarter.libs.qualifiers.ApiEndpointPreference; import com.kickstarter.libs.qualifiers.RequiresActivityViewModel; import com.kickstarter.libs.utils.Secrets; import com.kickstarter.models.User; import com.kickstarter.ui.viewmodels.InternalToolsViewModel; import org.joda.time.format.DateTimeFormat; import java.util.Arrays; import java.util.List; import java.util.Locale; import javax.inject.Inject; import butterknife.Bind; import butterknife.BindDrawable; import butterknife.ButterKnife; import butterknife.OnClick; import static com.kickstarter.libs.utils.TransitionUtils.slideInFromLeft; @RequiresActivityViewModel(InternalToolsViewModel.class) public final class InternalToolsActivity extends BaseActivity<InternalToolsViewModel> { @Inject @ApiEndpointPreference StringPreferenceType apiEndpointPreference; @Inject Build build; @Inject CurrentUserType currentUser; @Inject Logout logout; @Bind(R.id.build_date) TextView buildDate; @Bind(R.id.sha) TextView sha; @Bind(R.id.variant) TextView variant; @Bind(R.id.version_code) TextView versionCode; @Bind(R.id.version_name) TextView versionName; @BindDrawable(android.R.drawable.ic_dialog_alert) Drawable icDialogAlertDrawable; @Override protected void onCreate(final @Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.internal_tools_layout); ButterKnife.bind(this); ((KSApplication) getApplicationContext()).component().inject(this); setupBuildInformationSection(); } @OnClick(R.id.push_notifications_button) public void pushNotificationsButtonClick() { final View view = View.inflate(this, R.layout.debug_push_notifications_layout, null); new AlertDialog.Builder(this) .setTitle("Push notifications") .setView(view) .show(); } @OnClick(R.id.change_endpoint_custom_button) public void changeEndpointCustomButton() { showCustomEndpointDialog(); } @OnClick(R.id.change_endpoint_hivequeen_button) public void changeEndpointHivequeenButton() { showHivequeenEndpointDialog(); } @OnClick(R.id.change_endpoint_staging_button) public void changeEndpointStagingButton() { setEndpointAndRelaunch(ApiEndpoint.STAGING); } @OnClick(R.id.change_endpoint_production_button) public void changeEndpointProductionButton() { setEndpointAndRelaunch(ApiEndpoint.PRODUCTION); } @OnClick(R.id.submit_bug_report_button) public void submitBugReportButtonClick() { currentUser.observable().take(1).subscribe(this::submitBugReport); } private void submitBugReport(final @Nullable User user) { final String email = Secrets.FIELD_REPORT_EMAIL; final List<String> debugInfo = Arrays.asList( user != null ? user.name() : "Logged Out", build.variant(), build.versionName(), build.versionCode().toString(), build.sha(), Integer.toString(android.os.Build.VERSION.SDK_INT), android.os.Build.MANUFACTURER + " " + android.os.Build.MODEL, Locale.getDefault().getLanguage() ); final String body = new StringBuilder() .append(TextUtils.join(" | ", debugInfo)) .append("\r\n\r\nDescribe the bug and add a subject. Attach images if it helps!\r\n") .append("—————————————\r\n") .toString(); final Intent intent = new Intent(android.content.Intent.ACTION_SEND) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) .setType("message/rfc822") .putExtra(Intent.EXTRA_TEXT, body) .putExtra(Intent.EXTRA_EMAIL, new String[]{email}); startActivity(Intent.createChooser(intent, getString(R.string.Select_email_application))); } private void showCustomEndpointDialog() { final View view = View.inflate(this, R.layout.custom_endpoint_layout, null); final EditText customEndpointEditText = ButterKnife.findById(view, R.id.custom_endpoint_edit_text); new AlertDialog.Builder(this) .setTitle("Change endpoint") .setView(view) .setPositiveButton(android.R.string.yes, (dialog, which) -> { final String url = customEndpointEditText.getText().toString(); if (URLUtil.isValidUrl(url)) { setEndpointAndRelaunch(ApiEndpoint.from(url)); } }) .setNegativeButton(android.R.string.cancel, (dialog, which) -> { dialog.cancel(); }) .setIcon(icDialogAlertDrawable) .show(); } private void showHivequeenEndpointDialog() { final View view = View.inflate(this, R.layout.hivequeen_endpoint_layout, null); final EditText hivequeenNameEditText = ButterKnife.findById(view, R.id.hivequeen_name_edit_text); new AlertDialog.Builder(this) .setTitle("Change endpoint") .setView(view) .setPositiveButton(android.R.string.yes, (dialog, which) -> { final String hivequeenName = hivequeenNameEditText.getText().toString(); if (hivequeenName.length() > 0) { setEndpointAndRelaunch(ApiEndpoint.from(Secrets.Api.Endpoint.hqHost(hivequeenName))); } }) .setNegativeButton(android.R.string.cancel, (dialog, which) -> { dialog.cancel(); }) .setIcon(icDialogAlertDrawable) .show(); } @SuppressLint("SetTextI18n") private void setupBuildInformationSection() { buildDate.setText(build.dateTime().toString(DateTimeFormat.forPattern("yyyy-MM-dd hh:mm:ss aa zzz"))); sha.setText(build.sha()); variant.setText(build.variant()); versionCode.setText(build.versionCode().toString()); versionName.setText(build.versionName()); } private void setEndpointAndRelaunch(final @NonNull ApiEndpoint apiEndpoint) { apiEndpointPreference.set(apiEndpoint.url()); logout.execute(); ProcessPhoenix.triggerRebirth(this); } protected @Nullable Pair<Integer, Integer> exitTransition() { return slideInFromLeft(); } }