package com.prateekj.snooper.networksnooper.activity; import android.Manifest; import android.app.ProgressDialog; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.design.widget.TabLayout.Tab; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.prateekj.snooper.R; import com.prateekj.snooper.formatter.ResponseFormatterFactory; import com.prateekj.snooper.infra.AppPermissionChecker; import com.prateekj.snooper.infra.BackgroundTaskExecutor; import com.prateekj.snooper.networksnooper.fragment.HttpCallFragment; import com.prateekj.snooper.networksnooper.fragment.HttpHeadersFragment; import com.prateekj.snooper.networksnooper.presenter.HttpCallPresenter; import com.prateekj.snooper.networksnooper.repo.SnooperRepo; import com.prateekj.snooper.networksnooper.views.HttpCallView; import com.prateekj.snooper.realm.RealmFactory; import com.prateekj.snooper.utils.FileUtil; import java.io.File; import static android.content.Intent.EXTRA_SUBJECT; public class HttpCallActivity extends SnooperBaseActivity implements HttpCallView { public static final String HTTP_CALL_ID = "HTTP_CALL_ID"; public static final String HTTP_CALL_MODE = "HTTP_CALL_MODE"; public static final int REQUEST_MODE = 1; public static final int RESPONSE_MODE = 2; public static final int WRITE_EXTERNAL_STORAGE_REQUEST_CODE = 1; private static final String LOGFILE_MIME_TYPE = "*/*"; private HttpCallPresenter httpCallPresenter; private ViewPager pager; private ProgressDialog progressDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_http_call_detail); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); int httpCallId = getIntent().getIntExtra(HTTP_CALL_ID, 0); FileUtil fileUtil = new FileUtil(); SnooperRepo repo = new SnooperRepo(RealmFactory.create(this)); BackgroundTaskExecutor backgroundTaskExecutor = new BackgroundTaskExecutor(this); httpCallPresenter = new HttpCallPresenter(httpCallId, repo, this, new ResponseFormatterFactory(), fileUtil, backgroundTaskExecutor); initializeProgressDialog(); setupUi(); } private void initializeProgressDialog() { progressDialog = new ProgressDialog(this); progressDialog.setCancelable(false); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setIndeterminate(true); progressDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.progress)); progressDialog.setMessage(getString(R.string.progress_wait_message)); progressDialog.show(); } private void setupUi() { pager = (ViewPager) findViewById(R.id.pager); TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); for (HttpCallTab tab : HttpCallTab.sortedValues()) { tabLayout.addTab(tabLayout.newTab().setText(tab.getTabTitle())); } tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); HttpCallPagerAdapter adapter = new HttpCallPagerAdapter(getSupportFragmentManager()); pager.setAdapter(adapter); pager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(Tab tab) { pager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(Tab tab) { } @Override public void onTabReselected(Tab tab) { } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.http_call_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.copy_menu) { httpCallPresenter.copyHttpCallBody(pager.getCurrentItem()); return true; } else if (item.getItemId() == R.id.share_menu) { shareHttpCallData(); } return super.onOptionsItemSelected(item); } @Override public void copyToClipboard(String data) { ClipboardManager clipboard = (ClipboardManager) this.getSystemService(CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("Copied", data); clipboard.setPrimaryClip(clip); } @Override public void shareData(String logFilePath) { Intent intent = new Intent(Intent.ACTION_SEND); File file = new File(logFilePath); Uri fileUri = Uri.fromFile(file); intent.setData(fileUri); intent.setType(LOGFILE_MIME_TYPE); intent.putExtra(EXTRA_SUBJECT, getString(R.string.mail_subject_share_logs)); intent.putExtra(Intent.EXTRA_STREAM, fileUri); Intent j = Intent.createChooser(intent, getString(R.string.chooser_title_share_logs)); startActivity(j); } @Override public void showMessageShareNotAvailable() { Toast.makeText(this, R.string.permission_not_granted, Toast.LENGTH_SHORT).show(); } @Override public void onHttpCallBodyFormatted(int mode) { httpCallPresenter.onHttpCallBodyFormatted(mode); } @Override public void dismissProgressDialog() { progressDialog.dismiss(); } private void shareHttpCallData() { appPermissionChecker.handlePermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE_REQUEST_CODE, new AppPermissionChecker.PermissionRequestCallBack() { @Override public void permissionGranted() { httpCallPresenter.shareHttpCallBody(); } @Override public void permissionDenied() { httpCallPresenter.onPermissionDenied(); } }); } private HttpCallFragment getResponseBodyFragment() { HttpCallFragment fragment = new HttpCallFragment(); Bundle extras = getIntent().getExtras(); extras.putInt(HTTP_CALL_MODE, RESPONSE_MODE); fragment.setArguments(extras); return fragment; } private HttpCallFragment getRequestBodyFragment() { HttpCallFragment fragment = new HttpCallFragment(); Bundle extras = getIntent().getExtras(); extras.putInt(HTTP_CALL_MODE, REQUEST_MODE); fragment.setArguments(extras); return fragment; } private HttpHeadersFragment getHeadersFragment() { HttpHeadersFragment fragment = new HttpHeadersFragment(); fragment.setArguments(getIntent().getExtras()); return fragment; } private class HttpCallPagerAdapter extends FragmentStatePagerAdapter { public HttpCallPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { if (position == 0) return getResponseBodyFragment(); if (position == 1) return getRequestBodyFragment(); return getHeadersFragment(); } @Override public int getCount() { return HttpCallTab.values().length; } } }