package com.seafile.seadroid2.ui.activity; import android.Manifest; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.IBinder; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.Window; import com.seafile.seadroid2.R; import com.seafile.seadroid2.SeafException; import com.seafile.seadroid2.account.Account; import com.seafile.seadroid2.data.DataManager; import com.seafile.seadroid2.data.SeafDirent; import com.seafile.seadroid2.transfer.TransferService; import com.seafile.seadroid2.ui.fragment.SettingsFragment; import com.seafile.seadroid2.util.Utils; import java.util.List; public class SettingsActivity extends BaseActivity implements Toolbar.OnMenuItemClickListener { private static final String DEBUG_TAG = "SettingsActivity"; private View mLayout; public TransferService txService; private SettingsFragment mSettingsFragment; public static final int REQUEST_PERMISSIONS_READ_CONTACTS = 2; public static String BASE_DIR = "Contacts Backup"; public void onCreate(Bundle savedInstanceState) { supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); super.onCreate(savedInstanceState); setContentView(R.layout.settings_activity_layout); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); mSettingsFragment = new SettingsFragment(); fragmentTransaction.add(R.id.settings_fragment_container, mSettingsFragment); fragmentTransaction.commit(); Toolbar toolbar = getActionBarToolbar(); setSupportActionBar(toolbar); toolbar.setOnMenuItemClickListener(this); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(R.string.settings); mLayout = findViewById(R.id.settings_fragment_container); Intent bIntent = new Intent(this, TransferService.class); bindService(bIntent, mConnection, Context.BIND_AUTO_CREATE); } @Override public boolean onMenuItemClick(MenuItem item) { return super.onOptionsItemSelected(item); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: this.finish(); default: return super.onOptionsItemSelected(item); } } public void uploadContacts(String path) { Account camAccount = mSettingsFragment.contactsManager.getContactsAccount(); if (camAccount != null && mSettingsFragment.settingsMgr.getContactsUploadRepoName() != null) { String repoName = mSettingsFragment.settingsMgr.getContactsUploadRepoName(); String repoId = mSettingsFragment.settingsMgr.getContactsUploadRepoId(); DataManager dataManager = new DataManager(camAccount); try { forceCreateDirectory(dataManager, "/", BASE_DIR, repoId); String serverPath = Utils.pathJoin(BASE_DIR, "/"); txService.addTaskToUploadQue(camAccount, repoId, repoName, serverPath, path, false, true); } catch (SeafException e) { showShortToast(this, e.getMessage()); showShortToast(this, getString(R.string.contacts_backup_fail)); e.printStackTrace(); } } } /** * Create a directory, rename a file away if necessary, * * @param dataManager * @param parent parent dir * @param dir directory to create * @throws SeafException */ private void forceCreateDirectory(DataManager dataManager, String parent, String dir, String targetRepoId) throws SeafException { List<SeafDirent> dirs = dataManager.getDirentsFromServer(targetRepoId, parent); boolean found = false; for (SeafDirent dirent : dirs) { if (dirent.name.equals(dir) && dirent.isDir()) { found = true; } else if (dirent.name.equals(dir) && !dirent.isDir()) { // there is already a file. move it away. String newFilename = getString(R.string.camera_sync_rename_file, dirent.name); dataManager.rename(targetRepoId, Utils.pathJoin(Utils.pathJoin("/", parent), dirent.name), newFilename, false); } } if (!found) dataManager.createNewDir(targetRepoId, Utils.pathJoin("/", parent), dir); } /** * If the user is running Android 6.0 (API level 23) or later, the user has to grant your app its permissions while they are running * the app * <p> * Requests the READ_CONTACTS permission. */ public void requestReadContactsPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)) { Snackbar.make(mLayout, R.string.permission_read_exteral_storage_rationale, Snackbar.LENGTH_INDEFINITE) .setAction(R.string.settings, new View.OnClickListener() { @Override public void onClick(View view) { ActivityCompat.requestPermissions(SettingsActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_PERMISSIONS_READ_CONTACTS); } }) .show(); } else { // No explanation needed, we can request the permission. // READ_CONTACTS permission has not been granted yet. Request it directly. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_PERMISSIONS_READ_CONTACTS); } } } ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { TransferService.TransferBinder binder = (TransferService.TransferBinder) service; txService = binder.getService(); Log.d(DEBUG_TAG, "bind TransferService"); } @Override public void onServiceDisconnected(ComponentName arg0) { txService = null; } }; @Override protected void onDestroy() { Log.d(DEBUG_TAG, "onDestroy is called"); if (txService != null) { unbindService(mConnection); txService = null; } super.onDestroy(); } }