package com.github.andlyticsproject; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar.Tab; import android.app.Activity; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.MenuItem; import android.widget.Toast; import com.github.andlyticsproject.console.v2.DevConsoleRegistry; import com.github.andlyticsproject.console.v2.DevConsoleV2; import com.github.andlyticsproject.db.AndlyticsDb; import com.github.andlyticsproject.model.Comment; import com.github.andlyticsproject.util.DetachableAsyncTask; import com.github.andlyticsproject.util.Utils; public class DetailsActivity extends BaseActivity implements DetailedStatsActivity, CommentReplier, ChartSwitcher { private static final String TAG = DetailsActivity.class.getSimpleName(); public static final String EXTRA_CHART_SET = "com.github.andlyticsproject.chartset"; public static final String EXTRA_CHART_NAME = "com.github.andlyticsproject.chartname"; private static final String REPLY_DIALOG_FRAGMENT = "reply_dialog_fragment"; private static final String[] TAB_TAGS = { "comments_tab", "ratings_tab", "downloads_tab", "revenue_tab", "admob_tab" }; public static String EXTRA_SELECTED_TAB_IDX = "selectedTabIdx"; public static int TAB_IDX_COMMENTS = 0; public static int TAB_IDX_RATINGS = 1; public static int TAB_IDX_DOWNLOADS = 2; public static int TAB_IDX_REVENUE = 3; public static int TAB_IDX_ADMOB = 4; public static String EXTRA_HAS_REVENUE = "com.github.andlyticsproject.hasRevenue"; private String appName; private boolean hasRevenue; public static class TabListener<T extends StatsView<?>> implements ActionBar.TabListener { private Fragment fragment; private DetailsActivity activity; private String tag; private Class<T> clazz; public TabListener(DetailsActivity activity, String tag, Class<T> clz) { this.activity = activity; this.tag = tag; this.clazz = clz; fragment = activity.getSupportFragmentManager().findFragmentByTag(tag); } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { if (fragment == null) { fragment = Fragment.instantiate(activity, clazz.getName()); ft.add(android.R.id.content, fragment, tag); } else { ft.attach(fragment); } activity.getSupportActionBar().setTitle(((StatsView<?>) fragment).getTitle()); if (activity.appName != null) { activity.getSupportActionBar().setSubtitle(activity.appName); } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { if (fragment != null) { ft.detach(fragment); } } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } } @Override protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate()"); // FragmentManager.enableDebugLogging(true); super.onCreate(savedInstanceState); appName = getDbAdapter().getAppName(packageName); hasRevenue = getIntent().getBooleanExtra(EXTRA_HAS_REVENUE, true); ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); Tab tab = actionBar .newTab() .setText(R.string.comments) .setTabListener( new TabListener<CommentsFragment>(this, "comments_tab", CommentsFragment.class)); actionBar.addTab(tab); tab = actionBar .newTab() .setText(R.string.ratings) .setTabListener( new TabListener<RatingsFragment>(this, "ratings_tab", RatingsFragment.class)); actionBar.addTab(tab); tab = actionBar .newTab() .setText(R.string.downloads) .setTabListener( new TabListener<DownloadsFragment>(this, "downloads_tab", DownloadsFragment.class)); actionBar.addTab(tab); if (hasRevenue) { tab = actionBar .newTab() .setText(R.string.revenue) .setTabListener( new TabListener<RevenueFragment>(this, "revenue_tab", RevenueFragment.class)); actionBar.addTab(tab); } // Check if AdMob is configured for this app String[] admobDetails = AndlyticsDb.getInstance(this).getAdmobDetails(packageName); boolean admobConfigured = admobDetails != null; if (admobConfigured || !Preferences.getHideAdmobForUnconfiguredApps(this)) { tab = actionBar .newTab() .setText(R.string.admob) .setTabListener( new TabListener<AdmobFragment>(this, "admob_tab", AdmobFragment.class)); actionBar.addTab(tab); } int selectedTabIdx = getIntent().getExtras().getInt(EXTRA_SELECTED_TAB_IDX, 0); // FIXME This is a hack to select AdMob in the case that the revenue tab isn't enabled if (!hasRevenue && selectedTabIdx == TAB_IDX_ADMOB) { selectedTabIdx = TAB_IDX_REVENUE; } if (savedInstanceState != null) { selectedTabIdx = savedInstanceState.getInt(EXTRA_SELECTED_TAB_IDX, 0); } if (selectedTabIdx < actionBar.getTabCount()) { actionBar.setSelectedNavigationItem(selectedTabIdx); } else { actionBar.setSelectedNavigationItem(0); } } @Override public void setActionBarTitle(String title) { if (getSupportActionBar() != null) getSupportActionBar().setTitle(title); } @Override protected void onResume() { super.onResume(); } protected void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); state.putInt(EXTRA_SELECTED_TAB_IDX, getSupportActionBar().getSelectedNavigationIndex()); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: // XXX finish?! finish(); overridePendingTransition(R.anim.activity_prev_in, R.anim.activity_prev_out); return true; default: return super.onOptionsItemSelected(item); } } public void showReplyDialog(Comment comment) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager().findFragmentByTag(REPLY_DIALOG_FRAGMENT); if (prev != null) { ft.remove(prev); } ft.addToBackStack(null); ReplyDialog replyDialog = new ReplyDialog(); Bundle args = new Bundle(); args.putString(ReplyDialog.ARG_UNIQUE_ID, comment.getUniqueId()); args.putString(ReplyDialog.ARG_REPLY, comment.getReply() == null ? "" : comment.getReply() .getText()); replyDialog.setArguments(args); replyDialog.show(ft, REPLY_DIALOG_FRAGMENT); } public void hideReplyDialog() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment dialog = getSupportFragmentManager().findFragmentByTag(REPLY_DIALOG_FRAGMENT); if (dialog != null) { ft.remove(dialog); ft.commit(); } } public void replyToComment(final String commentUniqueId, final String replyText) { Utils.execute(new DetachableAsyncTask<Void, Void, Comment, DetailsActivity>(this) { Exception error; @Override protected void onPreExecute() { if (activity == null) { return; } activity.refreshStarted(); } @Override protected Comment doInBackground(Void... arg0) { if (activity == null) { return null; } try { DevConsoleV2 devConsole = DevConsoleRegistry.getInstance().get(accountName); return devConsole.replyToComment(DetailsActivity.this, packageName, developerId, commentUniqueId, replyText); } catch (Exception e) { error = e; return null; } } @Override protected void onPostExecute(Comment reply) { if (activity == null) { return; } activity.refreshFinished(); if (error != null) { Log.e(TAG, "Error replying to comment: " + error.getMessage(), error); activity.hideReplyDialog(); activity.handleUserVisibleException(error); return; } Toast.makeText(activity, R.string.reply_sent, Toast.LENGTH_LONG).show(); CommentsFragment commentsFargment = (CommentsFragment) getSupportFragmentManager() .findFragmentByTag("comments_tab"); if (commentsFargment != null) { commentsFargment.refreshComments(); } } }); } @Override public void setCurrentChart(int currentPage, int column) { String tabTag = TAB_TAGS[getSupportActionBar().getSelectedNavigationIndex()]; StatsView<?> chartFargment = (StatsView<?>) getSupportFragmentManager().findFragmentByTag( tabTag); if (chartFargment != null) { chartFargment.setCurrentChart(currentPage, column); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_GOOGLE_PLAY_SERVICES) { if (resultCode != Activity.RESULT_OK) { checkGooglePlayServicesAvailable(); } } else if (requestCode == REQUEST_AUTHORIZATION) { if (resultCode == Activity.RESULT_OK) { if (getSupportActionBar().getSelectedNavigationIndex() == TAB_IDX_ADMOB) { String tabTag = TAB_TAGS[getSupportActionBar().getSelectedNavigationIndex()]; AdmobFragment admobFragment = (AdmobFragment) getSupportFragmentManager() .findFragmentByTag(tabTag); admobFragment.loadAdUnits(); } } else { Toast.makeText(this, getString(R.string.account_authorization_denied, accountName), Toast.LENGTH_LONG).show(); } } } }