package org.goodev.droidddle.receiver; import android.app.AlarmManager; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.RemoteViews; import org.goodev.droidddle.R; import org.goodev.droidddle.UpActivity; import butterknife.ButterKnife; import butterknife.InjectView; /** * Created by goodev on 2015/1/22. */ public class ShotAppWidgetConfigure extends UpActivity implements AdapterView.OnItemClickListener { public static final String WIDGET_PREF_NAME = "widget_pref.xml"; public static final String KEY_REFRESH_TIME_PREFIX = "shots_refresh_"; public static final int REFRESH_MANUALLY = 0; public static final int REFRESH_5_MIN = 1; // @Override // public boolean onCreateOptionsMenu(Menu menu) { // // Inflate the menu; this adds items to the action bar if it is present. // getMenuInflater().inflate(R.menu.menu_widget, menu); // return true; // } public static final int REFRESH_15_MIN = 2; public static final int REFRESH_30_MIN = 3; public static final int REFRESH_1_HOUR = 4; public static final int REFRESH_DAILY = 5; int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; @InjectView(R.id.list_view) ListView mListView; public static SharedPreferences getPref(Context context) { return context.getSharedPreferences(WIDGET_PREF_NAME, Context.MODE_PRIVATE); } public static int getRefreshType(Context context, int id) { SharedPreferences preferences = getPref(context); return preferences.getInt(KEY_REFRESH_TIME_PREFIX + id, 0); } public static PendingIntent getRefreshIntent(Context context, int id) { Intent refreshIntent = new Intent(context, ShotAppWidgetProvider.class); refreshIntent.setAction(ShotAppWidgetProvider.REFRESH_ACTION); refreshIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id); refreshIntent.setData(Uri.parse(refreshIntent.toUri(Intent.URI_INTENT_SCHEME))); PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT); return alarmIntent; } public static void cancelRefreshAlarm(Context context, int id) { AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent alarmIntent = getRefreshIntent(context, id); alarmMgr.cancel(alarmIntent); } @Override protected void onMyCreate(Bundle savedInstanceState) { // 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); setContentView(R.layout.activity_shot_app_widget_config); ButterKnife.inject(this); String[] entries = getResources().getStringArray(R.array.refresh_entries); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, entries); mListView.setAdapter(adapter); mListView.setOnItemClickListener(this); Intent intent = getIntent(); Bundle extras = intent.getExtras(); if (extras != null) { mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } } void update() { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); RemoteViews views = new RemoteViews(getPackageName(), R.layout.shot_appwidget); appWidgetManager.updateAppWidget(mAppWidgetId, views); Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, resultValue); finish(); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_save) { update(); return true; } return super.onOptionsItemSelected(item); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { SharedPreferences preferences = getPref(this); preferences.edit().putInt(KEY_REFRESH_TIME_PREFIX + mAppWidgetId, position).commit(); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); ShotAppWidgetProvider.setupWidget(this, appWidgetManager, mAppWidgetId); Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, resultValue); // final Intent refreshIntent = new Intent(this, ShotAppWidgetProvider.class); // refreshIntent.setAction(ShotAppWidgetProvider.REFRESH_ACTION); // resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); // sendBroadcast(refreshIntent); setupNextRefresh(this, mAppWidgetId); finish(); } private void setupNextRefresh(Context context, int id) { int type = ShotAppWidgetConfigure.getRefreshType(context, id); //time in seconds long time = -1; switch (type) { case ShotAppWidgetConfigure.REFRESH_MANUALLY: break; case ShotAppWidgetConfigure.REFRESH_5_MIN: time = 5 * 60; break; case ShotAppWidgetConfigure.REFRESH_15_MIN: time = 15 * 60; break; case ShotAppWidgetConfigure.REFRESH_30_MIN: time = 30 * 60; break; case ShotAppWidgetConfigure.REFRESH_1_HOUR: time = 60 * 60; break; case ShotAppWidgetConfigure.REFRESH_DAILY: time = 60 * 60 * 24; break; } if (time == -1) { return; } AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PendingIntent alarmIntent = getRefreshIntent(context, id); alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 2000, time * 1000, alarmIntent); } }