fix widget not working correctly after device reboot

This commit is contained in:
Andrew Dolgov 2015-02-13 14:09:26 +03:00
parent f3a3b021dd
commit 697586c3a9
5 changed files with 153 additions and 174 deletions

View File

@ -219,6 +219,7 @@
<intent-filter> <intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="org.fox.ttrss.WIDGET_FORCE_UPDATE" /> <action android:name="org.fox.ttrss.WIDGET_FORCE_UPDATE" />
<action android:name="org.fox.ttrss.WIDGET_UPDATE_RESULT" />
</intent-filter> </intent-filter>
<meta-data <meta-data

View File

@ -314,7 +314,7 @@ public class OnlineActivity extends CommonActivity {
public void onStop() { public void onStop() {
super.onStop(); super.onStop();
Intent initialUpdateIntent = new Intent(SmallWidgetProvider.FORCE_UPDATE_ACTION); Intent initialUpdateIntent = new Intent(SmallWidgetProvider.ACTION_REQUEST_UPDATE);
sendBroadcast(initialUpdateIntent); sendBroadcast(initialUpdateIntent);
} }

View File

@ -15,90 +15,75 @@ import org.fox.ttrss.R;
public class SmallWidgetProvider extends AppWidgetProvider { public class SmallWidgetProvider extends AppWidgetProvider {
private final String TAG = this.getClass().getSimpleName(); private final String TAG = this.getClass().getSimpleName();
public static final String FORCE_UPDATE_ACTION = "org.fox.ttrss.WIDGET_FORCE_UPDATE"; public static final String ACTION_REQUEST_UPDATE = "org.fox.ttrss.WIDGET_FORCE_UPDATE";
public static final String ACTION_UPDATE_RESULT = "org.fox.ttrss.WIDGET_UPDATE_RESULT";
@Override @Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.d(TAG, "onUpdate"); Log.d(TAG, "onUpdate");
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(context, OnlineActivity.class); Intent intent = new Intent(context, OnlineActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener
// to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_small);
views.setOnClickPendingIntent(R.id.widget_main, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
/* Intent updateIntent = new Intent(context, org.fox.ttrss.widget.WidgetUpdateService.class);
PendingIntent updatePendingIntent = PendingIntent.getService(context, 0, updateIntent, 0);
Intent intent = new Intent(context, org.fox.ttrss.OnlineActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_small); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_small);
views.setOnClickPendingIntent(R.id.widget_main, pendingIntent); views.setOnClickPendingIntent(R.id.widget_main, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds, views); appWidgetManager.updateAppWidget(appWidgetIds, views);
try { Intent serviceIntent = new Intent(context.getApplicationContext(), WidgetUpdateService.class);
updatePendingIntent.send(); context.startService(serviceIntent);
} catch (CanceledException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} */
//RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_small);
/* final int N = appWidgetIds.length;
for (int i=0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Intent updateIntent = new Intent(context, org.fox.ttrss.widget.WidgetUpdateService.class);
PendingIntent updatePendingIntent = PendingIntent.getService(context, 0, updateIntent, 0);
Intent intent = new Intent(context, org.fox.ttrss.OnlineActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_small);
views.setOnClickPendingIntent(R.id.widget_main, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
try {
updatePendingIntent.send();
} catch (CanceledException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} */
} }
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.d(TAG, "onReceive"); Log.d(TAG, "onReceive");
if (FORCE_UPDATE_ACTION.equals(intent.getAction())) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), SmallWidgetProvider.class.getName()); ComponentName thisAppWidget = new ComponentName(context.getPackageName(), SmallWidgetProvider.class.getName());
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
if (ACTION_REQUEST_UPDATE.equals(intent.getAction())) {
Log.d(TAG, "onReceive: got update request");
onUpdate(context, appWidgetManager, appWidgetIds); onUpdate(context, appWidgetManager, appWidgetIds);
} else if (ACTION_UPDATE_RESULT.equals(intent.getAction())) {
int unread = intent.getIntExtra("unread", -1);
int resultCode = intent.getIntExtra("resultCode", WidgetUpdateService.UPDATE_RESULT_ERROR_OTHER);
Log.d(TAG, "onReceive: got update result from service: " + unread + " " + resultCode);
updateWidgetsText(context, appWidgetManager, appWidgetIds, unread, resultCode);
} else {
super.onReceive(context, intent);
} }
} }
private void updateWidgetsText(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, int unread, int resultCode) {
Intent intent = new Intent(context, OnlineActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_small);
views.setOnClickPendingIntent(R.id.widget_main, pendingIntent);
String viewText;
switch (resultCode) {
case WidgetUpdateService.UPDATE_RESULT_OK:
viewText = String.valueOf(unread);
break;
case WidgetUpdateService.UPDATE_IN_PROGRESS:
viewText = "...";
break;
default:
viewText = "?";
}
views.setTextViewText(R.id.widget_unread_counter, viewText);
appWidgetManager.updateAppWidget(appWidgetIds, views);
}
} }

View File

@ -1,65 +1,50 @@
package org.fox.ttrss.widget; package org.fox.ttrss.widget;
import android.app.Service; import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.IBinder; import android.os.IBinder;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.util.Log; import android.util.Log;
import android.widget.RemoteViews;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import org.fox.ttrss.ApiRequest; import org.fox.ttrss.ApiRequest;
import org.fox.ttrss.R;
import org.fox.ttrss.util.SimpleLoginManager; import org.fox.ttrss.util.SimpleLoginManager;
import java.util.HashMap; import java.util.HashMap;
public class WidgetUpdateService extends Service { public class WidgetUpdateService extends Service {
private final String TAG = this.getClass().getSimpleName(); private final String TAG = this.getClass().getSimpleName();
private SharedPreferences m_prefs;
public static final int UPDATE_RESULT_OK = 0;
public static final int UPDATE_RESULT_ERROR_LOGIN = 1;
public static final int UPDATE_RESULT_ERROR_OTHER = 2;
public static final int UPDATE_RESULT_ERROR_NEED_CONF = 3;
public static final int UPDATE_IN_PROGRESS = 4;
@Override @Override
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind"); Log.d(TAG, "onBind");
// TODO Auto-generated method stub
return null; return null;
} }
/* @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
} */
public void update() {
}
@Override @Override
public void onStart(Intent intent, int startId) { public void onStart(Intent intent, int startId) {
final RemoteViews view = new RemoteViews(getPackageName(), R.layout.widget_small); Log.d(TAG, "onStart");
final ComponentName thisWidget = new ComponentName(this, SmallWidgetProvider.class);
final AppWidgetManager manager = AppWidgetManager.getInstance(this);
try { try {
view.setTextViewText(R.id.counter, String.valueOf("...")); sendResultIntent(-1, UPDATE_IN_PROGRESS);
manager.updateAppWidget(thisWidget, view); m_prefs = PreferenceManager
final SharedPreferences m_prefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext()); .getDefaultSharedPreferences(getApplicationContext());
if (m_prefs.getString("ttrss_url", "").trim().length() == 0) { if (m_prefs.getString("ttrss_url", "").trim().length() == 0) {
// Toast: need configure sendResultIntent(-1, UPDATE_RESULT_ERROR_NEED_CONF);
} else { } else {
@ -79,9 +64,7 @@ public class WidgetUpdateService extends Service {
if (content != null) { if (content != null) {
int unread = content.get("unread").getAsInt(); int unread = content.get("unread").getAsInt();
sendResultIntent(unread, UPDATE_RESULT_OK);
view.setTextViewText(R.id.counter, String.valueOf(unread));
manager.updateAppWidget(thisWidget, view);
return; return;
} }
@ -90,8 +73,7 @@ public class WidgetUpdateService extends Service {
} }
} }
view.setTextViewText(R.id.counter, "?"); sendResultIntent(-1, UPDATE_RESULT_ERROR_OTHER);
manager.updateAppWidget(thisWidget, view);
} }
}; };
@ -110,9 +92,7 @@ public class WidgetUpdateService extends Service {
@Override @Override
protected void onLoginFailed(int requestId, ApiRequest ar) { protected void onLoginFailed(int requestId, ApiRequest ar) {
sendResultIntent(-1, UPDATE_RESULT_ERROR_LOGIN);
view.setTextViewText(R.id.counter, "?");
manager.updateAppWidget(thisWidget, view);
} }
@Override @Override
@ -130,9 +110,22 @@ public class WidgetUpdateService extends Service {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
view.setTextViewText(R.id.counter, "?"); sendResultIntent(-1, UPDATE_RESULT_ERROR_OTHER);
manager.updateAppWidget(thisWidget, view); }
} stopSelf();
super.onStart(intent, startId);
}
public void sendResultIntent(int unread, int resultCode) {
Intent intent = new Intent();
intent.setAction(SmallWidgetProvider.ACTION_UPDATE_RESULT);
intent.putExtra("resultCode", resultCode);
intent.putExtra("unread", unread);
sendBroadcast(intent);
if (resultCode != UPDATE_IN_PROGRESS) stopSelf();
} }
} }

4
org.fox.ttrss/src/main/res/layout/widget_small.xml Normal file → Executable file
View File

@ -19,13 +19,13 @@
android:src="@drawable/ic_launcher" /> android:src="@drawable/ic_launcher" />
<TextView <TextView
android:id="@+id/counter" android:id="@+id/widget_unread_counter"
android:layout_weight="0" android:layout_weight="0"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|center" android:layout_gravity="bottom|center"
android:gravity="center_horizontal" android:gravity="center_horizontal"
android:text="\?" android:text=""
android:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="@android:color/primary_text_dark" android:textColor="@android:color/primary_text_dark"
android:textSize="13sp" /> android:textSize="13sp" />