package typical_if.android; import android.app.AlarmManager; import android.app.AlertDialog; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.os.IBinder; import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; import android.util.Log; import com.vk.sdk.VKAccessToken; import com.vk.sdk.VKCaptchaDialog; import com.vk.sdk.VKSdk; import com.vk.sdk.VKSdkListener; import com.vk.sdk.api.VKError; import com.vk.sdk.api.model.VKApiPost; import org.json.JSONObject; import java.util.ArrayList; import java.util.Calendar; import typical_if.android.activity.MainActivity; import typical_if.android.model.Wall.VKWallPostWrapper; import typical_if.android.model.Wall.Wall; public class NotificationService extends Service { private long mInterval; private int offsetDefault = 0; private int countOfPosts = 1; private int extended = 1; AlarmManager alarmManager; private final static int ONE_HOUR_MILLISECONDS = 60 * 60 * 1000; private Wall wall; private final static int ONE_DAY_MILLISECONDS = 24 * 60 * 60 * 1000; @Override public void onCreate() { super.onCreate(); // Log.d("onCreateService", "----------------------"); alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE); VKSdk.initialize(sdkListener, Constants.APP_ID, VKAccessToken.tokenFromSharedPreferences(this, Constants.TIF_VK_API_KEY_TOKEN)); } public int onStartCommand(Intent intent, int flags, int startId) { if (OfflineMode.getIsFirstRunStartCommand()){ OfflineMode.setNotFirstRunStartCommand(); offsetDefault = 0; countOfPosts = 100; extended = 1; makeRequestsForAllPosts(extended, offsetDefault, countOfPosts); } // Log.d("onStartCommand", "----------------------"); try { if (intent.getAction().equals(Constants.ACTION_BOOT_COMPLETED)) { makeRequests(extended, offsetDefault, countOfPosts); // Log.d("ACTION_BOOT_COMPLETED", "-----------"); } if (intent.getAction().equals(Constants.ACTION_START_FROM_SPLASH_ACTIVITY)) { makeRequests(extended, offsetDefault, countOfPosts); // Log.d("ACTION_START_FROM_SPLASH_ACTIVITY", "-----------"); } if (intent.getAction().equals(Constants.ACTION_FIRST_RUN)) { makeRequests(extended, offsetDefault, countOfPosts); // Log.d("ACTION_FIRST_RUN", "-----------"); } if (intent.getAction().equals(Constants.REPEAT_ACTION)) { makeRequests(extended, offsetDefault, countOfPosts); // Log.d("REPEAT_ACTION", "-----------"); } } catch (NullPointerException NPE) { //TODO make action 3 (restart Service) // Log.d("restart", "-----------"); } return START_STICKY; } private void makeRequests(int extended, int offsetDefault, int countOfPosts) { VKHelper.doGroupWallRequest(extended, offsetDefault, countOfPosts, Constants.ZF_ID, new VKRequestListener() { @Override public void onSuccess() { handleRequestComplete(vkJson); // Log.d("Make", "Request"); } // @Override // public void onError(final VKError error) { // super.onError(error); // } }); } private void makeRequestsForAllPosts(int extended, int offsetDefault, int countOfPosts) { VKHelper.doGroupWallRequest(extended, offsetDefault, countOfPosts, Constants.ZF_ID, new VKRequestListener() { @Override public void onSuccess() { OfflineMode.saveJSON(Constants.ZF_ID, vkJson); } // // @Override // public void onError(final VKError error) { // super.onError(error); // } }); } private void handleRequestComplete(final JSONObject json) { parseJson(json); } private void parseJson(JSONObject newPostJson) { wall = VKHelper.getGroupWallFromJSON(newPostJson); ArrayList<VKWallPostWrapper> posts; posts = wall.posts; VKWallPostWrapper postW = posts.get(0); VKApiPost post = postW.post; if (ItemDataSetter.checkNewPostResult(post.date)) { setAlarm(true); } else { setAlarm(false); } } Intent intentForSchedule; PendingIntent pendingIntent; private void setAlarm(boolean isNewPost) { if (isNewPost) { OfflineMode.saveInt(Calendar.getInstance().get(Calendar.DATE), Constants.DATE_OF_NOTIF_SEND); final long currentTime = System.currentTimeMillis(); final long tomorrowTime = currentTime - (currentTime % ONE_DAY_MILLISECONDS) + ONE_DAY_MILLISECONDS + ONE_HOUR_MILLISECONDS * 8; mInterval = tomorrowTime - currentTime; sendNotif(); intentForSchedule = createIntent(Constants.SCHEDULE_FOR_EIGHT_HOUR); pendingIntent = PendingIntent.getBroadcast(TIFApp.getAppContext(), 0, intentForSchedule, 0); alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + mInterval, pendingIntent); Log.d("intervalForNextServiceStart ", " to 8 hours " + mInterval); stopSelf(); } else { mInterval = 60 * 60 * 1000; intentForSchedule = createIntent(Constants.SCHEDULE_FOR_ONE_HOUR); pendingIntent = PendingIntent.getBroadcast(TIFApp.getAppContext(), 0, intentForSchedule, 0); alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + mInterval, pendingIntent); Log.d("intervalForNextServiceStart ", " for 1 hour " + mInterval); stopSelf(); } } Intent createIntent( String action) { Intent intent = new Intent(this, NotificationReceiver.class); intent.setAction(action); return intent; } private void sendNotif() { NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_zf_mdpi) .setContentTitle("Події Франківська") .setContentText("Додай найцікавіше в календар") .setAutoCancel(true) .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); Intent resultIntent = new Intent(this, MainActivity.class); resultIntent.putExtra("isClickable", true); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(MainActivity.class); stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_CANCEL_CURRENT); mBuilder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(1, mBuilder.build()); } private final VKSdkListener sdkListener = new VKSdkListener() { @Override public void onCaptchaError(VKError captchaError) { new VKCaptchaDialog(captchaError).show(); } @Override public void onTokenExpired(VKAccessToken expiredToken) { VKSdk.authorize(Constants.S_MY_SCOPE); } @Override public void onAccessDenied(final VKError authorizationError) { new AlertDialog.Builder(NotificationService.this) .setMessage(authorizationError.toString()) .show(); } @Override public void onReceiveNewToken(VKAccessToken newToken) { } @Override public void onAcceptUserToken(VKAccessToken token) { } }; @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. return null; } }