/* * Copyright (c) 2015 OpenSilk Productions LLC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package syncthing.android.ui; import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; import org.opensilk.common.ui.mortar.ActivityResultsActivity; import org.opensilk.common.ui.mortar.ActivityResultsOwner; import org.opensilk.common.ui.mortar.DialogFactory; import org.opensilk.common.ui.mortar.DialogPresenter; import org.opensilk.common.ui.mortar.DialogPresenterActivity; import org.opensilk.common.ui.mortar.ToolbarOwner; import org.opensilk.common.ui.mortar.ToolbarOwnerDelegate; import org.opensilk.common.ui.mortarfragment.MortarFragmentActivity; import javax.inject.Inject; import syncthing.android.settings.AppSettings; import syncthing.android.R; import syncthing.android.service.SyncthingUtils; import timber.log.Timber; /** * Created by drew on 10/16/15. */ public abstract class SyncthingActivity extends MortarFragmentActivity implements ActivityResultsActivity, ToolbarOwnerDelegate.Callback, DialogPresenterActivity { @Inject ToolbarOwner mActionBarOwner; @Inject AppSettings mSettings; @Inject ActivityResultsOwner mActivityResultsOwner; @Inject DialogPresenter mDialogPresenter; protected ToolbarOwnerDelegate<SyncthingActivity> mActionBarOwnerDelegate; private Dialog mActiveDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mActivityResultsOwner.takeView(this); mDialogPresenter.takeView(this); } @Override protected void onDestroy() { super.onDestroy(); mActivityResultsOwner.dropView(this); mActionBarOwnerDelegate.onDestroy(); mDialogPresenter.dropView(this); dismissDialog(); } @Override protected void onStart() { Timber.d("-> onStart()"); super.onStart(); SyncthingUtils.notifyForegroundStateChanged(this, true); if (mSettings.keepScreenOn()) { subscribeChargingState(); } Timber.d("<- onStart()"); } @Override protected void onStop() { Timber.d("-> onStop"); super.onStop(); SyncthingUtils.notifyForegroundStateChanged(this, false); unsubscribeChargingState(); Timber.d("<- onStop"); } @Override public boolean onCreateOptionsMenu(Menu menu) { return mActionBarOwnerDelegate.onCreateOptionsMenu(menu) || super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { return mActionBarOwnerDelegate.onOptionsItemSelected(item) || super.onOptionsItemSelected(item); } /* * ActivityResultsOwverActivity */ @Override public void setResultAndFinish(int resultCode, Intent data) { setResult(resultCode, data); finish(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (!mActivityResultsOwner.onActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); } } /* * Toolbar */ @Override public void onToolbarAttached(Toolbar toolbar) { } @Override public void onToolbarDetached(Toolbar toolbar) { } /* * FragmentManagerOwner.Activity */ @Override public int getContainerViewId() { return R.id.main; } /* * DialogActivity */ @Override public void showDialog(DialogFactory factory) { dismissDialog(); mActiveDialog = factory.call(this); mActiveDialog.show(); } @Override public void dismissDialog() { if (mActiveDialog != null) { mActiveDialog.dismiss(); mActiveDialog = null; } } /* * Battery */ final BroadcastReceiver mChargingReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int status = intent != null ? intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) : 0; Timber.d("received BATTERY_CHANGED plugged=%s", status != 0); if (mSettings.keepScreenOn() && status != 0) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } }; void subscribeChargingState() { IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); registerReceiver(mChargingReceiver, filter); } void unsubscribeChargingState() { try { unregisterReceiver(mChargingReceiver); } catch (Exception e) {//i think its illegal state but cant remember (and dont care) //pass } } }