diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 96ec99b1..54bfe2d5 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -59,9 +59,6 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".activities.SettingsActivity" /> - - - @@ -69,6 +66,10 @@ android:name="android.support.UI_OPTIONS" android:value="splitActionBarWhenNarrow" /> + + + diff --git a/src/main/java/com/nutomic/syncthingandroid/activities/RestartActivity.java b/src/main/java/com/nutomic/syncthingandroid/activities/RestartActivity.java new file mode 100644 index 00000000..9843f4e7 --- /dev/null +++ b/src/main/java/com/nutomic/syncthingandroid/activities/RestartActivity.java @@ -0,0 +1,88 @@ +package com.nutomic.syncthingandroid.activities; + +import android.annotation.TargetApi; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.support.v4.app.NotificationCompat; +import android.support.v7.app.AppCompatActivity; + +import com.nutomic.syncthingandroid.BuildConfig; +import com.nutomic.syncthingandroid.R; +import com.nutomic.syncthingandroid.syncthing.SyncthingService; + +/** + * Shows restart dialog. + * + * The user can choose to restart Syncthing immediately. Otherwise, a restart notification is + * displayed. + */ +public class RestartActivity extends SyncthingActivity { + + public static final int NOTIFICATION_RESTART = 2; + + @Override + @TargetApi(11) + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Using `false` in style causes crash. + getSupportActionBar().hide(); + + final Intent intent = new Intent(this, SyncthingService.class) + .setAction(SyncthingService.ACTION_RESTART); + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setMessage(R.string.restart_title) + .setPositiveButton(R.string.restart_now, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + startService(intent); + finish(); + } + }) + .setNegativeButton(R.string.restart_later, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + createRestartNotification(); + finish(); + } + }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + createRestartNotification(); + finish(); + } + }) + .show(); + } + + /** + * Creates a notification prompting the user to restart the app. + */ + private void createRestartNotification() { + Intent intent = new Intent(this, SyncthingService.class) + .setAction(SyncthingService.ACTION_RESTART); + PendingIntent pi = PendingIntent.getService(this, 0, intent, 0); + + Notification n = new NotificationCompat.Builder(this) + .setContentTitle(getString(R.string.restart_title)) + .setContentText(getString(R.string.restart_notification_text)) + .setSmallIcon(R.drawable.ic_stat_notify) + .setContentIntent(pi) + .build(); + n.flags |= Notification.FLAG_ONLY_ALERT_ONCE | Notification.FLAG_AUTO_CANCEL; + NotificationManager nm = (NotificationManager) + getSystemService(Context.NOTIFICATION_SERVICE); + nm.notify(NOTIFICATION_RESTART, n); + getApi().setRestartPostponed(); + } + +} diff --git a/src/main/java/com/nutomic/syncthingandroid/fragments/DeviceSettingsFragment.java b/src/main/java/com/nutomic/syncthingandroid/fragments/DeviceSettingsFragment.java index 2f7150f7..274d70e3 100644 --- a/src/main/java/com/nutomic/syncthingandroid/fragments/DeviceSettingsFragment.java +++ b/src/main/java/com/nutomic/syncthingandroid/fragments/DeviceSettingsFragment.java @@ -202,6 +202,7 @@ public class DeviceSettingsFragment extends PreferenceFragment implements return true; } mSyncthingService.getApi().editDevice(mDevice, getActivity(), this); + getActivity().finish(); return true; case R.id.share_device_id: RestApi.shareDeviceId(getActivity(), mDevice.deviceID); diff --git a/src/main/java/com/nutomic/syncthingandroid/fragments/FolderSettingsFragment.java b/src/main/java/com/nutomic/syncthingandroid/fragments/FolderSettingsFragment.java index d8fd0ef7..226fc30d 100644 --- a/src/main/java/com/nutomic/syncthingandroid/fragments/FolderSettingsFragment.java +++ b/src/main/java/com/nutomic/syncthingandroid/fragments/FolderSettingsFragment.java @@ -215,6 +215,7 @@ public class FolderSettingsFragment extends PreferenceFragment return true; } mSyncthingService.getApi().editFolder(mFolder, true, getActivity()); + getActivity().finish(); return true; case R.id.delete: new AlertDialog.Builder(getActivity()) diff --git a/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java b/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java index e7c38a46..11b0a99f 100644 --- a/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java +++ b/src/main/java/com/nutomic/syncthingandroid/syncthing/RestApi.java @@ -3,21 +3,18 @@ package com.nutomic.syncthingandroid.syncthing; import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; -import android.app.Notification; import android.app.NotificationManager; -import android.app.PendingIntent; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.os.Build; -import android.support.v4.app.NotificationCompat; import android.util.Log; import android.widget.Toast; import com.nutomic.syncthingandroid.BuildConfig; import com.nutomic.syncthingandroid.R; +import com.nutomic.syncthingandroid.activities.RestartActivity; import com.nutomic.syncthingandroid.util.FolderObserver; import org.json.JSONArray; @@ -139,8 +136,6 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, public String invalid; } - private static final int NOTIFICATION_RESTART = 2; - private final Context mContext; private String mVersion; @@ -276,7 +271,7 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancel(NOTIFICATION_RESTART); + nm.cancel(RestartActivity.NOTIFICATION_RESTART); mRestartPostponed = false; } @@ -350,7 +345,6 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, * @param activity The calling activity. * @param updateConfig If true, {@link #mConfig} will be sent to `/rest/system/config`. */ - @TargetApi(11) public void requireRestart(Activity activity, boolean updateConfig) { if (updateConfig) { new PostTask(mHttpsCertPath) @@ -361,36 +355,14 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, if (mRestartPostponed) return; - final Intent intent = new Intent(mContext, SyncthingService.class) - .setAction(SyncthingService.ACTION_RESTART); - - new AlertDialog.Builder(activity) - .setMessage(R.string.restart_title) - .setPositiveButton(R.string.restart_now, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - mContext.startService(intent); - } - }) - .setNegativeButton(R.string.restart_later, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - createRestartNotification(); - } - }) - .setOnCancelListener(new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - createRestartNotification(); - } - }) - .show(); + activity.startActivity(new Intent(mContext, RestartActivity.class)); } /** * Reset Syncthing's indexes when confirmed by a dialog. + * + * TODO: why is this here and not in fragment? */ - @TargetApi(11) public void resetSyncthing(final Activity activity) { final Intent intent = new Intent(mContext, SyncthingService.class) .setAction(SyncthingService.ACTION_RESET); @@ -412,27 +384,6 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, .show(); } - /** - * Creates a notification prompting the user to restart the app. - */ - private void createRestartNotification() { - Intent intent = new Intent(mContext, SyncthingService.class) - .setAction(SyncthingService.ACTION_RESTART); - PendingIntent pi = PendingIntent.getService(mContext, 0, intent, 0); - - Notification n = new NotificationCompat.Builder(mContext) - .setContentTitle(mContext.getString(R.string.restart_title)) - .setContentText(mContext.getString(R.string.restart_notification_text)) - .setSmallIcon(R.drawable.ic_stat_notify) - .setContentIntent(pi) - .build(); - n.flags |= Notification.FLAG_ONLY_ALERT_ONCE | Notification.FLAG_AUTO_CANCEL; - NotificationManager nm = (NotificationManager) - mContext.getSystemService(Context.NOTIFICATION_SERVICE); - nm.notify(NOTIFICATION_RESTART, n); - mRestartPostponed = true; - } - /** * Returns a list of all existing devices. * @@ -1077,4 +1028,11 @@ public class RestApi implements SyncthingService.OnWebGuiAvailableListener, }.execute(mUrl, GetTask.URI_REPORT, mApiKey); } + /** + * Sets {@link #mRestartPostponed} to true. + */ + public void setRestartPostponed() { + mRestartPostponed = true; + } + } diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index f96197a7..098fbf8c 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -11,4 +11,12 @@ +