diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/stats/StatsWidgetConfigureActivity.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/stats/StatsWidgetConfigureActivity.java | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsWidgetConfigureActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsWidgetConfigureActivity.java new file mode 100644 index 000000000..cdef4f32a --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsWidgetConfigureActivity.java @@ -0,0 +1,161 @@ +package org.wordpress.android.ui.stats; + +/** + * The configuration screen for the StatsWidgetProvider widget. + */ + +import android.appwidget.AppWidgetManager; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.MenuItem; +import android.view.View; +import android.widget.Toast; + +import org.wordpress.android.R; +import org.wordpress.android.WordPress; +import org.wordpress.android.models.AccountHelper; +import org.wordpress.android.models.Blog; +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.ToastUtils; + +import java.util.List; +import java.util.Map; + +public class StatsWidgetConfigureActivity extends AppCompatActivity + implements StatsWidgetConfigureAdapter.OnSiteClickListener { + + private StatsWidgetConfigureAdapter mAdapter; + private RecyclerView mRecycleView; + private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Find the widget id from the intent. + Intent intent = getIntent(); + Bundle extras = intent.getExtras(); + if (extras != null) { + mAppWidgetId = extras.getInt( + AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + } + + // Set the result to CANCELED. This will cause the widget host to cancel out of the widget + // placement if they press the back button. + setResult(RESULT_CANCELED, new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId)); + + // Intent without the widget id, just bail. + if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { + finish(); + return; + } + + // If not signed into WordPress inform the user + if (!AccountHelper.isSignedIn()) { + ToastUtils.showToast(getBaseContext(), R.string.stats_widget_error_no_account, ToastUtils.Duration.LONG); + finish(); + return; + } + + // If no visible blogs + List<Map<String, Object>> accounts = WordPress.wpDB.getBlogsBy("isHidden = 0", null); + if (accounts.size() == 0) { + ToastUtils.showToast(getBaseContext(), R.string.stats_widget_error_no_visible_blog, ToastUtils.Duration.LONG); + finish(); + return; + } + + // If one blog only, skip config + if (accounts.size() == 1) { + Map<String, Object> account = accounts.get(0); + Integer localID = (Integer) account.get("id"); + addWidgetToScreenAndFinish(localID); + return; + } + + setContentView(R.layout.stats_widget_config_activity); + setNewAdapter(); + setupActionBar(); + setupRecycleView(); + } + + @Override + public boolean onOptionsItemSelected(final MenuItem item) { + int itemId = item.getItemId(); + if (itemId == android.R.id.home) { + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + private void setupRecycleView() { + mRecycleView = (RecyclerView) findViewById(R.id.recycler_view); + mRecycleView.setLayoutManager(new LinearLayoutManager(this)); + mRecycleView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); + mRecycleView.setItemAnimator(null); + mRecycleView.setAdapter(getAdapter()); + } + + private void setupActionBar() { + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + actionBar.setHomeButtonEnabled(false); + actionBar.setDisplayHomeAsUpEnabled(true); + } + } + + private StatsWidgetConfigureAdapter getAdapter() { + if (mAdapter == null) { + setNewAdapter(); + } + return mAdapter; + } + + private void setNewAdapter() { + Blog blog = WordPress.getCurrentBlog(); + int localBlogId = (blog != null ? blog.getLocalTableBlogId() : 0); + mAdapter = new StatsWidgetConfigureAdapter(this, localBlogId); + mAdapter.setOnSiteClickListener(this); + } + + @Override + public void onSiteClick(StatsWidgetConfigureAdapter.SiteRecord site) { + addWidgetToScreenAndFinish(site.localId); + } + + private void addWidgetToScreenAndFinish(int localID) { + final Blog currentBlog = WordPress.getBlog(localID); + + if (currentBlog == null) { + AppLog.e(AppLog.T.STATS, "The blog with local_blog_id " + localID + " cannot be loaded from the DB."); + Toast.makeText(this, R.string.stats_no_blog, Toast.LENGTH_LONG).show(); + finish(); + return; + } + + if (currentBlog.getDotComBlogId() == null) { + // The blog could be a self-hosted blog with NO Jetpack installed on it + // Or a Jetpack blog whose options are not yet synched in the app + // In both of these cases show a generic message that encourages the user to refresh + // the blog within the app. There are so many different paths here that's better to handle them in the app. + Toast.makeText(this, R.string.stats_widget_error_jetpack_no_blogid, Toast.LENGTH_LONG).show(); + finish(); + return; + } + + final Context context = StatsWidgetConfigureActivity.this; + StatsWidgetProvider.setupNewWidget(context, mAppWidgetId, localID); + // Make sure we pass back the original appWidgetId + Intent resultValue = new Intent(); + resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); + setResult(RESULT_OK, resultValue); + finish(); + } +} |